From 3178743ba7137acca404e8ee103f0d9affa8b086 Mon Sep 17 00:00:00 2001 From: zhousq_java Date: Fri, 18 Oct 2024 17:34:59 +0800 Subject: [PATCH] =?UTF-8?q?2024-10-18=20=E6=A1=86=E6=9E=B6=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 53 + LICENSE | 20 + README.md | 364 + lombok.config | 4 + pom.xml | 171 + script/docker/Docker-HOWTO.md | 49 + script/docker/docker-compose.yml | 84 + script/docker/docker.env | 25 + script/idea/http-client.env.json | 20 + script/jenkins/Jenkinsfile | 60 + script/shell/deploy.sh | 160 + sql/db2/README.md | 3 + sql/dm/quartz.sql | 179 + sql/dm/ruoyi-vue-pro-dm8.sql | 4404 ++++++ sql/kingbase/quartz.sql | 170 + sql/kingbase/ruoyi-vue-pro.sql | 4723 +++++++ sql/mysql/quartz.sql | 284 + sql/mysql/ruoyi-vue-pro.sql | 3754 +++++ sql/opengauss/quartz.sql | 253 + sql/opengauss/ruoyi-vue-pro.sql | 4723 +++++++ sql/oracle/quartz.sql | 845 ++ sql/oracle/ruoyi-vue-pro.sql | 4582 +++++++ sql/postgresql/quartz.sql | 253 + sql/postgresql/ruoyi-vue-pro.sql | 4723 +++++++ sql/sqlserver/quartz.sql | 533 + sql/sqlserver/ruoyi-vue-pro.sql | 11310 ++++++++++++++++ sql/tools/.gitignore | 8 + sql/tools/README.md | 130 + sql/tools/convertor.py | 844 ++ sql/tools/docker-compose.yaml | 134 + sql/tools/oracle/1_create_user.sql | 3 + sql/tools/oracle/2_create_schema.sh | 1 + sql/tools/sqlserver/create_schema.sh | 5 + win-dependencies/pom.xml | 633 + win-framework/pom.xml | 45 + win-framework/win-common/pom.xml | 149 + .../common/core/IntArrayValuable.java | 15 + .../win/framework/common/core/KeyValue.java | 22 + .../common/enums/CommonStatusEnum.java | 46 + .../common/enums/DateIntervalEnum.java | 46 + .../framework/common/enums/DocumentEnum.java | 21 + .../framework/common/enums/TerminalEnum.java | 40 + .../framework/common/enums/UserTypeEnum.java | 39 + .../common/enums/WebFilterOrderEnum.java | 34 + .../framework/common/exception/ErrorCode.java | 32 + .../common/exception/ServerException.java | 60 + .../common/exception/ServiceException.java | 60 + .../enums/GlobalErrorCodeConstants.java | 41 + .../enums/ServiceErrorCodeRange.java | 48 + .../exception/util/ServiceExceptionUtil.java | 77 + .../win/framework/common/package-info.java | 6 + .../framework/common/pojo/CommonResult.java | 112 + .../win/framework/common/pojo/PageParam.java | 36 + .../win/framework/common/pojo/PageResult.java | 41 + .../common/pojo/SortablePageParam.java | 19 + .../framework/common/pojo/SortingField.java | 37 + .../common/util/cache/CacheUtils.java | 49 + .../common/util/collection/ArrayUtils.java | 58 + .../util/collection/CollectionUtils.java | 330 + .../common/util/collection/MapUtils.java | 68 + .../common/util/collection/SetUtils.java | 19 + .../framework/common/util/date/DateUtils.java | 149 + .../common/util/date/LocalDateTimeUtils.java | 309 + .../framework/common/util/http/HttpUtils.java | 163 + .../framework/common/util/io/FileUtils.java | 84 + .../win/framework/common/util/io/IoUtils.java | 28 + .../framework/common/util/json/JsonUtils.java | 202 + .../util/json/databind/NumberSerializer.java | 37 + .../TimestampLocalDateTimeDeserializer.java | 27 + .../TimestampLocalDateTimeSerializer.java | 26 + .../common/util/monitor/TracerUtils.java | 30 + .../common/util/number/MoneyUtils.java | 131 + .../common/util/number/NumberUtils.java | 64 + .../common/util/object/BeanUtils.java | 69 + .../common/util/object/ObjectUtils.java | 63 + .../common/util/object/PageUtils.java | 67 + .../framework/common/util/package-info.java | 7 + .../common/util/servlet/ServletUtils.java | 101 + .../util/spring/SpringExpressionUtils.java | 109 + .../common/util/spring/SpringUtils.java | 24 + .../common/util/string/StrUtils.java | 80 + .../util/validation/ValidationUtils.java | 55 + .../framework/common/validation/InEnum.java | 35 + .../validation/InEnumCollectionValidator.java | 42 + .../common/validation/InEnumValidator.java | 44 + .../framework/common/validation/Mobile.java | 28 + .../common/validation/MobileValidator.java | 25 + .../common/validation/Telephone.java | 28 + .../common/validation/TelephoneValidator.java | 25 + .../common/validation/package-info.java | 4 + ... Boot 参数校验 Validation 入门》.md | 1 + .../pom.xml | 46 + .../WinDataPermissionAutoConfiguration.java | 46 + ...inDeptDataPermissionAutoConfiguration.java | 34 + .../core/annotation/DataPermission.java | 35 + .../aop/DataPermissionAnnotationAdvisor.java | 36 + .../DataPermissionAnnotationInterceptor.java | 72 + .../core/aop/DataPermissionContextHolder.java | 72 + .../core/db/DataPermissionRuleHandler.java | 57 + .../core/rule/DataPermissionRule.java | 36 + .../core/rule/DataPermissionRuleFactory.java | 28 + .../rule/DataPermissionRuleFactoryImpl.java | 62 + .../rule/dept/DeptDataPermissionRule.java | 207 + .../DeptDataPermissionRuleCustomizer.java | 20 + .../core/rule/dept/package-info.java | 6 + .../core/util/DataPermissionUtils.java | 63 + .../datapermission/package-info.java | 4 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../win-spring-boot-starter-biz-ip/pom.xml | 48 + .../java/com/win/framework/ip/core/Area.java | 61 + .../framework/ip/core/enums/AreaTypeEnum.java | 39 + .../framework/ip/core/utils/AreaUtils.java | 214 + .../win/framework/ip/core/utils/IPUtils.java | 87 + .../com/win/framework/ip/package-info.java | 11 + .../src/main/resources/area.csv | 3662 +++++ .../src/main/resources/ip2region.xdb | Bin 0 -> 6428681 bytes .../pom.xml | 76 + .../tenant/config/TenantProperties.java | 49 + .../config/WinTenantAutoConfiguration.java | 133 + .../tenant/core/aop/TenantIgnore.java | 18 + .../tenant/core/aop/TenantIgnoreAspect.java | 35 + .../core/context/TenantContextHolder.java | 68 + .../tenant/core/db/TenantBaseDO.java | 21 + .../core/db/TenantDatabaseInterceptor.java | 43 + .../framework/tenant/core/job/TenantJob.java | 14 + .../tenant/core/job/TenantJobAspect.java | 59 + .../TenantKafkaEnvironmentPostProcessor.java | 37 + .../kafka/TenantKafkaProducerInterceptor.java | 47 + .../rabbitmq/TenantRabbitMQInitializer.java | 23 + .../TenantRabbitMQMessagePostProcessor.java | 31 + .../redis/TenantRedisMessageInterceptor.java | 42 + .../TenantRocketMQConsumeMessageHook.java | 46 + .../rocketmq/TenantRocketMQInitializer.java | 53 + .../TenantRocketMQSendMessageHook.java | 36 + .../core/redis/TenantRedisCacheManager.java | 46 + .../security/TenantSecurityWebFilter.java | 117 + .../core/service/TenantFrameworkService.java | 26 + .../service/TenantFrameworkServiceImpl.java | 73 + .../tenant/core/util/TenantUtils.java | 93 + .../core/web/TenantContextWebFilter.java | 37 + .../win/framework/tenant/package-info.java | 17 + .../invocation/InvocableHandlerMethod.java | 275 + .../main/resources/META-INF/spring.factories | 2 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-excel/pom.xml | 73 + .../dict/config/WinDictAutoConfiguration.java | 18 + .../dict/core/DictFrameworkUtils.java | 96 + .../com/win/framework/dict/package-info.java | 6 + .../excel/core/annotations/DictFormat.java | 22 + .../core/annotations/ExcelColumnSelect.java | 27 + .../excel/core/convert/AreaConvert.java | 46 + .../excel/core/convert/DictConvert.java | 72 + .../excel/core/convert/JsonConvert.java | 34 + .../excel/core/convert/MoneyConvert.java | 39 + .../function/ExcelColumnSelectFunction.java | 28 + .../core/handler/SelectSheetWriteHandler.java | 158 + .../framework/excel/core/util/ExcelUtils.java | 53 + .../com/win/framework/excel/package-info.java | 4 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-job/pom.xml | 41 + .../config/WinAsyncAutoConfiguration.java | 36 + .../config/WinQuartzAutoConfiguration.java | 29 + .../quartz/core/enums/JobDataKeyEnum.java | 14 + .../quartz/core/handler/JobHandler.java | 19 + .../core/handler/JobHandlerInvoker.java | 113 + .../core/scheduler/SchedulerManager.java | 150 + .../core/service/JobLogFrameworkService.java | 43 + .../framework/quartz/core/util/CronUtils.java | 60 + .../win/framework/quartz/package-info.java | 7 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + ...道 Spring Boot 定时任务入门》.md | 1 + ...道 Spring Boot 异步任务入门》.md | 1 + .../win-spring-boot-starter-monitor/pom.xml | 73 + .../tracer/config/TracerProperties.java | 14 + .../config/WinMetricsAutoConfiguration.java | 27 + .../config/WinTracerAutoConfiguration.java | 55 + .../tracer/core/annotation/BizTrace.java | 42 + .../tracer/core/aop/BizTraceAspect.java | 77 + .../tracer/core/filter/TraceFilter.java | 33 + .../core/util/TracerFrameworkUtils.java | 46 + .../win/framework/tracer/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + ...pring Boot 监控工具 Admin 入门》.md | 1 + ...ng Boot 监控端点 Actuator 入门》.md | 1 + ... Boot 链路追踪 SkyWalking 入门》.md | 1 + .../win-spring-boot-starter-mq/pom.xml | 43 + .../com/win/framework/mq/package-info.java | 4 + .../config/WinRabbitMQAutoConfiguration.java | 28 + .../mq/rabbitmq/core/package-info.java | 4 + .../framework/mq/rabbitmq/package-info.java | 4 + .../WinRedisMQConsumerAutoConfiguration.java | 151 + .../WinRedisMQProducerAutoConfiguration.java | 31 + .../mq/redis/core/RedisMQTemplate.java | 87 + .../interceptor/RedisMessageInterceptor.java | 26 + .../job/RedisPendingMessageResendJob.java | 100 + .../core/message/AbstractRedisMessage.java | 29 + .../pubsub/AbstractRedisChannelMessage.java | 23 + .../AbstractRedisChannelMessageListener.java | 103 + .../stream/AbstractRedisStreamMessage.java | 23 + .../AbstractRedisStreamMessageListener.java | 113 + .../win/framework/mq/redis/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + ...pring Boot 事件机制 Event 入门》.md | 1 + ...pring Boot 消息队列 Kafka 入门》.md | 1 + ...ng Boot 消息队列 RabbitMQ 入门》.md | 1 + ...ng Boot 消息队列 RocketMQ 入门》.md | 1 + .../win-spring-boot-starter-mybatis/pom.xml | 101 + .../WinDataSourceAutoConfiguration.java | 40 + .../datasource/core/enums/DataSourceEnum.java | 22 + .../core/filter/DruidAdRemoveFilter.java | 38 + .../framework/datasource/package-info.java | 5 + .../IdTypeEnvironmentPostProcessor.java | 108 + .../config/WinMybatisAutoConfiguration.java | 76 + .../mybatis/core/dataobject/BaseDO.java | 56 + .../mybatis/core/enums/DbTypeEnum.java | 95 + .../core/handler/DefaultDBFieldHandler.java | 62 + .../mybatis/core/mapper/BaseMapperX.java | 192 + .../core/query/LambdaQueryWrapperX.java | 135 + .../mybatis/core/query/MPJLambdaWrapperX.java | 313 + .../mybatis/core/query/QueryWrapperX.java | 166 + .../mybatis/core/type/EncryptTypeHandler.java | 75 + .../core/type/IntegerListTypeHandler.java | 56 + .../core/type/LongListTypeHandler.java | 57 + .../core/type/StringListTypeHandler.java | 58 + .../mybatis/core/util/JdbcUtils.java | 89 + .../mybatis/core/util/MyBatisUtils.java | 105 + .../win/framework/mybatis/package-info.java | 4 + .../config/WinTranslateAutoConfiguration.java | 18 + .../translate/core/TranslateUtils.java | 37 + .../win/framework/translate/package-info.java | 4 + .../main/resources/META-INF/spring.factories | 2 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + ...《芋道 Spring Boot MyBatis 入门》.md | 1 + ...多数据源(读写分离)入门》.md | 1 + ...Spring Boot 数据库连接池入门》.md | 1 + .../pom.xml | 40 + .../config/WinIdempotentConfiguration.java | 46 + .../core/annotation/Idempotent.java | 63 + .../idempotent/core/aop/IdempotentAspect.java | 68 + .../keyresolver/IdempotentKeyResolver.java | 22 + .../impl/DefaultIdempotentKeyResolver.java | 25 + .../impl/ExpressionIdempotentKeyResolver.java | 64 + .../impl/UserIdempotentKeyResolver.java | 28 + .../core/redis/IdempotentRedisDAO.java | 41 + .../framework/idempotent/package-info.java | 12 + .../lock4j/config/WinLock4jConfiguration.java | 18 + .../core/DefaultLockFailureStrategy.java | 21 + .../lock4j/core/Lock4jRedisKeyConstants.java | 19 + .../win/framework/lock4j/package-info.java | 4 + .../config/WinRateLimiterConfiguration.java | 55 + .../core/annotation/RateLimiter.java | 62 + .../core/aop/RateLimiterAspect.java | 60 + .../keyresolver/RateLimiterKeyResolver.java | 22 + .../impl/ClientIpRateLimiterKeyResolver.java | 27 + .../impl/DefaultRateLimiterKeyResolver.java | 25 + .../ExpressionRateLimiterKeyResolver.java | 64 + .../ServerNodeRateLimiterKeyResolver.java | 27 + .../impl/UserRateLimiterKeyResolver.java | 28 + .../core/redis/RateLimiterRedisDAO.java | 60 + .../framework/ratelimiter/package-info.java | 4 + .../WinApiSignatureAutoConfiguration.java | 28 + .../core/annotation/ApiSignature.java | 59 + .../core/aop/ApiSignatureAspect.java | 168 + .../core/redis/ApiSignatureRedisDAO.java | 57 + .../win/framework/signature/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 4 + .../win-spring-boot-starter-redis/pom.xml | 41 + .../config/WinCacheAutoConfiguration.java | 82 + .../redis/config/WinCacheProperties.java | 27 + .../config/WinRedisAutoConfiguration.java | 45 + .../redis/core/TimeoutRedisCacheManager.java | 86 + .../com/win/framework/redis/package-info.java | 4 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../《芋道 Spring Boot Cache 入门》.md | 1 + .../《芋道 Spring Boot Redis 入门》.md | 1 + .../win-spring-boot-starter-security/pom.xml | 71 + .../config/WinOperateLogConfiguration.java | 27 + .../operatelog/core/package-info.java | 4 + .../core/service/LogRecordServiceImpl.java | 91 + .../framework/operatelog/package-info.java | 7 + .../config/AuthorizeRequestsCustomizer.java | 35 + .../security/config/SecurityProperties.java | 51 + .../config/WinSecurityAutoConfiguration.java | 94 + .../WinWebSecurityConfigurerAdapter.java | 217 + .../framework/security/core/LoginUser.java | 71 + ...eadLocalSecurityContextHolderStrategy.java | 48 + .../filter/TokenAuthenticationFilter.java | 119 + .../core/handler/AccessDeniedHandlerImpl.java | 41 + .../handler/AuthenticationEntryPointImpl.java | 35 + .../service/SecurityFrameworkService.java | 59 + .../service/SecurityFrameworkServiceImpl.java | 65 + .../core/util/SecurityFrameworkUtils.java | 140 + .../win/framework/security/package-info.java | 7 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + ... 安全框架 Spring Security 入门》.md | 2 + .../win-spring-boot-starter-web/pom.xml | 87 + .../config/WinApiLogAutoConfiguration.java | 44 + .../apilog/core/annotation/ApiAccessLog.java | 65 + .../apilog/core/enums/OperateTypeEnum.java | 51 + .../core/filter/ApiAccessLogFilter.java | 250 + .../interceptor/ApiAccessLogInterceptor.java | 103 + .../win/framework/apilog/package-info.java | 8 + .../config/WinBannerAutoConfiguration.java | 20 + .../banner/core/BannerApplicationRunner.java | 76 + .../win/framework/banner/package-info.java | 6 + .../core/base/annotation/DesensitizeBy.java | 32 + .../base/handler/DesensitizationHandler.java | 40 + .../StringDesensitizeSerializer.java | 92 + .../regex/annotation/EmailDesensitize.java | 44 + .../regex/annotation/RegexDesensitize.java | 46 + .../AbstractRegexDesensitizationHandler.java | 46 + .../DefaultRegexDesensitizationHandler.java | 27 + .../handler/EmailDesensitizationHandler.java | 22 + .../annotation/BankCardDesensitize.java | 47 + .../annotation/CarLicenseDesensitize.java | 47 + .../annotation/ChineseNameDesensitize.java | 47 + .../annotation/FixedPhoneDesensitize.java | 47 + .../slider/annotation/IdCardDesensitize.java | 47 + .../slider/annotation/MobileDesensitize.java | 47 + .../annotation/PasswordDesensitize.java | 49 + .../slider/annotation/SliderDesensitize.java | 51 + .../AbstractSliderDesensitizationHandler.java | 86 + .../handler/BankCardDesensitization.java | 32 + .../handler/CarLicenseDesensitization.java | 32 + .../handler/ChineseNameDesensitization.java | 27 + .../DefaultDesensitizationHandler.java | 27 + .../handler/FixedPhoneDesensitization.java | 27 + .../slider/handler/IdCardDesensitization.java | 26 + .../slider/handler/MobileDesensitization.java | 27 + .../handler/PasswordDesensitization.java | 26 + .../framework/desensitize/package-info.java | 4 + .../config/WinJacksonAutoConfiguration.java | 52 + .../framework/jackson/core/package-info.java | 1 + .../java/com/win/framework/package-info.java | 4 + .../swagger/config/SwaggerProperties.java | 60 + .../config/WinSwaggerAutoConfiguration.java | 160 + .../win/framework/swagger/package-info.java | 6 + .../framework/web/config/WebProperties.java | 66 + .../web/config/WinWebAutoConfiguration.java | 131 + .../web/core/filter/ApiRequestFilter.java | 27 + .../core/filter/CacheRequestBodyFilter.java | 31 + .../core/filter/CacheRequestBodyWrapper.java | 68 + .../framework/web/core/filter/DemoFilter.java | 35 + .../core/handler/GlobalExceptionHandler.java | 390 + .../handler/GlobalResponseBodyHandler.java | 45 + .../web/core/util/WebFrameworkUtils.java | 146 + .../com/win/framework/web/package-info.java | 4 + .../xss/config/WinXssAutoConfiguration.java | 63 + .../framework/xss/config/XssProperties.java | 29 + .../xss/core/clean/JsoupXssCleaner.java | 64 + .../framework/xss/core/clean/XssCleaner.java | 16 + .../framework/xss/core/filter/XssFilter.java | 52 + .../xss/core/filter/XssRequestWrapper.java | 92 + .../core/json/XssStringJsonDeserializer.java | 82 + .../com/win/framework/xss/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 6 + .../src/main/resources/banner.txt | 17 + ...Boot API 接口文档 Swagger 入门》.md | 1 + ...芋道 Spring Boot SpringMVC 入门》.md | 1 + .../win-spring-boot-starter-websocket/pom.xml | 73 + .../websocket/config/WebSocketProperties.java | 34 + .../config/WinWebSocketAutoConfiguration.java | 183 + .../handler/JsonWebSocketMessageHandler.java | 83 + .../listener/WebSocketMessageListener.java | 31 + .../core/message/JsonWebSocketMessage.java | 29 + .../LoginUserHandshakeInterceptor.java | 42 + .../WebSocketAuthorizeRequestsCustomizer.java | 24 + .../AbstractWebSocketMessageSender.java | 104 + .../core/sender/WebSocketMessageSender.java | 52 + .../sender/kafka/KafkaWebSocketMessage.java | 35 + .../kafka/KafkaWebSocketMessageConsumer.java | 28 + .../kafka/KafkaWebSocketMessageSender.java | 67 + .../local/LocalWebSocketMessageSender.java | 20 + .../rabbitmq/RabbitMQWebSocketMessage.java | 37 + .../RabbitMQWebSocketMessageConsumer.java | 39 + .../RabbitMQWebSocketMessageSender.java | 62 + .../sender/redis/RedisWebSocketMessage.java | 34 + .../redis/RedisWebSocketMessageConsumer.java | 23 + .../redis/RedisWebSocketMessageSender.java | 57 + .../rocketmq/RocketMQWebSocketMessage.java | 35 + .../RocketMQWebSocketMessageConsumer.java | 30 + .../RocketMQWebSocketMessageSender.java | 61 + .../WebSocketSessionHandlerDecorator.java | 49 + .../core/session/WebSocketSessionManager.java | 53 + .../session/WebSocketSessionManagerImpl.java | 125 + .../core/util/WebSocketFrameworkUtils.java | 67 + .../win/framework/websocket/package-info.java | 4 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + ...芋道 Spring Boot WebSocket 入门》.md | 1 + win-module-infra/pom.xml | 25 + win-module-infra/win-module-infra-api/pom.xml | 33 + .../module/infra/api/config/ConfigApi.java | 18 + .../win/module/infra/api/file/FileApi.java | 41 + .../infra/api/logger/ApiAccessLogApi.java | 32 + .../infra/api/logger/ApiErrorLogApi.java | 32 + .../logger/dto/ApiAccessLogCreateReqDTO.java | 103 + .../logger/dto/ApiErrorLogCreateReqDTO.java | 107 + .../win/module/infra/api/package-info.java | 4 + .../api/websocket/WebSocketSenderApi.java | 54 + .../module/infra/enums/DictTypeConstants.java | 20 + .../infra/enums/ErrorCodeConstants.java | 71 + win-module-infra/win-module-infra-biz/pom.xml | 123 + .../infra/api/config/ConfigApiImpl.java | 27 + .../module/infra/api/file/FileApiImpl.java | 26 + .../infra/api/logger/ApiAccessLogApiImpl.java | 27 + .../infra/api/logger/ApiErrorLogApiImpl.java | 27 + .../win/module/infra/api/package-info.java | 1 + .../api/websocket/WebSocketSenderApiImpl.java | 34 + .../admin/codegen/CodegenController.java | 151 + .../codegen/vo/CodegenCreateListReqVO.java | 21 + .../admin/codegen/vo/CodegenDetailRespVO.java | 20 + .../codegen/vo/CodegenPreviewRespVO.java | 16 + .../admin/codegen/vo/CodegenUpdateReqVO.java | 24 + .../vo/column/CodegenColumnRespVO.java | 69 + .../vo/column/CodegenColumnSaveReqVO.java | 81 + .../vo/table/CodegenTablePageReqVO.java | 33 + .../codegen/vo/table/CodegenTableRespVO.java | 72 + .../vo/table/CodegenTableSaveReqVO.java | 100 + .../codegen/vo/table/DatabaseTableRespVO.java | 16 + .../admin/config/ConfigController.java | 106 + .../admin/config/vo/ConfigPageReqVO.java | 33 + .../admin/config/vo/ConfigRespVO.java | 56 + .../admin/config/vo/ConfigSaveReqVO.java | 45 + .../admin/db/DataSourceConfigController.java | 72 + .../admin/db/vo/DataSourceConfigRespVO.java | 27 + .../db/vo/DataSourceConfigSaveReqVO.java | 30 + .../demo/demo01/Demo01ContactController.java | 93 + .../demo01/vo/Demo01ContactPageReqVO.java | 28 + .../demo/demo01/vo/Demo01ContactRespVO.java | 47 + .../demo01/vo/Demo01ContactSaveReqVO.java | 36 + .../demo/demo02/Demo02CategoryController.java | 90 + .../demo02/vo/Demo02CategoryListReqVO.java | 25 + .../demo/demo02/vo/Demo02CategoryRespVO.java | 31 + .../demo02/vo/Demo02CategorySaveReqVO.java | 24 + .../demo/demo03/Demo03StudentController.java | 197 + .../admin/demo/demo03/package-info.java | 1 + .../demo03/vo/Demo03StudentPageReqVO.java | 30 + .../demo/demo03/vo/Demo03StudentRespVO.java | 41 + .../demo03/vo/Demo03StudentSaveReqVO.java | 39 + .../controller/admin/demo/package-info.java | 8 + .../admin/file/FileConfigController.http | 45 + .../admin/file/FileConfigController.java | 88 + .../controller/admin/file/FileController.java | 102 + .../file/vo/config/FileConfigPageReqVO.java | 30 + .../file/vo/config/FileConfigRespVO.java | 34 + .../file/vo/config/FileConfigSaveReqVO.java | 31 + .../admin/file/vo/file/FileCreateReqVO.java | 33 + .../admin/file/vo/file/FilePageReqVO.java | 30 + .../file/vo/file/FilePresignedUrlRespVO.java | 29 + .../admin/file/vo/file/FileRespVO.java | 36 + .../admin/file/vo/file/FileUploadReqVO.java | 20 + .../controller/admin/job/JobController.http | 5 + .../controller/admin/job/JobController.java | 148 + .../admin/job/JobLogController.java | 71 + .../admin/job/vo/job/JobPageReqVO.java | 24 + .../admin/job/vo/job/JobRespVO.java | 59 + .../admin/job/vo/job/JobSaveReqVO.java | 42 + .../admin/job/vo/log/JobLogPageReqVO.java | 37 + .../admin/job/vo/log/JobLogRespVO.java | 63 + .../admin/logger/ApiAccessLogController.java | 60 + .../admin/logger/ApiErrorLogController.java | 74 + .../apiaccesslog/ApiAccessLogPageReqVO.java | 42 + .../vo/apiaccesslog/ApiAccessLogRespVO.java | 99 + .../vo/apierrorlog/ApiErrorLogPageReqVO.java | 39 + .../vo/apierrorlog/ApiErrorLogRespVO.java | 112 + .../admin/redis/RedisController.http | 4 + .../admin/redis/RedisController.java | 43 + .../admin/redis/vo/RedisMonitorRespVO.java | 43 + .../app/file/AppFileController.java | 54 + .../app/file/vo/AppFileUploadReqVO.java | 20 + .../infra/controller/app/package-info.java | 4 + .../module/infra/controller/package-info.java | 6 + .../infra/convert/codegen/CodegenConvert.java | 68 + .../infra/convert/config/ConfigConvert.java | 28 + .../infra/convert/file/FileConfigConvert.java | 22 + .../module/infra/convert/package-info.java | 6 + .../infra/convert/redis/RedisConvert.java | 29 + ...g Boot 对象转换 MapStruct 入门》.md | 1 + .../dataobject/codegen/CodegenColumnDO.java | 136 + .../dataobject/codegen/CodegenTableDO.java | 158 + .../infra/dal/dataobject/config/ConfigDO.java | 64 + .../dal/dataobject/db/DataSourceConfigDO.java | 48 + .../demo/demo01/Demo01ContactDO.java | 54 + .../demo/demo02/Demo02CategoryDO.java | 40 + .../demo/demo03/Demo03CourseDO.java | 42 + .../dataobject/demo/demo03/Demo03GradeDO.java | 42 + .../demo/demo03/Demo03StudentDO.java | 50 + .../dal/dataobject/file/FileConfigDO.java | 111 + .../dal/dataobject/file/FileContentDO.java | 48 + .../infra/dal/dataobject/file/FileDO.java | 55 + .../infra/dal/dataobject/job/JobDO.java | 74 + .../infra/dal/dataobject/job/JobLogDO.java | 82 + .../dal/dataobject/logger/ApiAccessLogDO.java | 140 + .../dal/dataobject/logger/ApiErrorLogDO.java | 161 + .../mysql/codegen/CodegenColumnMapper.java | 24 + .../dal/mysql/codegen/CodegenTableMapper.java | 39 + .../infra/dal/mysql/config/ConfigMapper.java | 25 + .../dal/mysql/db/DataSourceConfigMapper.java | 14 + .../demo/demo01/Demo01ContactMapper.java | 26 + .../demo/demo02/Demo02CategoryMapper.java | 35 + .../mysql/demo/demo03/Demo03CourseMapper.java | 34 + .../mysql/demo/demo03/Demo03GradeMapper.java | 32 + .../demo/demo03/Demo03StudentMapper.java | 27 + .../dal/mysql/file/FileConfigMapper.java | 25 + .../dal/mysql/file/FileContentMapper.java | 25 + .../infra/dal/mysql/file/FileMapper.java | 26 + .../infra/dal/mysql/job/JobLogMapper.java | 43 + .../module/infra/dal/mysql/job/JobMapper.java | 30 + .../dal/mysql/logger/ApiAccessLogMapper.java | 45 + .../dal/mysql/logger/ApiErrorLogMapper.java | 44 + .../codegen/CodegenColumnHtmlTypeEnum.java | 29 + .../CodegenColumnListConditionEnum.java | 27 + .../enums/codegen/CodegenFrontTypeEnum.java | 25 + .../infra/enums/codegen/CodegenSceneEnum.java | 41 + .../codegen/CodegenTemplateTypeEnum.java | 53 + .../infra/enums/config/ConfigTypeEnum.java | 21 + .../infra/enums/job/JobLogStatusEnum.java | 24 + .../module/infra/enums/job/JobStatusEnum.java | 42 + .../logger/ApiErrorLogProcessStatusEnum.java | 28 + .../win/module/infra/enums/package-info.java | 4 + .../codegen/config/CodegenConfiguration.java | 9 + .../codegen/config/CodegenProperties.java | 43 + .../infra/framework/codegen/package-info.java | 4 + .../file/config/WinFileAutoConfiguration.java | 21 + .../file/core/client/AbstractFileClient.java | 69 + .../file/core/client/FileClient.java | 55 + .../file/core/client/FileClientConfig.java | 16 + .../file/core/client/FileClientFactory.java | 24 + .../core/client/FileClientFactoryImpl.java | 56 + .../file/core/client/db/DBFileClient.java | 55 + .../core/client/db/DBFileClientConfig.java | 24 + .../file/core/client/ftp/FtpFileClient.java | 77 + .../core/client/ftp/FtpFileClientConfig.java | 59 + .../core/client/local/LocalFileClient.java | 52 + .../client/local/LocalFileClientConfig.java | 30 + .../client/s3/FilePresignedUrlRespDTO.java | 29 + .../file/core/client/s3/S3FileClient.java | 143 + .../core/client/s3/S3FileClientConfig.java | 78 + .../file/core/client/sftp/SftpFileClient.java | 61 + .../client/sftp/SftpFileClientConfig.java | 52 + .../file/core/enums/FileStorageEnum.java | 55 + .../file/core/utils/FileTypeUtils.java | 76 + .../infra/framework/file/package-info.java | 12 + .../config/AdminServerConfiguration.java | 9 + .../infra/framework/monitor/package-info.java | 4 + ...pring Boot 监控工具 Admin 入门》.md | 1 + .../module/infra/framework/package-info.java | 6 + .../config/SecurityConfiguration.java | 45 + .../framework/security/core/package-info.java | 4 + .../web/config/InfraWebConfiguration.java | 24 + .../infra/framework/web/package-info.java | 4 + .../module/infra/job/job/JobLogCleanJob.java | 40 + .../infra/job/logger/AccessLogCleanJob.java | 41 + .../infra/job/logger/ErrorLogCleanJob.java | 41 + .../infra/mq/consumer/package-info.java | 4 + .../module/infra/mq/message/package-info.java | 4 + .../infra/mq/producer/package-info.java | 4 + .../com/win/module/infra/package-info.java | 9 + .../infra/service/codegen/CodegenService.java | 101 + .../service/codegen/CodegenServiceImpl.java | 296 + .../service/codegen/inner/CodegenBuilder.java | 221 + .../service/codegen/inner/CodegenEngine.java | 511 + .../infra/service/config/ConfigService.java | 63 + .../service/config/ConfigServiceImpl.java | 109 + .../service/db/DataSourceConfigService.java | 53 + .../db/DataSourceConfigServiceImpl.java | 106 + .../service/db/DatabaseTableService.java | 33 + .../service/db/DatabaseTableServiceImpl.java | 77 + .../demo/demo01/Demo01ContactService.java | 55 + .../demo/demo01/Demo01ContactServiceImpl.java | 72 + .../demo/demo02/Demo02CategoryService.java | 55 + .../demo02/Demo02CategoryServiceImpl.java | 134 + .../demo/demo03/Demo03StudentService.java | 158 + .../demo/demo03/Demo03StudentServiceImpl.java | 217 + .../infra/service/file/FileConfigService.java | 86 + .../service/file/FileConfigServiceImpl.java | 189 + .../infra/service/file/FileService.java | 66 + .../infra/service/file/FileServiceImpl.java | 116 + .../infra/service/job/JobLogService.java | 39 + .../infra/service/job/JobLogServiceImpl.java | 80 + .../module/infra/service/job/JobService.java | 78 + .../infra/service/job/JobServiceImpl.java | 202 + .../service/logger/ApiAccessLogService.java | 38 + .../logger/ApiAccessLogServiceImpl.java | 70 + .../service/logger/ApiErrorLogService.java | 47 + .../logger/ApiErrorLogServiceImpl.java | 87 + .../DemoWebSocketMessageListener.java | 48 + .../websocket/message/DemoReceiveMessage.java | 27 + .../websocket/message/DemoSendMessage.java | 24 + .../codegen/java/controller/controller.vm | 233 + .../codegen/java/controller/vo/listReqVO.vm | 45 + .../codegen/java/controller/vo/pageReqVO.vm | 47 + .../codegen/java/controller/vo/respVO.vm | 53 + .../codegen/java/controller/vo/saveReqVO.vm | 64 + .../src/main/resources/codegen/java/dal/do.vm | 52 + .../main/resources/codegen/java/dal/do_sub.vm | 49 + .../main/resources/codegen/java/dal/mapper.vm | 82 + .../resources/codegen/java/dal/mapper.xml.vm | 12 + .../resources/codegen/java/dal/mapper_sub.vm | 57 + .../resources/codegen/java/enums/errorcode.vm | 22 + .../resources/codegen/java/service/service.vm | 147 + .../codegen/java/service/serviceImpl.vm | 351 + .../codegen/java/test/serviceTest.vm | 168 + .../src/main/resources/codegen/sql/h2.vm | 37 + .../src/main/resources/codegen/sql/sql.vm | 28 + .../main/resources/codegen/vue/api/api.js.vm | 141 + .../vue/views/components/form_sub_erp.vue.vm | 205 + .../views/components/form_sub_inner.vue.vm | 2 + .../views/components/form_sub_normal.vue.vm | 347 + .../vue/views/components/list_sub_erp.vue.vm | 165 + .../views/components/list_sub_inner.vue.vm | 4 + .../resources/codegen/vue/views/form.vue.vm | 320 + .../resources/codegen/vue/views/index.vue.vm | 340 + .../main/resources/codegen/vue3/api/api.ts.vm | 115 + .../vue3/views/components/form_sub_erp.vue.vm | 204 + .../views/components/form_sub_inner.vue.vm | 2 + .../views/components/form_sub_normal.vue.vm | 360 + .../vue3/views/components/list_sub_erp.vue.vm | 184 + .../views/components/list_sub_inner.vue.vm | 4 + .../resources/codegen/vue3/views/form.vue.vm | 300 + .../resources/codegen/vue3/views/index.vue.vm | 374 + .../resources/codegen/vue3_vben/api/api.ts.vm | 32 + .../codegen/vue3_vben/views/data.ts.vm | 260 + .../codegen/vue3_vben/views/form.vue.vm | 58 + .../codegen/vue3_vben/views/index.vue.vm | 92 + .../src/main/resources/file/erweima.jpg | Bin 0 -> 18385 bytes win-module-system/pom.xml | 24 + .../win-module-system-api/pom.xml | 33 + .../win/module/system/api/dept/DeptApi.java | 61 + .../win/module/system/api/dept/PostApi.java | 39 + .../system/api/dept/dto/DeptRespDTO.java | 37 + .../system/api/dept/dto/PostRespDTO.java | 37 + .../module/system/api/dict/DictDataApi.java | 81 + .../system/api/dict/dto/DictDataRespDTO.java | 33 + .../module/system/api/logger/LoginLogApi.java | 21 + .../system/api/logger/OperateLogApi.java | 42 + .../api/logger/dto/LoginLogCreateReqDTO.java | 62 + .../logger/dto/OperateLogCreateReqDTO.java | 84 + .../api/logger/dto/OperateLogPageReqDTO.java | 28 + .../api/logger/dto/OperateLogRespDTO.java | 83 + .../module/system/api/mail/MailSendApi.java | 34 + .../mail/dto/MailSendSingleToUserReqDTO.java | 37 + .../api/notify/NotifyMessageSendApi.java | 30 + .../dto/NotifySendSingleToUserReqDTO.java | 33 + .../api/notify/dto/NotifyTemplateReqDTO.java | 34 + .../system/api/oauth2/OAuth2TokenApi.java | 49 + .../dto/OAuth2AccessTokenCheckRespDTO.java | 43 + .../dto/OAuth2AccessTokenCreateReqDTO.java | 40 + .../oauth2/dto/OAuth2AccessTokenRespDTO.java | 39 + .../win/module/system/api/package-info.java | 4 + .../system/api/permission/PermissionApi.java | 49 + .../module/system/api/permission/RoleApi.java | 21 + .../dto/DeptDataPermissionRespDTO.java | 35 + .../win/module/system/api/sms/SmsCodeApi.java | 40 + .../win/module/system/api/sms/SmsSendApi.java | 34 + .../api/sms/dto/code/SmsCodeSendReqDTO.java | 37 + .../api/sms/dto/code/SmsCodeUseReqDTO.java | 42 + .../sms/dto/code/SmsCodeValidateReqDTO.java | 37 + .../dto/send/SmsSendSingleToUserReqDTO.java | 36 + .../system/api/social/SocialClientApi.java | 68 + .../system/api/social/SocialUserApi.java | 55 + .../api/social/dto/SocialUserBindReqDTO.java | 52 + .../api/social/dto/SocialUserRespDTO.java | 35 + .../social/dto/SocialUserUnbindReqDTO.java | 48 + .../dto/SocialWxJsapiSignatureRespDTO.java | 34 + .../dto/SocialWxPhoneNumberInfoRespDTO.java | 27 + .../api/social/dto/SocialWxQrcodeReqDTO.java | 66 + .../SocialWxaSubscribeMessageSendReqDTO.java | 61 + .../SocialWxaSubscribeTemplateRespDTO.java | 42 + .../module/system/api/tenant/TenantApi.java | 26 + .../module/system/api/user/AdminUserApi.java | 89 + .../system/api/user/dto/AdminUserRespDTO.java | 48 + .../system/enums/DictTypeConstants.java | 26 + .../system/enums/ErrorCodeConstants.java | 166 + .../system/enums/LogRecordConstants.java | 33 + .../module/system/enums/common/SexEnum.java | 27 + .../system/enums/logger/LoginLogTypeEnum.java | 27 + .../system/enums/logger/LoginResultEnum.java | 26 + .../system/enums/mail/MailSendStatusEnum.java | 24 + .../system/enums/notice/NoticeTypeEnum.java | 23 + .../enums/notify/NotifyTemplateTypeEnum.java | 26 + .../enums/oauth2/OAuth2ClientConstants.java | 12 + .../enums/oauth2/OAuth2GrantTypeEnum.java | 29 + .../enums/permission/DataScopeEnum.java | 40 + .../system/enums/permission/MenuTypeEnum.java | 25 + .../system/enums/permission/RoleCodeEnum.java | 32 + .../system/enums/permission/RoleTypeEnum.java | 21 + .../enums/sms/SmsReceiveStatusEnum.java | 23 + .../module/system/enums/sms/SmsSceneEnum.java | 51 + .../system/enums/sms/SmsSendStatusEnum.java | 24 + .../system/enums/sms/SmsTemplateTypeEnum.java | 25 + .../system/enums/social/SocialTypeEnum.java | 78 + .../win-module-system-biz/pom.xml | 118 + .../module/system/api/dept/DeptApiImpl.java | 48 + .../module/system/api/dept/PostApiImpl.java | 35 + .../system/api/dict/DictDataApiImpl.java | 47 + .../system/api/logger/LoginLogApiImpl.java | 27 + .../system/api/logger/OperateLogApiImpl.java | 39 + .../system/api/mail/MailSendApiImpl.java | 34 + .../api/notify/NotifyMessageSendApiImpl.java | 32 + .../system/api/oauth2/OAuth2TokenApiImpl.java | 49 + .../api/permission/PermissionApiImpl.java | 42 + .../system/api/permission/RoleApiImpl.java | 24 + .../module/system/api/sms/SmsCodeApiImpl.java | 39 + .../module/system/api/sms/SmsSendApiImpl.java | 34 + .../api/social/SocialClientApiImpl.java | 97 + .../system/api/social/SocialUserApiImpl.java | 46 + .../system/api/tenant/TenantApiImpl.java | 30 + .../system/api/user/AdminUserApiImpl.java | 82 + .../controller/admin/auth/AuthController.http | 33 + .../controller/admin/auth/AuthController.java | 164 + .../admin/auth/vo/AuthLoginReqVO.java | 69 + .../admin/auth/vo/AuthLoginRespVO.java | 30 + .../admin/auth/vo/AuthMenuRespVO.java | 53 + .../auth/vo/AuthPermissionInfoRespVO.java | 96 + .../admin/auth/vo/AuthRegisterReqVO.java | 37 + .../admin/auth/vo/AuthSmsLoginReqVO.java | 28 + .../admin/auth/vo/AuthSmsSendReqVO.java | 32 + .../admin/auth/vo/AuthSocialLoginReqVO.java | 34 + .../admin/captcha/CaptchaController.java | 53 + .../controller/admin/dept/DeptController.java | 84 + .../controller/admin/dept/PostController.java | 106 + .../admin/dept/vo/dept/DeptListReqVO.java | 16 + .../admin/dept/vo/dept/DeptRespVO.java | 39 + .../admin/dept/vo/dept/DeptSaveReqVO.java | 49 + .../admin/dept/vo/dept/DeptSimpleRespVO.java | 23 + .../admin/dept/vo/post/PostPageReqVO.java | 22 + .../admin/dept/vo/post/PostRespVO.java | 45 + .../admin/dept/vo/post/PostSaveReqVO.java | 40 + .../admin/dept/vo/post/PostSimpleRespVO.java | 19 + .../admin/dict/DictDataController.http | 4 + .../admin/dict/DictDataController.java | 104 + .../admin/dict/DictTypeController.java | 102 + .../admin/dict/vo/data/DictDataPageReqVO.java | 29 + .../admin/dict/vo/data/DictDataRespVO.java | 55 + .../admin/dict/vo/data/DictDataSaveReqVO.java | 52 + .../dict/vo/data/DictDataSimpleRespVO.java | 25 + .../admin/dict/vo/type/DictTypePageReqVO.java | 33 + .../admin/dict/vo/type/DictTypeRespVO.java | 41 + .../admin/dict/vo/type/DictTypeSaveReqVO.java | 34 + .../dict/vo/type/DictTypeSimpleRespVO.java | 19 + .../controller/admin/ip/AreaController.http | 5 + .../controller/admin/ip/AreaController.java | 50 + .../admin/ip/vo/AreaNodeRespVO.java | 23 + .../admin/logger/LoginLogController.java | 59 + .../admin/logger/OperateLogController.http | 4 + .../admin/logger/OperateLogController.java | 59 + .../logger/vo/loginlog/LoginLogPageReqVO.java | 31 + .../logger/vo/loginlog/LoginLogRespVO.java | 57 + .../vo/operatelog/OperateLogPageReqVO.java | 35 + .../vo/operatelog/OperateLogRespVO.java | 68 + .../admin/mail/MailAccountController.java | 81 + .../admin/mail/MailLogController.java | 49 + .../admin/mail/MailTemplateController.http | 14 + .../admin/mail/MailTemplateController.java | 89 + .../mail/vo/account/MailAccountPageReqVO.java | 21 + .../mail/vo/account/MailAccountRespVO.java | 39 + .../mail/vo/account/MailAccountSaveReqVO.java | 45 + .../vo/account/MailAccountSimpleRespVO.java | 16 + .../admin/mail/vo/log/MailLogPageReqVO.java | 42 + .../admin/mail/vo/log/MailLogRespVO.java | 67 + .../vo/template/MailTemplatePageReqVO.java | 36 + .../mail/vo/template/MailTemplateRespVO.java | 46 + .../vo/template/MailTemplateSaveReqVO.java | 46 + .../vo/template/MailTemplateSendReqVO.java | 25 + .../vo/template/MailTemplateSimpleRespVO.java | 16 + .../admin/notice/NoticeController.java | 92 + .../admin/notice/vo/NoticePageReqVO.java | 19 + .../admin/notice/vo/NoticeRespVO.java | 30 + .../admin/notice/vo/NoticeSaveReqVO.java | 32 + .../admin/notify/NotifyMessageController.java | 98 + .../notify/NotifyTemplateController.java | 88 + .../vo/message/NotifyMessageMyPageReqVO.java | 27 + .../vo/message/NotifyMessagePageReqVO.java | 36 + .../vo/message/NotifyMessageRespVO.java | 49 + .../vo/template/NotifyTemplatePageReqVO.java | 33 + .../vo/template/NotifyTemplateRespVO.java | 43 + .../vo/template/NotifyTemplateSaveReqVO.java | 46 + .../vo/template/NotifyTemplateSendReqVO.java | 29 + .../admin/oauth2/OAuth2ClientController.http | 23 + .../admin/oauth2/OAuth2ClientController.java | 73 + .../admin/oauth2/OAuth2OpenController.http | 54 + .../admin/oauth2/OAuth2OpenController.java | 297 + .../admin/oauth2/OAuth2TokenController.java | 50 + .../admin/oauth2/OAuth2UserController.http | 14 + .../admin/oauth2/OAuth2UserController.java | 81 + .../vo/client/OAuth2ClientPageReqVO.java | 19 + .../oauth2/vo/client/OAuth2ClientRespVO.java | 64 + .../vo/client/OAuth2ClientSaveReqVO.java | 81 + .../vo/open/OAuth2OpenAccessTokenRespVO.java | 34 + .../open/OAuth2OpenAuthorizeInfoRespVO.java | 38 + .../vo/open/OAuth2OpenCheckTokenRespVO.java | 40 + .../vo/token/OAuth2AccessTokenPageReqVO.java | 22 + .../vo/token/OAuth2AccessTokenRespVO.java | 40 + .../oauth2/vo/user/OAuth2UserInfoRespVO.java | 70 + .../oauth2/vo/user/OAuth2UserUpdateReqVO.java | 34 + .../admin/permission/MenuController.http | 4 + .../admin/permission/MenuController.java | 88 + .../permission/PermissionController.java | 82 + .../admin/permission/RoleController.http | 42 + .../admin/permission/RoleController.java | 100 + .../permission/vo/menu/MenuListReqVO.java | 16 + .../admin/permission/vo/menu/MenuRespVO.java | 69 + .../admin/permission/vo/menu/MenuSaveVO.java | 65 + .../permission/vo/menu/MenuSimpleRespVO.java | 22 + .../PermissionAssignRoleDataScopeReqVO.java | 28 + .../PermissionAssignRoleMenuReqVO.java | 21 + .../PermissionAssignUserRoleReqVO.java | 21 + .../permission/vo/role/RolePageReqVO.java | 31 + .../admin/permission/vo/role/RoleRespVO.java | 59 + .../permission/vo/role/RoleSaveReqVO.java | 47 + .../permission/vo/role/RoleSimpleRespVO.java | 18 + .../admin/sms/SmsCallbackController.java | 60 + .../admin/sms/SmsChannelController.java | 82 + .../admin/sms/SmsLogController.java | 60 + .../admin/sms/SmsTemplateController.http | 14 + .../admin/sms/SmsTemplateController.java | 100 + .../sms/vo/channel/SmsChannelPageReqVO.java | 30 + .../sms/vo/channel/SmsChannelRespVO.java | 45 + .../sms/vo/channel/SmsChannelSaveReqVO.java | 42 + .../vo/channel/SmsChannelSimpleRespVO.java | 19 + .../admin/sms/vo/log/SmsLogPageReqVO.java | 43 + .../admin/sms/vo/log/SmsLogRespVO.java | 116 + .../sms/vo/template/SmsTemplatePageReqVO.java | 42 + .../sms/vo/template/SmsTemplateRespVO.java | 69 + .../sms/vo/template/SmsTemplateSaveReqVO.java | 46 + .../sms/vo/template/SmsTemplateSendReqVO.java | 24 + .../admin/socail/SocialClientController.http | 20 + .../admin/socail/SocialClientController.java | 83 + .../admin/socail/SocialUserController.java | 70 + .../vo/client/SocialClientPageReqVO.java | 30 + .../socail/vo/client/SocialClientRespVO.java | 39 + .../vo/client/SocialClientSaveReqVO.java | 61 + .../socail/vo/user/SocialUserBindReqVO.java | 34 + .../socail/vo/user/SocialUserPageReqVO.java | 33 + .../socail/vo/user/SocialUserRespVO.java | 48 + .../socail/vo/user/SocialUserUnbindReqVO.java | 30 + .../admin/tenant/TenantController.http | 21 + .../admin/tenant/TenantController.java | 111 + .../admin/tenant/TenantPackageController.java | 80 + .../vo/packages/TenantPackagePageReqVO.java | 32 + .../vo/packages/TenantPackageRespVO.java | 31 + .../vo/packages/TenantPackageSaveReqVO.java | 35 + .../packages/TenantPackageSimpleRespVO.java | 20 + .../tenant/vo/tenant/TenantPageReqVO.java | 36 + .../admin/tenant/vo/tenant/TenantRespVO.java | 55 + .../tenant/vo/tenant/TenantSaveReqVO.java | 70 + .../tenant/vo/tenant/TenantSimpleRespVO.java | 16 + .../controller/admin/user/UserController.http | 5 + .../controller/admin/user/UserController.java | 172 + .../admin/user/UserProfileController.http | 4 + .../admin/user/UserProfileController.java | 100 + .../user/vo/profile/UserProfileRespVO.java | 75 + .../UserProfileUpdatePasswordReqVO.java | 23 + .../vo/profile/UserProfileUpdateReqVO.java | 31 + .../admin/user/vo/user/UserImportExcelVO.java | 46 + .../admin/user/vo/user/UserImportRespVO.java | 24 + .../admin/user/vo/user/UserPageReqVO.java | 38 + .../admin/user/vo/user/UserRespVO.java | 75 + .../admin/user/vo/user/UserSaveReqVO.java | 80 + .../admin/user/vo/user/UserSimpleRespVO.java | 25 + .../user/vo/user/UserUpdatePasswordReqVO.java | 23 + .../user/vo/user/UserUpdateStatusReqVO.java | 23 + .../app/dict/AppDictDataController.java | 43 + .../app/dict/vo/AppDictDataRespVO.java | 26 + .../controller/app/ip/AppAreaController.java | 36 + .../app/ip/vo/AppAreaNodeRespVO.java | 23 + .../system/controller/package-info.java | 6 + .../system/convert/auth/AuthConvert.java | 88 + .../convert/oauth2/OAuth2OpenConvert.java | 56 + .../module/system/convert/package-info.java | 6 + .../convert/social/SocialUserConvert.java | 17 + .../system/convert/tenant/TenantConvert.java | 26 + .../system/convert/user/UserConvert.java | 58 + ...g Boot 对象转换 MapStruct 入门》.md | 1 + .../system/dal/dataobject/dept/DeptDO.java | 66 + .../system/dal/dataobject/dept/PostDO.java | 50 + .../dal/dataobject/dept/UserPostDO.java | 40 + .../dal/dataobject/dict/DictDataDO.java | 65 + .../dal/dataobject/dict/DictTypeDO.java | 57 + .../dal/dataobject/logger/LoginLogDO.java | 72 + .../dal/dataobject/logger/OperateLogDO.java | 85 + .../dal/dataobject/mail/MailAccountDO.java | 57 + .../system/dal/dataobject/mail/MailLogDO.java | 121 + .../dal/dataobject/mail/MailTemplateDO.java | 71 + .../dal/dataobject/notice/NoticeDO.java | 47 + .../dataobject/notify/NotifyMessageDO.java | 101 + .../dataobject/notify/NotifyTemplateDO.java | 72 + .../oauth2/OAuth2AccessTokenDO.java | 75 + .../dataobject/oauth2/OAuth2ApproveDO.java | 63 + .../dal/dataobject/oauth2/OAuth2ClientDO.java | 107 + .../dal/dataobject/oauth2/OAuth2CodeDO.java | 68 + .../oauth2/OAuth2RefreshTokenDO.java | 63 + .../dal/dataobject/permission/MenuDO.java | 107 + .../dal/dataobject/permission/RoleDO.java | 78 + .../dal/dataobject/permission/RoleMenuDO.java | 35 + .../dal/dataobject/permission/UserRoleDO.java | 35 + .../dal/dataobject/sms/SmsChannelDO.java | 62 + .../system/dal/dataobject/sms/SmsCodeDO.java | 65 + .../system/dal/dataobject/sms/SmsLogDO.java | 161 + .../dal/dataobject/sms/SmsTemplateDO.java | 91 + .../dal/dataobject/social/SocialClientDO.java | 76 + .../dataobject/social/SocialUserBindDO.java | 56 + .../dal/dataobject/social/SocialUserDO.java | 73 + .../dal/dataobject/tenant/TenantDO.java | 80 + .../dataobject/tenant/TenantPackageDO.java | 52 + .../dal/dataobject/user/AdminUserDO.java | 96 + .../system/dal/mysql/dept/DeptMapper.java | 37 + .../system/dal/mysql/dept/PostMapper.java | 38 + .../system/dal/mysql/dept/UserPostMapper.java | 32 + .../system/dal/mysql/dict/DictDataMapper.java | 49 + .../system/dal/mysql/dict/DictTypeMapper.java | 37 + .../dal/mysql/logger/LoginLogMapper.java | 28 + .../dal/mysql/logger/OperateLogMapper.java | 33 + .../dal/mysql/mail/MailAccountMapper.java | 20 + .../system/dal/mysql/mail/MailLogMapper.java | 25 + .../dal/mysql/mail/MailTemplateMapper.java | 35 + .../system/dal/mysql/notice/NoticeMapper.java | 20 + .../dal/mysql/notify/NotifyMessageMapper.java | 70 + .../mysql/notify/NotifyTemplateMapper.java | 26 + .../mysql/oauth2/OAuth2AccessTokenMapper.java | 35 + .../dal/mysql/oauth2/OAuth2ApproveMapper.java | 28 + .../dal/mysql/oauth2/OAuth2ClientMapper.java | 30 + .../dal/mysql/oauth2/OAuth2CodeMapper.java | 14 + .../oauth2/OAuth2RefreshTokenMapper.java | 22 + .../module/system/dal/mysql/package-info.java | 9 + .../dal/mysql/permission/MenuMapper.java | 31 + .../dal/mysql/permission/RoleMapper.java | 39 + .../dal/mysql/permission/RoleMenuMapper.java | 40 + .../dal/mysql/permission/UserRoleMapper.java | 36 + .../dal/mysql/sms/SmsChannelMapper.java | 25 + .../system/dal/mysql/sms/SmsCodeMapper.java | 28 + .../system/dal/mysql/sms/SmsLogMapper.java | 25 + .../dal/mysql/sms/SmsTemplateMapper.java | 33 + .../dal/mysql/social/SocialClientMapper.java | 28 + .../mysql/social/SocialUserBindMapper.java | 44 + .../dal/mysql/social/SocialUserMapper.java | 36 + .../system/dal/mysql/tenant/TenantMapper.java | 46 + .../dal/mysql/tenant/TenantPackageMapper.java | 32 + .../dal/mysql/user/AdminUserMapper.java | 50 + .../system/dal/redis/RedisKeyConstants.java | 110 + .../oauth2/OAuth2AccessTokenRedisDAO.java | 59 + .../config/WinCaptchaConfiguration.java | 29 + .../captcha/core/RedisCaptchaServiceImpl.java | 49 + .../framework/captcha/package-info.java | 8 + .../config/DataPermissionConfiguration.java | 28 + .../datapermission/package-info.java | 4 + .../core/AdminUserParseFunction.java | 51 + .../operatelog/core/AreaParseFunction.java | 39 + .../operatelog/core/BooleanParseFunction.java | 39 + .../operatelog/core/DeptParseFunction.java | 46 + .../operatelog/core/PostParseFunction.java | 46 + .../operatelog/core/SexParseFunction.java | 39 + .../framework/operatelog/package-info.java | 4 + .../module/system/framework/package-info.java | 6 + .../sms/config/SmsCodeProperties.java | 41 + .../sms/config/SmsConfiguration.java | 23 + .../framework/sms/core/client/SmsClient.java | 56 + .../sms/core/client/SmsClientFactory.java | 37 + .../core/client/dto/SmsReceiveRespDTO.java | 48 + .../sms/core/client/dto/SmsSendRespDTO.java | 43 + .../core/client/dto/SmsTemplateRespDTO.java | 33 + .../core/client/impl/AbstractSmsClient.java | 48 + .../sms/core/client/impl/AliyunSmsClient.java | 193 + .../client/impl/DebugDingTalkSmsClient.java | 91 + .../sms/core/client/impl/HuaweiSmsClient.java | 166 + .../sms/core/client/impl/QiniuSmsClient.java | 155 + .../client/impl/SmsClientFactoryImpl.java | 90 + .../core/client/impl/TencentSmsClient.java | 201 + .../sms/core/enums/SmsChannelEnum.java | 38 + .../enums/SmsTemplateAuditStatusEnum.java | 21 + .../core/property/SmsChannelProperties.java | 52 + .../web/config/SystemWebConfiguration.java | 24 + .../system/framework/web/package-info.java | 4 + .../com/win/module/system/job/DemoJob.java | 27 + .../win/module/system/job/package-info.java | 1 + .../mq/consumer/mail/MailSendConsumer.java | 31 + .../mq/consumer/sms/SmsSendConsumer.java | 31 + .../mq/message/mail/MailSendMessage.java | 47 + .../system/mq/message/sms/SmsSendMessage.java | 42 + .../system/mq/producer/mail/MailProducer.java | 41 + .../system/mq/producer/sms/SmsProducer.java | 41 + .../com/win/module/system/package-info.java | 8 + .../system/service/auth/AdminAuthService.java | 81 + .../service/auth/AdminAuthServiceImpl.java | 279 + .../system/service/dept/DeptService.java | 117 + .../system/service/dept/DeptServiceImpl.java | 223 + .../system/service/dept/PostService.java | 84 + .../system/service/dept/PostServiceImpl.java | 153 + .../system/service/dict/DictDataService.java | 110 + .../service/dict/DictDataServiceImpl.java | 179 + .../system/service/dict/DictTypeService.java | 70 + .../service/dict/DictTypeServiceImpl.java | 140 + .../service/logger/LoginLogService.java | 30 + .../service/logger/LoginLogServiceImpl.java | 35 + .../service/logger/OperateLogService.java | 39 + .../service/logger/OperateLogServiceImpl.java | 44 + .../service/mail/MailAccountService.java | 72 + .../service/mail/MailAccountServiceImpl.java | 99 + .../system/service/mail/MailLogService.java | 61 + .../service/mail/MailLogServiceImpl.java | 78 + .../system/service/mail/MailSendService.java | 60 + .../service/mail/MailSendServiceImpl.java | 173 + .../service/mail/MailTemplateService.java | 90 + .../service/mail/MailTemplateServiceImpl.java | 138 + .../system/service/member/MemberService.java | 26 + .../service/member/MemberServiceImpl.java | 54 + .../system/service/member/package-info.java | 4 + .../system/service/notice/NoticeService.java | 51 + .../service/notice/NoticeServiceImpl.java | 73 + .../service/notify/NotifyMessageService.java | 97 + .../notify/NotifyMessageServiceImpl.java | 75 + .../service/notify/NotifySendService.java | 55 + .../service/notify/NotifySendServiceImpl.java | 86 + .../service/notify/NotifyTemplateService.java | 73 + .../notify/NotifyTemplateServiceImpl.java | 138 + .../service/oauth2/OAuth2ApproveService.java | 52 + .../oauth2/OAuth2ApproveServiceImpl.java | 103 + .../service/oauth2/OAuth2ClientService.java | 90 + .../oauth2/OAuth2ClientServiceImpl.java | 153 + .../service/oauth2/OAuth2CodeService.java | 39 + .../service/oauth2/OAuth2CodeServiceImpl.java | 64 + .../service/oauth2/OAuth2GrantService.java | 113 + .../oauth2/OAuth2GrantServiceImpl.java | 104 + .../service/oauth2/OAuth2TokenService.java | 80 + .../oauth2/OAuth2TokenServiceImpl.java | 219 + .../service/permission/MenuService.java | 95 + .../service/permission/MenuServiceImpl.java | 262 + .../service/permission/PermissionService.java | 146 + .../permission/PermissionServiceImpl.java | 337 + .../service/permission/RoleService.java | 124 + .../service/permission/RoleServiceImpl.java | 262 + .../system/service/sms/SmsChannelService.java | 81 + .../service/sms/SmsChannelServiceImpl.java | 103 + .../system/service/sms/SmsCodeService.java | 40 + .../service/sms/SmsCodeServiceImpl.java | 112 + .../system/service/sms/SmsLogService.java | 68 + .../system/service/sms/SmsLogServiceImpl.java | 79 + .../system/service/sms/SmsSendService.java | 78 + .../service/sms/SmsSendServiceImpl.java | 191 + .../service/sms/SmsTemplateService.java | 82 + .../service/sms/SmsTemplateServiceImpl.java | 199 + .../service/social/SocialClientService.java | 135 + .../social/SocialClientServiceImpl.java | 439 + .../service/social/SocialUserService.java | 90 + .../service/social/SocialUserServiceImpl.java | 174 + .../service/tenant/TenantPackageService.java | 72 + .../tenant/TenantPackageServiceImpl.java | 114 + .../system/service/tenant/TenantService.java | 130 + .../service/tenant/TenantServiceImpl.java | 306 + .../tenant/handler/TenantInfoHandler.java | 21 + .../tenant/handler/TenantMenuHandler.java | 21 + .../system/service/user/AdminUserService.java | 219 + .../service/user/AdminUserServiceImpl.java | 527 + .../system/util/oauth2/OAuth2Utils.java | 103 + .../win/module/system/util/package-info.java | 4 + ...ingyuv.captcha.service.CaptchaCacheService | 1 + .../resources/images/jigsaw/original/bg1.png | Bin 0 -> 17827 bytes .../resources/images/jigsaw/original/bg2.png | Bin 0 -> 28732 bytes .../resources/images/jigsaw/original/bg3.png | Bin 0 -> 25814 bytes .../resources/images/jigsaw/original/bg4.png | Bin 0 -> 27859 bytes .../resources/images/jigsaw/original/bg5.png | Bin 0 -> 24036 bytes .../resources/images/jigsaw/original/bg6.png | Bin 0 -> 19160 bytes .../resources/images/jigsaw/original/bg7.png | Bin 0 -> 21445 bytes .../resources/images/jigsaw/original/bg8.png | Bin 0 -> 30332 bytes .../resources/images/jigsaw/original/bg9.png | Bin 0 -> 26977 bytes .../images/jigsaw/slidingBlock/1.png | Bin 0 -> 2158 bytes .../images/jigsaw/slidingBlock/11/10.png | Bin 0 -> 1657 bytes .../images/jigsaw/slidingBlock/11/11.png | Bin 0 -> 1657 bytes .../images/jigsaw/slidingBlock/11/12.png | Bin 0 -> 1657 bytes .../images/jigsaw/slidingBlock/11/13.png | Bin 0 -> 1873 bytes .../images/jigsaw/slidingBlock/11/14.png | Bin 0 -> 1872 bytes .../images/jigsaw/slidingBlock/11/15.png | Bin 0 -> 1872 bytes .../images/jigsaw/slidingBlock/11/16.png | Bin 0 -> 1838 bytes .../images/jigsaw/slidingBlock/11/17.png | Bin 0 -> 1839 bytes .../images/jigsaw/slidingBlock/11/18.png | Bin 0 -> 1836 bytes .../images/jigsaw/slidingBlock/11/19.png | Bin 0 -> 1838 bytes .../images/jigsaw/slidingBlock/11/8.png | Bin 0 -> 1657 bytes .../images/jigsaw/slidingBlock/11/9.png | Bin 0 -> 1657 bytes .../images/jigsaw/slidingBlock/2.png | Bin 0 -> 2297 bytes .../images/jigsaw/slidingBlock/3.png | Bin 0 -> 2241 bytes .../images/jigsaw/slidingBlock/4.png | Bin 0 -> 2255 bytes .../main/resources/images/pic-click/bg1.png | Bin 0 -> 24041 bytes .../main/resources/images/pic-click/bg10.png | Bin 0 -> 27872 bytes .../main/resources/images/pic-click/bg2.png | Bin 0 -> 28394 bytes .../main/resources/images/pic-click/bg3.png | Bin 0 -> 23407 bytes .../main/resources/images/pic-click/bg4.png | Bin 0 -> 25379 bytes .../main/resources/images/pic-click/bg5.png | Bin 0 -> 16422 bytes .../main/resources/images/pic-click/bg6.png | Bin 0 -> 23607 bytes .../main/resources/images/pic-click/bg7.png | Bin 0 -> 26113 bytes .../main/resources/images/pic-click/bg8.png | Bin 0 -> 27260 bytes .../main/resources/images/pic-click/bg9.png | Bin 0 -> 29878 bytes win-server/Dockerfile | 23 + win-server/pom.xml | 153 + .../com/win/server/WinServerApplication.java | 34 + .../server/controller/DefaultController.java | 74 + .../src/main/resources/application-dev.yaml | 215 + .../src/main/resources/application-local.yaml | 274 + .../src/main/resources/application.yaml | 332 + .../src/main/resources/logback-spring.xml | 76 + .../src/test/java/com/win/ProjectReactor.java | 148 + 1101 files changed, 108500 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 lombok.config create mode 100644 pom.xml create mode 100644 script/docker/Docker-HOWTO.md create mode 100644 script/docker/docker-compose.yml create mode 100644 script/docker/docker.env create mode 100644 script/idea/http-client.env.json create mode 100644 script/jenkins/Jenkinsfile create mode 100644 script/shell/deploy.sh create mode 100644 sql/db2/README.md create mode 100644 sql/dm/quartz.sql create mode 100644 sql/dm/ruoyi-vue-pro-dm8.sql create mode 100644 sql/kingbase/quartz.sql create mode 100644 sql/kingbase/ruoyi-vue-pro.sql create mode 100644 sql/mysql/quartz.sql create mode 100644 sql/mysql/ruoyi-vue-pro.sql create mode 100644 sql/opengauss/quartz.sql create mode 100644 sql/opengauss/ruoyi-vue-pro.sql create mode 100644 sql/oracle/quartz.sql create mode 100644 sql/oracle/ruoyi-vue-pro.sql create mode 100644 sql/postgresql/quartz.sql create mode 100644 sql/postgresql/ruoyi-vue-pro.sql create mode 100644 sql/sqlserver/quartz.sql create mode 100644 sql/sqlserver/ruoyi-vue-pro.sql create mode 100644 sql/tools/.gitignore create mode 100644 sql/tools/README.md create mode 100644 sql/tools/convertor.py create mode 100644 sql/tools/docker-compose.yaml create mode 100644 sql/tools/oracle/1_create_user.sql create mode 100644 sql/tools/oracle/2_create_schema.sh create mode 100644 sql/tools/sqlserver/create_schema.sh create mode 100644 win-dependencies/pom.xml create mode 100644 win-framework/pom.xml create mode 100644 win-framework/win-common/pom.xml create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/DateIntervalEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/TerminalEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/UserTypeEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/package-info.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortablePageParam.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortingField.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/NumberSerializer.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/object/BeanUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/package-info.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/Telephone.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/TelephoneValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java create mode 100644 win-framework/win-common/《芋道 Spring Boot 参数校验 Validation 入门》.md create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionRuleHandler.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-biz-ip/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaProducerInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQInitializer.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQMessagePostProcessor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/redis/TenantRedisMessageInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQConsumeMessageHook.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQInitializer.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQSendMessageHook.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-excel/pom.xml create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/core/DictFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/package-info.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/ExcelColumnSelect.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/AreaConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/function/ExcelColumnSelectFunction.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/SelectSheetWriteHandler.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-job/pom.xml create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md create mode 100644 win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md create mode 100644 win-framework/win-spring-boot-starter-monitor/pom.xml create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md create mode 100644 win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md create mode 100644 win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md create mode 100644 win-framework/win-spring-boot-starter-mq/pom.xml create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/config/WinRabbitMQAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQConsumerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQProducerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/RedisMQTemplate.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/interceptor/RedisMessageInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/job/RedisPendingMessageResendJob.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/message/AbstractRedisMessage.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessage.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessageListener.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessage.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 事件机制 Event 入门》.md create mode 100644 win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 Kafka 入门》.md create mode 100644 win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md create mode 100644 win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RocketMQ 入门》.md create mode 100644 win-framework/win-spring-boot-starter-mybatis/pom.xml create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/DbTypeEnum.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/MPJLambdaWrapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/config/WinTranslateAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/core/TranslateUtils.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md create mode 100644 win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md create mode 100644 win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md create mode 100644 win-framework/win-spring-boot-starter-protection/pom.xml create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/UserIdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/config/WinRateLimiterConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/annotation/RateLimiter.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/aop/RateLimiterAspect.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/RateLimiterKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ClientIpRateLimiterKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/DefaultRateLimiterKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ExpressionRateLimiterKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ServerNodeRateLimiterKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/UserRateLimiterKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/config/WinApiSignatureAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/annotation/ApiSignature.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/aop/ApiSignatureAspect.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/redis/ApiSignatureRedisDAO.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-redis/pom.xml create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/package-info.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md create mode 100644 win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md create mode 100644 win-framework/win-spring-boot-starter-security/pom.xml create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/config/WinOperateLogConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/service/LogRecordServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/package-info.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md create mode 100644 win-framework/win-spring-boot-starter-web/pom.xml create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/annotation/ApiAccessLog.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/enums/OperateTypeEnum.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-web/src/main/resources/banner.txt create mode 100644 win-framework/win-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md create mode 100644 win-framework/win-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md create mode 100644 win-framework/win-spring-boot-starter-websocket/pom.xml create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/handler/JsonWebSocketMessageHandler.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/listener/WebSocketMessageListener.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/message/JsonWebSocketMessage.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/LoginUserHandshakeInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/AbstractWebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/WebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/local/LocalWebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessage.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionHandlerDecorator.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManager.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManagerImpl.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/util/WebSocketFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-websocket/《芋道 Spring Boot WebSocket 入门》.md create mode 100644 win-module-infra/pom.xml create mode 100644 win-module-infra/win-module-infra-api/pom.xml create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/ConfigApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/package-info.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java create mode 100644 win-module-infra/win-module-infra-biz/pom.xml create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/config/ConfigApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/CodegenController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/ConfigController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/DataSourceConfigController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/Demo01ContactController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/Demo02CategoryController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryListReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategorySaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/Demo03StudentController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.http create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePresignedUrlRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.http create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobLogController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobSaveReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiAccessLogController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiErrorLogController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.http create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/AppFileController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/vo/AppFileUploadReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo01/Demo01ContactDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo02/Demo02CategoryDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03CourseDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03GradeDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03StudentDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo01/Demo01ContactMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo02/Demo02CategoryMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03CourseMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03GradeMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03StudentMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/config/WinFileAutoConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/AbstractFileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactory.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactoryImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClientConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClientConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClientConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/FilePresignedUrlRespDTO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClientConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClient.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClientConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/enums/FileStorageEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/utils/FileTypeUtils.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/job/JobLogCleanJob.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/AccessLogCleanJob.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/ErrorLogCleanJob.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/DemoWebSocketMessageListener.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoReceiveMessage.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoSendMessage.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/listReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do_sub.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper_sub.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/form.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/form.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg create mode 100644 win-module-system/pom.xml create mode 100644 win-module-system/win-module-system-api/pom.xml create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/PostRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogPageReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/package-info.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialClientApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialUserApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserBindReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserUnbindReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxQrcodeReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/LogRecordConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/social/SocialTypeEnum.java create mode 100644 win-module-system/win-module-system-biz/pom.xml create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialClientApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialUserApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthMenuRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/DeptController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/PostController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictTypeController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/vo/AreaNodeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/LoginLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailAccountController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/NoticeController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyMessageController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyTemplateController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageMyPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessagePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplatePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2TokenController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/PermissionController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSaveVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RolePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsCallbackController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsChannelController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialUserController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantPackageController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSaveReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/AppDictDataController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/vo/AppDictDataRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/AppAreaController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/vo/AppAreaNodeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/social/SocialUserConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialClientDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserBindDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialClientMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserBindMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/config/WinCaptchaConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/core/RedisCaptchaServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AdminUserParseFunction.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AreaParseFunction.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/BooleanParseFunction.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/DeptParseFunction.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/PostParseFunction.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/SexParseFunction.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsCodeProperties.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClientFactory.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AbstractSmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AliyunSmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/HuaweiSmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/QiniuSmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/TencentSmsClient.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsChannelEnum.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/property/SmsChannelProperties.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg1.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg2.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg3.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg4.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg5.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg6.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg7.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg8.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg9.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/1.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/10.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/11.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/12.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/13.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/14.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/15.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/16.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/17.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/18.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/19.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/8.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/9.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/2.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/3.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/4.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg1.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg10.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg2.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg3.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg4.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg5.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg6.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg7.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg8.png create mode 100644 win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg9.png create mode 100644 win-server/Dockerfile create mode 100644 win-server/pom.xml create mode 100644 win-server/src/main/java/com/win/server/WinServerApplication.java create mode 100644 win-server/src/main/java/com/win/server/controller/DefaultController.java create mode 100644 win-server/src/main/resources/application-dev.yaml create mode 100644 win-server/src/main/resources/application-local.yaml create mode 100644 win-server/src/main/resources/application.yaml create mode 100644 win-server/src/main/resources/logback-spring.xml create mode 100644 win-server/src/test/java/com/win/ProjectReactor.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e70fb86 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +.flattened-pom.xml + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml + +### JRebel ### +rebel.xml + +application-my.yaml + +/win-ui-app/unpackage/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bd9da62 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2021 ruoyi-vue-pro + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7305edb --- /dev/null +++ b/README.md @@ -0,0 +1,364 @@ +

+ Downloads + Downloads + Downloads +

+ +**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!** + +**「我喜欢写代码,乐此不疲」** +**「我喜欢做开源,以此为乐」** + +我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。 + +如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 + +## 🐶 新手必读 + +* 演示地址【Vue3 + element-plus】: +* 演示地址【Vue3 + vben(ant-design-vue)】: +* 演示地址【Vue2 + element-ui】: +* 启动文档: +* 视频教程: + +## 🐰 版本说明 + +| 版本 | JDK 8 + Spring Boot 2.7 | JDK 17/21 + Spring Boot 3.2 | +|---------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------------------------------------------------------------| +| 【完整版】[ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [`master`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/) 分支 | [`master-jdk17`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master-jdk17/) 分支 | +| 【精简版】[win-boot-mini](https://gitee.com/wincode/win-boot-mini) | [`master`](https://gitee.com/wincode/win-boot-mini/tree/master/) 分支 | [`master-jdk17`](https://gitee.com/wincode/win-boot-mini/tree/master-jdk17/) 分支 | + +* 【完整版】:包括系统功能、基础设施、会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP 等功能 +* 【精简版】:只包括系统功能、基础设施功能,不包括会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP 等功能 + +可参考 [《迁移文档》](https://doc.iocoder.cn/migrate-module/) ,只需要 5-10 分钟,即可将【完整版】按需迁移到【精简版】 + +## 🐯 平台简介 + +**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 + +> 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。 +> +> 😜 给项目点点 Star 吧,这对我们真的很重要! + +![架构图](/.image/common/ruoyi-vue-pro-architecture.png) + +* Java 后端:`master` 分支为 JDK 8 + Spring Boot 2.7,`master-jdk17` 分支为 JDK 17/21 + Spring Boot 3.2 +* 管理后台的电脑端:Vue3 提供 `element-plus`、`vben(ant-design-vue)` 两个版本,Vue2 提供 `element-ui` 版本 +* 管理后台的移动端:采用 `uni-app` 方案,一份代码多终端适配,同时支持 APP、小程序、H5! +* 后端采用 Spring Boot 多模块架构、MySQL + MyBatis Plus、Redis + Redisson +* 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等 +* 消息队列可使用 Event、Redis、RabbitMQ、Kafka、RocketMQ 等 +* 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统,支持 SSO 单点登录 +* 支持加载动态权限菜单,按钮级别权限控制,Redis 缓存提升性能 +* 支持 SaaS 多租户,可自定义每个租户的权限,提供透明化的多租户底层封装 +* 工作流使用 Flowable,支持动态表单、在线设计流程、会签 / 或签、多种任务分配方式 +* 高效率开发,使用代码生成器可以一键生成 Java、Vue 前后端代码、SQL 脚本、接口文档,支持单表、树表、主子表 +* 实时通信,采用 Spring WebSocket 实现,内置 Token 身份校验,支持 WebSocket 集群 +* 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款 +* 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务 +* 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏 + +## 🐳 项目关系 + +![架构演进](/.image/common/win-roadmap.png) + +三个项目的功能对比,可见社区共同整理的 [国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) 表格。 + +### 后端项目 + +| 项目 | Star | 简介 | +|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------| +| [ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro) | 基于 Spring Boot 多模块架构 | +| [win-cloud](https://gitee.com/zhijiantianya/win-cloud) | [![Gitee star](https://gitee.com/zhijiantianya/win-cloud/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/win-cloud) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/win-cloud.svg?style=social&label=Stars)](https://github.com/YunaiV/win-cloud) | 基于 Spring Cloud 微服务架构 | +| [Spring-Boot-Labs](https://gitee.com/wincode/SpringBoot-Labs) | [![Gitee star](https://gitee.com/wincode/SpringBoot-Labs/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/win-cloud) [![GitHub stars](https://img.shields.io/github/stars/wincode/SpringBoot-Labs.svg?style=social&label=Stars)](https://github.com/wincode/SpringBoot-Labs) | 系统学习 Spring Boot & Cloud 专栏 | + +### 前端项目 + +| 项目 | Star | 简介 | +|----------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------| +| [win-ui-admin-vue3](https://gitee.com/wincode/win-ui-admin-vue3) | [![Gitee star](https://gitee.com/wincode/win-ui-admin-vue3/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-admin-vue3) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-admin-vue3.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-admin-vue3) | 基于 Vue3 + element-plus 实现的管理后台 | +| [win-ui-admin-vben](https://gitee.com/wincode/win-ui-admin-vben) | [![Gitee star](https://gitee.com/wincode/win-ui-admin-vben/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-admin-vben) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-admin-vben.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-admin-vben) | 基于 Vue3 + vben(ant-design-vue) 实现的管理后台 | +| [win-mall-uniapp](https://gitee.com/wincode/win-mall-uniapp) | [![Gitee star](https://gitee.com/wincode/win-mall-uniapp/badge/star.svg?theme=white)](https://gitee.com/wincode/win-mall-uniapp) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-mall-uniapp.svg?style=social&label=Stars)](https://github.com/wincode/win-mall-uniapp) | 基于 uni-app 实现的商城小程序 | +| [win-ui-admin-vue2](https://gitee.com/wincode/win-ui-admin-vue2) | [![Gitee star](https://gitee.com/wincode/win-ui-admin-vue2/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-admin-vue2) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-admin-vue2.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-admin-vue2) | 基于 Vue2 + element-ui 实现的管理后台 | +| [win-ui-admin-uniapp](https://gitee.com/wincode/win-ui-admin-uniapp) | [![Gitee star](https://gitee.com/wincode/win-ui-admin-uniapp/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-admin-uniapp) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-admin-uniapp.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-admin-uniapp) | 基于 Vue2 + element-ui 实现的管理后台 | +| [win-ui-go-view](https://gitee.com/wincode/win-ui-go-view) | [![Gitee star](https://gitee.com/wincode/win-ui-go-view/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-go-view) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-go-view.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-go-view) | 基于 Vue3 + naive-ui 实现的大屏报表 | + +## 😎 开源协议 + +**为什么推荐使用本项目?** + +① 本项目采用比 Apache 2.0 更宽松的 [MIT License](https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE) 开源协议,个人与企业可 100% 免费使用,不用保留类作者、Copyright 信息。 + +② 代码全部开源,不会像其他项目一样,只开源部分代码,让你无法了解整个项目的架构设计。[国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) + +![开源项目对比](/.image/common/project-vs.png) + +③ 代码整洁、架构整洁,遵循《阿里巴巴 Java 开发手册》规范,代码注释详细,113770 行 Java 代码,42462 行代码注释。 + +## 🤝 项目外包 + +我们也是接外包滴,如果你有项目想要外包,可以微信联系【**Aix9975**】。 + +团队包含专业的项目经理、架构师、前端工程师、后端工程师、测试工程师、运维工程师,可以提供全流程的外包服务。 + +项目可以是商城、SCRM 系统、OA 系统、物流系统、ERP 系统、CMS 系统、HIS 系统、支付系统、IM 聊天、微信公众号、微信小程序等等。 + +## 🐼 内置功能 + +系统内置多种多种业务功能,可以用于快速你的业务系统: + +![功能分层](/.image/common/ruoyi-vue-pro-biz.png) + +* 通用模块(必选):系统功能、基础设施 +* 通用模块(可选):工作流程、支付系统、数据报表、会员中心 +* 业务系统(按需):ERP 系统、CRM 系统、商城系统、微信公众号、AI 大模型 + +> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。 +> +> * 额外新增的功能,我们使用 🚀 标记。 +> * 重新实现的功能,我们使用 ⭐️ 标记。 + +🙂 所有功能,都通过 **单元测试** 保证高质量。 + +### 系统功能 + +| | 功能 | 描述 | +|-----|-------|---------------------------------| +| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | +| ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | +| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | +| | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 | +| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | +| | 岗位管理 | 配置系统用户所属担任职务 | +| 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 | +| 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 | +| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | +| 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 | +| 🚀 | 邮件管理 | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台 | +| 🚀 | 站内信 | 系统内的消息通知,提供站内信模版、站内信消息 | +| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | +| ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 | +| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 | +| | 通知公告 | 系统通知公告信息发布维护 | +| 🚀 | 敏感词 | 配置系统敏感词,支持标签分组 | +| 🚀 | 应用管理 | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 | +| 🚀 | 地区管理 | 展示省份、城市、区镇等城市信息,支持 IP 对应城市 | + +![功能图](/.image/common/system-feature.png) + +### 工作流程 + +| | 功能 | 描述 | +|-----|-------|----------------------------------------| +| 🚀 | 流程模型 | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 | +| 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 | +| 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 | +| 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 | +| 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 | +| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 | +| 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 | + +![功能图](/.image/common/bpm-feature.png) + +### 支付系统 + +| | 功能 | 描述 | +|-----|------|---------------------------| +| 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 | +| 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 | +| 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 | +| 🚀 | 回调通知 | 查看支付回调业务的【支付】【退款】的通知结果 | +| 🚀 | 接入示例 | 提供接入支付系统的【支付】【退款】的功能实战 | + +### 基础设施 + +| | 功能 | 描述 | +|-----|-----------|----------------------------------------------| +| 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 | +| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 | +| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 | +| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 | +| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | +| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | +| 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 | +| 🚀 | WebSocket | 提供 WebSocket 接入示例,支持一对一、一对多发送方式 | +| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | +| | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | +| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | +| 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 | +| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | +| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 | +| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 | +| 🚀 | 服务保障 | 基于 Redis 实现分布式锁、幂等、限流功能,满足高并发场景 | +| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 | +| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 | + +![功能图](/.image/common/infra-feature.png) + +### 数据报表 + +| | 功能 | 描述 | +|-----|-------|--------------------| +| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 | +| 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 | + +### 微信公众号 + +| | 功能 | 描述 | +|-----|--------|-------------------------------| +| 🚀 | 账号管理 | 配置接入的微信公众号,可支持多个公众号 | +| 🚀 | 数据统计 | 统计公众号的用户增减、累计用户、消息概况、接口分析等数据 | +| 🚀 | 粉丝管理 | 查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作 | +| 🚀 | 消息管理 | 查看粉丝发送的消息列表,可主动回复粉丝消息 | +| 🚀 | 自动回复 | 自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复 | +| 🚀 | 标签管理 | 对公众号的标签进行创建、查询、修改、删除等操作 | +| 🚀 | 菜单管理 | 自定义公众号的菜单,也可以从公众号同步菜单 | +| 🚀 | 素材管理 | 管理公众号的图片、语音、视频等素材,支持在线播放语音、视频 | +| 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 | +| 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 | + +### 商城系统 + +演示地址: + +![功能图](/.image/common/mall-feature.png) + +![功能图](/.image/common/mall-preview.png) + +### 会员中心 + +| | 功能 | 描述 | +|-----|------|----------------------------------| +| 🚀 | 会员管理 | 会员是 C 端的消费者,该功能用于会员的搜索与管理 | +| 🚀 | 会员标签 | 对会员的标签进行创建、查询、修改、删除等操作 | +| 🚀 | 会员等级 | 对会员的等级、成长值进行管理,可用于订单折扣等会员权益 | +| 🚀 | 会员分组 | 对会员进行分组,用于用户画像、内容推送等运营手段 | +| 🚀 | 积分签到 | 回馈给签到、消费等行为的积分,会员可订单抵现、积分兑换等途径消耗 | + +### ERP 系统 + +演示地址: + +![功能图](/.image/common/erp-feature.png) + +### CRM 系统 + +演示地址: + +![功能图](/.image/common/crm-feature.png) + +### AI 大模型 + +演示地址: + +![功能图](/.image/common/ai-feature.png) + +![功能图](/.image/common/ai-preview.gif) + +## 🐨 技术栈 + +### 模块 + +| 项目 | 说明 | +|-----------------------|--------------------| +| `win-dependencies` | Maven 依赖版本管理 | +| `win-framework` | Java 框架拓展 | +| `win-server` | 管理后台 + 用户 APP 的服务端 | +| `win-module-system` | 系统功能的 Module 模块 | +| `win-module-member` | 会员中心的 Module 模块 | +| `win-module-infra` | 基础设施的 Module 模块 | +| `win-module-bpm` | 工作流程的 Module 模块 | +| `win-module-pay` | 支付系统的 Module 模块 | +| `win-module-mall` | 商城系统的 Module 模块 | +| `win-module-erp` | ERP 系统的 Module 模块 | +| `win-module-crm` | CRM 系统的 Module 模块 | +| `win-module-ai` | AI 大模型的 Module 模块 | +| `win-module-mp` | 微信公众号的 Module 模块 | +| `win-module-report` | 大屏报表 Module 模块 | + +### 框架 + +| 框架 | 说明 | 版本 | 学习指南 | +|---------------------------------------------------------------------------------------------|------------------|----------------|----------------------------------------------------------------| +| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 3.3.4 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | +| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | | +| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.23 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?win) | +| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.7 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?win) | +| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 4.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?win) | +| [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 /7.0 | | +| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.32.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?win) | +| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 6.1.10 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?win) | +| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 6.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?win) | +| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 8.0.1 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?win) | +| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 7.0.0 | [文档](https://doc.iocoder.cn/bpm/) | +| [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?win) | +| [Springdoc](https://springdoc.org/) | Swagger 文档 | 2.3.0 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?win) | +| [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 9.0.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?win) | +| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 3.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?win) | +| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.17.1 | | +| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.6.2 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?win) | +| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.34 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?win) | +| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.10.1 | - | +| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 5.7.0 | - | + +## 🐷 演示图 + +### 系统功能 + +| 模块 | biu | biu | biu | +|----------|-----------------------------|---------------------------|--------------------------| +| 登录 & 首页 | ![登录](/.image/登录.jpg) | ![首页](/.image/首页.jpg) | ![个人中心](/.image/个人中心.jpg) | +| 用户 & 应用 | ![用户管理](/.image/用户管理.jpg) | ![令牌管理](/.image/令牌管理.jpg) | ![应用管理](/.image/应用管理.jpg) | +| 租户 & 套餐 | ![租户管理](/.image/租户管理.jpg) | ![租户套餐](/.image/租户套餐.png) | - | +| 部门 & 岗位 | ![部门管理](/.image/部门管理.jpg) | ![岗位管理](/.image/岗位管理.jpg) | - | +| 菜单 & 角色 | ![菜单管理](/.image/菜单管理.jpg) | ![角色管理](/.image/角色管理.jpg) | - | +| 审计日志 | ![操作日志](/.image/操作日志.jpg) | ![登录日志](/.image/登录日志.jpg) | - | +| 短信 | ![短信渠道](/.image/短信渠道.jpg) | ![短信模板](/.image/短信模板.jpg) | ![短信日志](/.image/短信日志.jpg) | +| 字典 & 敏感词 | ![字典类型](/.image/字典类型.jpg) | ![字典数据](/.image/字典数据.jpg) | ![敏感词](/.image/敏感词.jpg) | +| 错误码 & 通知 | ![错误码管理](/.image/错误码管理.jpg) | ![通知公告](/.image/通知公告.jpg) | - | + +### 工作流程 + +| 模块 | biu | biu | biu | +|---------|---------------------------------|---------------------------------|---------------------------------| +| 流程模型 | ![流程模型-列表](/.image/流程模型-列表.jpg) | ![流程模型-设计](/.image/流程模型-设计.jpg) | ![流程模型-定义](/.image/流程模型-定义.jpg) | +| 表单 & 分组 | ![流程表单](/.image/流程表单.jpg) | ![用户分组](/.image/用户分组.jpg) | - | +| 我的流程 | ![我的流程-列表](/.image/我的流程-列表.jpg) | ![我的流程-发起](/.image/我的流程-发起.jpg) | ![我的流程-详情](/.image/我的流程-详情.jpg) | +| 待办 & 已办 | ![任务列表-审批](/.image/任务列表-审批.jpg) | ![任务列表-待办](/.image/任务列表-待办.jpg) | ![任务列表-已办](/.image/任务列表-已办.jpg) | +| OA 请假 | ![OA请假-列表](/.image/OA请假-列表.jpg) | ![OA请假-发起](/.image/OA请假-发起.jpg) | ![OA请假-详情](/.image/OA请假-详情.jpg) | + +### 基础设施 + +| 模块 | biu | biu | biu | +|---------------|-------------------------------|-----------------------------|---------------------------| +| 代码生成 | ![代码生成](/.image/代码生成.jpg) | ![生成效果](/.image/生成效果.jpg) | - | +| 文档 | ![系统接口](/.image/系统接口.jpg) | ![数据库文档](/.image/数据库文档.jpg) | - | +| 文件 & 配置 | ![文件配置](/.image/文件配置.jpg) | ![文件管理](/.image/文件管理2.jpg) | ![配置管理](/.image/配置管理.jpg) | +| 定时任务 | ![定时任务](/.image/定时任务.jpg) | ![任务日志](/.image/任务日志.jpg) | - | +| API 日志 | ![访问日志](/.image/访问日志.jpg) | ![错误日志](/.image/错误日志.jpg) | - | +| MySQL & Redis | ![MySQL](/.image/MySQL.jpg) | ![Redis](/.image/Redis.jpg) | - | +| 监控平台 | ![Java监控](/.image/Java监控.jpg) | ![链路追踪](/.image/链路追踪.jpg) | ![日志中心](/.image/日志中心.jpg) | + +### 支付系统 + +| 模块 | biu | biu | biu | +|---------|---------------------------|---------------------------------|---------------------------------| +| 商家 & 应用 | ![商户信息](/.image/商户信息.jpg) | ![应用信息-列表](/.image/应用信息-列表.jpg) | ![应用信息-编辑](/.image/应用信息-编辑.jpg) | +| 支付 & 退款 | ![支付订单](/.image/支付订单.jpg) | ![退款订单](/.image/退款订单.jpg) | --- | +### 数据报表 + +| 模块 | biu | biu | biu | +|-------|---------------------------------|---------------------------------|---------------------------------------| +| 报表设计器 | ![数据报表](/.image/报表设计器-数据报表.jpg) | ![图形报表](/.image/报表设计器-图形报表.jpg) | ![报表设计器-打印设计](/.image/报表设计器-打印设计.jpg) | +| 大屏设计器 | ![大屏列表](/.image/大屏设计器-列表.jpg) | ![大屏预览](/.image/大屏设计器-预览.jpg) | ![大屏编辑](/.image/大屏设计器-编辑.jpg) | + +### 移动端(管理后台) + +| biu | biu | biu | +|----------------------------------|----------------------------------|----------------------------------| +| ![](/.image/admin-uniapp/01.png) | ![](/.image/admin-uniapp/02.png) | ![](/.image/admin-uniapp/03.png) | +| ![](/.image/admin-uniapp/04.png) | ![](/.image/admin-uniapp/05.png) | ![](/.image/admin-uniapp/06.png) | +| ![](/.image/admin-uniapp/07.png) | ![](/.image/admin-uniapp/08.png) | ![](/.image/admin-uniapp/09.png) | + +目前已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。 diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..a8e8ce6 --- /dev/null +++ b/lombok.config @@ -0,0 +1,4 @@ +config.stopBubbling = true +lombok.tostring.callsuper=CALL +lombok.equalsandhashcode.callsuper=CALL +lombok.accessors.chain=true diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c50252c --- /dev/null +++ b/pom.xml @@ -0,0 +1,171 @@ + + + 4.0.0 + com.win + win + ${revision} + pom + + win-dependencies + win-framework + + win-server + + win-module-system + win-module-infra + + + + + + + + + + + + + ${project.artifactId} + 芋道项目基础脚手架 + https://github.com/YunaiV/ruoyi-vue-pro + + + 2.3.0-SNAPSHOT + + 17 + ${java.version} + ${java.version} + 3.2.2 + 3.13.0 + 1.6.0 + + 1.18.34 + 3.3.4 + 1.6.2 + UTF-8 + + + + + + com.win + win-dependencies + ${revision} + pom + import + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + false + + -parameters + + + + + org.codehaus.mojo + flatten-maven-plugin + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + oss + true + + + + + flatten + + flatten + process-resources + + + + clean + + flatten.clean + clean + + + + + + + + + + huaweicloud + huawei + https://mirrors.huaweicloud.com/repository/maven/ + + + aliyunmaven + aliyun + https://maven.aliyun.com/repository/public + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/script/docker/Docker-HOWTO.md b/script/docker/Docker-HOWTO.md new file mode 100644 index 0000000..9d557c1 --- /dev/null +++ b/script/docker/Docker-HOWTO.md @@ -0,0 +1,49 @@ +# Docker Build & Up + +目标: 快速部署体验系统,帮助了解系统之间的依赖关系。 +依赖:docker compose v2,删除`name: win-system`,降低`version`版本为`3.3`以下,支持`docker-compose`。 + +## 功能文件列表 + +```text +. +├── Docker-HOWTO.md +├── docker-compose.yml +├── docker.env <-- 提供docker-compose环境变量配置 +├── win-server +│ └── Dockerfile +└── win-ui-admin + ├── .dockerignore + ├── Dockerfile + └── nginx.conf <-- 提供基础配置,gzip压缩、api转发 +``` + +## 构建 jar 包 + +```shell +# 创建maven缓存volume +docker volume create --name win-maven-repo + +docker run -it --rm --name win-maven \ + -v win-maven-repo:/root/.m2 \ + -v $PWD:/usr/src/mymaven \ + -w /usr/src/mymaven \ + maven mvn clean install package '-Dmaven.test.skip=true' +``` + +## 构建启动服务 + +```shell +docker compose --env-file docker.env up -d +``` + +首次运行会自动构建容器。可以通过`docker compose build [service]`来手动构建所有或某个docker镜像 + +`--env-file docker.env`为可选参数,只是展示了通过`.env`文件配置容器启动的环境变量,`docker-compose.yml`本身已经提供足够的默认参数来正常运行系统。 + +## 服务器的宿主机端口映射 + +- admin ui: http://localhost:8080 +- api server: http://localhost:48080 +- mysql: root/123456, port: 3306 +- redis: port: 6379 diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml new file mode 100644 index 0000000..a7bde74 --- /dev/null +++ b/script/docker/docker-compose.yml @@ -0,0 +1,84 @@ +version: "3.4" + +name: win-system + +services: + mysql: + container_name: win-mysql + image: mysql:8 + restart: unless-stopped + tty: true + ports: + - "3306:3306" + environment: + MYSQL_DATABASE: ${MYSQL_DATABASE:-ruoyi-vue-pro} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} + volumes: + - mysql:/var/lib/mysql/ + - ./sql/mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro + + redis: + container_name: win-redis + image: redis:6-alpine + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis:/data + + server: + container_name: win-server + build: + context: ./win-server/ + image: win-server + restart: unless-stopped + ports: + - "48080:48080" + environment: + # https://github.com/polovyivan/docker-pass-configs-to-container + SPRING_PROFILES_ACTIVE: local + JAVA_OPTS: + ${JAVA_OPTS:- + -Xms512m + -Xmx512m + -Djava.security.egd=file:/dev/./urandom + } + ARGS: + --spring.datasource.dynamic.datasource.master.url=${MASTER_DATASOURCE_URL:-jdbc:mysql://win-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} + --spring.datasource.dynamic.datasource.master.username=${MASTER_DATASOURCE_USERNAME:-root} + --spring.datasource.dynamic.datasource.master.password=${MASTER_DATASOURCE_PASSWORD:-123456} + --spring.datasource.dynamic.datasource.slave.url=${SLAVE_DATASOURCE_URL:-jdbc:mysql://win-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} + --spring.datasource.dynamic.datasource.slave.username=${SLAVE_DATASOURCE_USERNAME:-root} + --spring.datasource.dynamic.datasource.slave.password=${SLAVE_DATASOURCE_PASSWORD:-123456} + --spring.data.redis.host=${REDIS_HOST:-win-redis} + depends_on: + - mysql + - redis + + admin: + container_name: win-admin + build: + context: ./win-ui-admin + args: + NODE_ENV: + ENV=${NODE_ENV:-production} + PUBLIC_PATH=${PUBLIC_PATH:-/} + VUE_APP_TITLE=${VUE_APP_TITLE:-闻荫管理系统} + VUE_APP_BASE_API=${VUE_APP_BASE_API:-/prod-api} + VUE_APP_APP_NAME=${VUE_APP_APP_NAME:-/} + VUE_APP_TENANT_ENABLE=${VUE_APP_TENANT_ENABLE:-true} + VUE_APP_CAPTCHA_ENABLE=${VUE_APP_CAPTCHA_ENABLE:-true} + VUE_APP_DOC_ENABLE=${VUE_APP_DOC_ENABLE:-true} + VUE_APP_BAIDU_CODE=${VUE_APP_BAIDU_CODE:-fadc1bd5db1a1d6f581df60a1807f8ab} + image: win-admin + restart: unless-stopped + ports: + - "8080:80" + depends_on: + - server + +volumes: + mysql: + driver: local + redis: + driver: local diff --git a/script/docker/docker.env b/script/docker/docker.env new file mode 100644 index 0000000..68a29f0 --- /dev/null +++ b/script/docker/docker.env @@ -0,0 +1,25 @@ +## mysql +MYSQL_DATABASE=ruoyi-vue-pro +MYSQL_ROOT_PASSWORD=123456 + +## server +JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom + +MASTER_DATASOURCE_URL=jdbc:mysql://win-mysql:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +MASTER_DATASOURCE_USERNAME=root +MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD} +SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL} +SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME} +SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD} +REDIS_HOST=win-redis + +## admin +NODE_ENV=production +PUBLIC_PATH=/ +VUE_APP_TITLE=闻荫管理系统 +VUE_APP_BASE_API=/prod-api +VUE_APP_APP_NAME=/ +VUE_APP_TENANT_ENABLE=true +VUE_APP_CAPTCHA_ENABLE=true +VUE_APP_DOC_ENABLE=true +VUE_APP_BAIDU_CODE=fadc1bd5db1a1d6f581df60a1807f8ab diff --git a/script/idea/http-client.env.json b/script/idea/http-client.env.json new file mode 100644 index 0000000..4a4cb52 --- /dev/null +++ b/script/idea/http-client.env.json @@ -0,0 +1,20 @@ +{ + "local": { + "baseUrl": "http://127.0.0.1:48080/admin-api", + "token": "test1", + "adminTenentId": "1", + + "appApi": "http://127.0.0.1:48080/app-api", + "appToken": "test247", + "appTenentId": "1" + }, + "gateway": { + "baseUrl": "http://127.0.0.1:8888/admin-api", + "token": "test1", + "adminTenentId": "1", + + "appApi": "http://127.0.0.1:8888/app-api", + "appToken": "test1", + "appTenantId": "1" + } +} diff --git a/script/jenkins/Jenkinsfile b/script/jenkins/Jenkinsfile new file mode 100644 index 0000000..e8916c1 --- /dev/null +++ b/script/jenkins/Jenkinsfile @@ -0,0 +1,60 @@ +#!groovy +pipeline { + + agent any + + parameters { + string(name: 'TAG_NAME', defaultValue: '', description: '') + } + + environment { + // DockerHub 凭证 ID(登录您的 DockerHub) + DOCKER_CREDENTIAL_ID = 'dockerhub-id' + // GitHub 凭证 ID (推送 tag 到 GitHub 仓库) + GITHUB_CREDENTIAL_ID = 'github-id' + // kubeconfig 凭证 ID (访问接入正在运行的 Kubernetes 集群) + KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' + // 镜像的推送 + REGISTRY = 'docker.io' + // DockerHub 账号名 + DOCKERHUB_NAMESPACE = 'docker_username' + // GitHub 账号名 + GITHUB_ACCOUNT = 'https://gitee.com/zhijiantianya/ruoyi-vue-pro' + // 应用名称 + APP_NAME = 'win-server' + // 应用部署路径 + APP_DEPLOY_BASE_DIR = '/media/pi/KINGTON/data/work/projects/' + } + + stages { + stage('检出') { + steps { + git url: "https://gitee.com/will-we/ruoyi-vue-pro.git", + branch: "devops" + } + } + + stage('构建') { + steps { + // TODO 解决多环境链接、密码不同配置临时方案 + sh 'if [ ! -d "' + "${env.HOME}" + '/resources" ];then\n' + + ' echo "配置文件不存在无需修改"\n' + + 'else\n' + + ' cp -rf ' + "${env.HOME}" + '/resources/*.yaml ' + "${env.APP_NAME}" + '/src/main/resources\n' + + ' echo "配置文件替换"\n' + + 'fi' + sh 'mvn clean package -Dmaven.test.skip=true' + } + } + + stage('部署') { + steps { + sh 'cp -f ' + ' bin/deploy.sh ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + sh 'cp -f ' + "${env.APP_NAME}" + '/target/*.jar ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" +'/build/' + archiveArtifacts "${env.APP_NAME}" + '/target/*.jar' + sh 'chmod +x ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' + sh 'bash ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' + } + } + } +} diff --git a/script/shell/deploy.sh b/script/shell/deploy.sh new file mode 100644 index 0000000..03f053b --- /dev/null +++ b/script/shell/deploy.sh @@ -0,0 +1,160 @@ +#!/bin/bash +set -e + +DATE=$(date +%Y%m%d%H%M) +# 基础路径 +BASE_PATH=/work/projects/win-server +# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下 +SOURCE_PATH=$BASE_PATH/build +# 服务名称。同时约定部署服务的 jar 包名字也为它。 +SERVER_NAME=win-server +# 环境 +PROFILES_ACTIVE=development +# 健康检查 URL +HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/ + +# heapError 存放路径 +HEAP_ERROR_PATH=$BASE_PATH/heapError +# JVM 参数 +JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH" + +# SkyWalking Agent 配置 +#export SW_AGENT_NAME=$SERVER_NAME +#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800 +#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84 +#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**" +#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar + +# 备份 +function backup() { + # 如果不存在,则无需备份 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份" + # 如果存在,则备份到 backup 目录下,使用时间作为后缀 + else + echo "[backup] 开始备份 $SERVER_NAME ..." + cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar + echo "[backup] 备份 $SERVER_NAME 完成" + fi +} + +# 最新构建代码 移动到项目环境 +function transfer() { + echo "[transfer] 开始转移 $SERVER_NAME.jar" + + # 删除原 jar 包 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除" + else + echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成" + rm $BASE_PATH/$SERVER_NAME.jar + fi + + # 复制新 jar 包 + echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...." + cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH + + echo "[transfer] 转移 $SERVER_NAME.jar 完成" +} + +# 停止:优雅关闭之前已经启动的服务 +function stop() { + echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME" + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + # 如果 Java 服务启动中,则进行关闭 + if [ -n "$PID" ]; then + # 正常关闭 + echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]" + kill -15 $PID + # 等待最大 120 秒,直到关闭完成。 + for ((i = 0; i < 120; i++)) + do + sleep 1 + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + if [ -n "$PID" ]; then + echo -e ".\c" + else + echo "[stop] 停止 $BASE_PATH/$SERVER_NAME 成功" + break + fi + done + + # 如果正常关闭失败,那么进行强制 kill -9 进行关闭 + if [ -n "$PID" ]; then + echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID" + kill -9 $PID + fi + # 如果 Java 服务未启动,则无需关闭 + else + echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止" + fi +} + +# 启动:启动后端项目 +function start() { + # 开启启动前,打印启动参数 + echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME" + echo "[start] JAVA_OPS: $JAVA_OPS" + echo "[start] JAVA_AGENT: $JAVA_AGENT" + echo "[start] PROFILES: $PROFILES_ACTIVE" + + # 开始启动 + BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE & + echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成" +} + +# 健康检查:自动判断后端项目是否正常启动 +function healthCheck() { + # 如果配置健康检查,则进行健康检查 + if [ -n "$HEALTH_CHECK_URL" ]; then + # 健康检查最大 120 秒,直到健康检查通过 + echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查"; + for ((i = 0; i < 120; i++)) + do + # 请求健康检查地址,只获取状态码。 + result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"` + # 如果状态码为 200,则说明健康检查通过 + if [ "$result" == "200" ]; then + echo "[healthCheck] 健康检查通过"; + break + # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试 + else + echo -e ".\c" + sleep 1 + fi + done + + # 健康检查未通过,则异常退出 shell 脚本,不继续部署。 + if [ ! "$result" == "200" ]; then + echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功"; + tail -n 10 nohup.out + exit 1; + # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。 + else + tail -n 10 nohup.out + fi + # 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。 + else + echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒"; + sleep 120 + echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功"; + tail -n 50 nohup.out + fi +} + +# 部署 +function deploy() { + cd $BASE_PATH + # 备份原 jar + backup + # 停止 Java 服务 + stop + # 部署新 jar + transfer + # 启动 Java 服务 + start + # 健康检查 + healthCheck +} + +deploy diff --git a/sql/db2/README.md b/sql/db2/README.md new file mode 100644 index 0000000..5b60d1e --- /dev/null +++ b/sql/db2/README.md @@ -0,0 +1,3 @@ +暂未适配 IBM DB2 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。 + +你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。 diff --git a/sql/dm/quartz.sql b/sql/dm/quartz.sql new file mode 100644 index 0000000..dca9695 --- /dev/null +++ b/sql/dm/quartz.sql @@ -0,0 +1,179 @@ +-- +-- A hint submitted by a user: Oracle DB MUST be created as "shared" and the +-- job_queue_processes parameter must be greater than 2 +-- However, these settings are pretty much standard after any +-- Oracle install, so most users need not worry about this. +-- +-- Many other users (including the primary author of Quartz) have had success +-- running in dedicated mode, so only consider the above as a hint ;-) +-- + +drop table if exists qrtz_calendars; +drop table if exists qrtz_fired_triggers; +drop table if exists qrtz_blob_triggers; +drop table if exists qrtz_cron_triggers; +drop table if exists qrtz_simple_triggers; +drop table if exists qrtz_simprop_triggers; +drop table if exists qrtz_triggers; +drop table if exists qrtz_job_details; +drop table if exists qrtz_paused_trigger_grps; +drop table if exists qrtz_locks; +drop table if exists qrtz_scheduler_state; + +CREATE TABLE qrtz_job_details +( + SCHED_NAME VARCHAR2(120) NOT NULL, + JOB_NAME VARCHAR2(200) NOT NULL, + JOB_GROUP VARCHAR2(200) NOT NULL, + DESCRIPTION VARCHAR2(250) NULL, + JOB_CLASS_NAME VARCHAR2(250) NOT NULL, + IS_DURABLE VARCHAR2(1) NOT NULL, + IS_NONCONCURRENT VARCHAR2(1) NOT NULL, + IS_UPDATE_DATA VARCHAR2(1) NOT NULL, + REQUESTS_RECOVERY VARCHAR2(1) NOT NULL, + JOB_DATA BLOB NULL, + CONSTRAINT QRTZ_JOB_DETAILS_PK PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +); +CREATE TABLE qrtz_triggers +( + SCHED_NAME VARCHAR2(120) NOT NULL, + TRIGGER_NAME VARCHAR2(200) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + JOB_NAME VARCHAR2(200) NOT NULL, + JOB_GROUP VARCHAR2(200) NOT NULL, + DESCRIPTION VARCHAR2(250) NULL, + NEXT_FIRE_TIME NUMBER(19) NULL, + PREV_FIRE_TIME NUMBER(19) NULL, + PRIORITY NUMBER(13) NULL, + TRIGGER_STATE VARCHAR2(16) NOT NULL, + TRIGGER_TYPE VARCHAR2(8) NOT NULL, + START_TIME NUMBER(19) NOT NULL, + END_TIME NUMBER(19) NULL, + CALENDAR_NAME VARCHAR2(200) NULL, + MISFIRE_INSTR NUMBER(2) NULL, + JOB_DATA BLOB NULL, + CONSTRAINT QRTZ_TRIGGERS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + CONSTRAINT QRTZ_TRIGGER_TO_JOBS_FK FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) + REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) +); +CREATE TABLE qrtz_simple_triggers +( + SCHED_NAME VARCHAR2(120) NOT NULL, + TRIGGER_NAME VARCHAR2(200) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + REPEAT_COUNT NUMBER(7) NOT NULL, + REPEAT_INTERVAL NUMBER(12) NOT NULL, + TIMES_TRIGGERED NUMBER(10) NOT NULL, + CONSTRAINT QRTZ_SIMPLE_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + CONSTRAINT QRTZ_SIMPLE_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); +CREATE TABLE qrtz_cron_triggers +( + SCHED_NAME VARCHAR2(120) NOT NULL, + TRIGGER_NAME VARCHAR2(200) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + CRON_EXPRESSION VARCHAR2(120) NOT NULL, + TIME_ZONE_ID VARCHAR2(80), + CONSTRAINT QRTZ_CRON_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + CONSTRAINT QRTZ_CRON_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); +CREATE TABLE qrtz_simprop_triggers +( + SCHED_NAME VARCHAR2(120) NOT NULL, + TRIGGER_NAME VARCHAR2(200) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + STR_PROP_1 VARCHAR2(512) NULL, + STR_PROP_2 VARCHAR2(512) NULL, + STR_PROP_3 VARCHAR2(512) NULL, + INT_PROP_1 NUMBER(10) NULL, + INT_PROP_2 NUMBER(10) NULL, + LONG_PROP_1 NUMBER(19) NULL, + LONG_PROP_2 NUMBER(19) NULL, + DEC_PROP_1 NUMERIC(13,4) NULL, + DEC_PROP_2 NUMERIC(13,4) NULL, + BOOL_PROP_1 VARCHAR2(1) NULL, + BOOL_PROP_2 VARCHAR2(1) NULL, + TIME_ZONE_ID VARCHAR2(80) NULL, + CONSTRAINT QRTZ_SIMPROP_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + CONSTRAINT QRTZ_SIMPROP_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); +CREATE TABLE qrtz_blob_triggers +( + SCHED_NAME VARCHAR2(120) NOT NULL, + TRIGGER_NAME VARCHAR2(200) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + BLOB_DATA BLOB NULL, + CONSTRAINT QRTZ_BLOB_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + CONSTRAINT QRTZ_BLOB_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); +CREATE TABLE qrtz_calendars +( + SCHED_NAME VARCHAR2(120) NOT NULL, + CALENDAR_NAME VARCHAR2(200) NOT NULL, + CALENDAR BLOB NOT NULL, + CONSTRAINT QRTZ_CALENDARS_PK PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) +); +CREATE TABLE qrtz_paused_trigger_grps +( + SCHED_NAME VARCHAR2(120) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + CONSTRAINT QRTZ_PAUSED_TRIG_GRPS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) +); +CREATE TABLE qrtz_fired_triggers +( + SCHED_NAME VARCHAR2(120) NOT NULL, + ENTRY_ID VARCHAR2(140) NOT NULL, + TRIGGER_NAME VARCHAR2(200) NOT NULL, + TRIGGER_GROUP VARCHAR2(200) NOT NULL, + INSTANCE_NAME VARCHAR2(200) NOT NULL, + FIRED_TIME NUMBER(19) NOT NULL, + SCHED_TIME NUMBER(19) NOT NULL, + PRIORITY NUMBER(13) NOT NULL, + STATE VARCHAR2(16) NOT NULL, + JOB_NAME VARCHAR2(200) NULL, + JOB_GROUP VARCHAR2(200) NULL, + IS_NONCONCURRENT VARCHAR2(1) NULL, + REQUESTS_RECOVERY VARCHAR2(1) NULL, + CONSTRAINT QRTZ_FIRED_TRIGGER_PK PRIMARY KEY (SCHED_NAME,ENTRY_ID) +); +CREATE TABLE qrtz_scheduler_state +( + SCHED_NAME VARCHAR2(120) NOT NULL, + INSTANCE_NAME VARCHAR2(200) NOT NULL, + LAST_CHECKIN_TIME NUMBER(19) NOT NULL, + CHECKIN_INTERVAL NUMBER(13) NOT NULL, + CONSTRAINT QRTZ_SCHEDULER_STATE_PK PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) +); +CREATE TABLE qrtz_locks +( + SCHED_NAME VARCHAR2(120) NOT NULL, + LOCK_NAME VARCHAR2(40) NOT NULL, + CONSTRAINT QRTZ_LOCKS_PK PRIMARY KEY (SCHED_NAME,LOCK_NAME) +); + +create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY); +create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP); + +create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP); +create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP); +create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME); +create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP); +create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE); +create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE); +create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE); +create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME); +create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME); +create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME); +create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); +create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE); + +create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME); +create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY); +create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP); +create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP); +create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP); +create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP); \ No newline at end of file diff --git a/sql/dm/ruoyi-vue-pro-dm8.sql b/sql/dm/ruoyi-vue-pro-dm8.sql new file mode 100644 index 0000000..7c6e9d7 --- /dev/null +++ b/sql/dm/ruoyi-vue-pro-dm8.sql @@ -0,0 +1,4404 @@ +/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : DM8 + + Date: 2024-09-21 17:40:13 +*/ + + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +CREATE TABLE infra_api_access_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + trace_id varchar(64) DEFAULT '' NULL, + user_id bigint DEFAULT 0 NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + application_name varchar(50) NOT NULL, + request_method varchar(16) DEFAULT '' NULL, + request_url varchar(255) DEFAULT '' NULL, + request_params text NULL, + response_body text NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + operate_module varchar(50) DEFAULT NULL NULL, + operate_name varchar(50) DEFAULT NULL NULL, + operate_type smallint DEFAULT 0 NULL, + begin_time datetime NOT NULL, + end_time datetime NOT NULL, + duration int NOT NULL, + result_code int DEFAULT 0 NOT NULL, + result_msg varchar(512) DEFAULT '' NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +CREATE INDEX idx_infra_api_access_log_01 ON infra_api_access_log (create_time); + +COMMENT ON COLUMN infra_api_access_log.id IS '日志主键'; +COMMENT ON COLUMN infra_api_access_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN infra_api_access_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_access_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_access_log.application_name IS '应用名'; +COMMENT ON COLUMN infra_api_access_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_access_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_access_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_access_log.response_body IS '响应结果'; +COMMENT ON COLUMN infra_api_access_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_access_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_access_log.operate_module IS '操作模块'; +COMMENT ON COLUMN infra_api_access_log.operate_name IS '操作名'; +COMMENT ON COLUMN infra_api_access_log.operate_type IS '操作分类'; +COMMENT ON COLUMN infra_api_access_log.begin_time IS '开始请求时间'; +COMMENT ON COLUMN infra_api_access_log.end_time IS '结束请求时间'; +COMMENT ON COLUMN infra_api_access_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_api_access_log.result_code IS '结果码'; +COMMENT ON COLUMN infra_api_access_log.result_msg IS '结果提示'; +COMMENT ON COLUMN infra_api_access_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_access_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_access_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_access_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_access_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_access_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_access_log IS 'API 访问日志表'; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +CREATE TABLE infra_api_error_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + trace_id varchar(64) NOT NULL, + user_id int DEFAULT 0 NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + application_name varchar(50) NOT NULL, + request_method varchar(16) NOT NULL, + request_url varchar(255) NOT NULL, + request_params varchar(8000) NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + exception_time datetime NOT NULL, + exception_name varchar(128) DEFAULT '' NULL, + exception_message text NOT NULL, + exception_root_cause_message text NOT NULL, + exception_stack_trace text NOT NULL, + exception_class_name varchar(512) NOT NULL, + exception_file_name varchar(512) NOT NULL, + exception_method_name varchar(512) NOT NULL, + exception_line_number int NOT NULL, + process_status smallint NOT NULL, + process_time datetime DEFAULT NULL NULL, + process_user_id int DEFAULT 0 NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN infra_api_error_log.id IS '编号'; +COMMENT ON COLUMN infra_api_error_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN infra_api_error_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_error_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_error_log.application_name IS '应用名'; +COMMENT ON COLUMN infra_api_error_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_error_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_error_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_error_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_error_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_error_log.exception_time IS '异常发生时间'; +COMMENT ON COLUMN infra_api_error_log.exception_name IS '异常名'; +COMMENT ON COLUMN infra_api_error_log.exception_message IS '异常导致的消息'; +COMMENT ON COLUMN infra_api_error_log.exception_root_cause_message IS '异常导致的根消息'; +COMMENT ON COLUMN infra_api_error_log.exception_stack_trace IS '异常的栈轨迹'; +COMMENT ON COLUMN infra_api_error_log.exception_class_name IS '异常发生的类全名'; +COMMENT ON COLUMN infra_api_error_log.exception_file_name IS '异常发生的类文件'; +COMMENT ON COLUMN infra_api_error_log.exception_method_name IS '异常发生的方法名'; +COMMENT ON COLUMN infra_api_error_log.exception_line_number IS '异常发生的方法所在行'; +COMMENT ON COLUMN infra_api_error_log.process_status IS '处理状态'; +COMMENT ON COLUMN infra_api_error_log.process_time IS '处理时间'; +COMMENT ON COLUMN infra_api_error_log.process_user_id IS '处理用户编号'; +COMMENT ON COLUMN infra_api_error_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_error_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_error_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_error_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_error_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_error_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_error_log IS '系统异常日志'; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +CREATE TABLE infra_codegen_column ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + table_id bigint NOT NULL, + column_name varchar(200) NOT NULL, + data_type varchar(100) NOT NULL, + column_comment varchar(500) NOT NULL, + nullable bit NOT NULL, + primary_key bit NOT NULL, + ordinal_position int NOT NULL, + java_type varchar(32) NOT NULL, + java_field varchar(64) NOT NULL, + dict_type varchar(200) DEFAULT '' NULL, + example varchar(64) DEFAULT NULL NULL, + create_operation bit NOT NULL, + update_operation bit NOT NULL, + list_operation bit NOT NULL, + list_operation_condition varchar(32) DEFAULT '=' NOT NULL, + list_operation_result bit NOT NULL, + html_type varchar(32) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_codegen_column.id IS '编号'; +COMMENT ON COLUMN infra_codegen_column.table_id IS '表编号'; +COMMENT ON COLUMN infra_codegen_column.column_name IS '字段名'; +COMMENT ON COLUMN infra_codegen_column.data_type IS '字段类型'; +COMMENT ON COLUMN infra_codegen_column.column_comment IS '字段描述'; +COMMENT ON COLUMN infra_codegen_column.nullable IS '是否允许为空'; +COMMENT ON COLUMN infra_codegen_column.primary_key IS '是否主键'; +COMMENT ON COLUMN infra_codegen_column.ordinal_position IS '排序'; +COMMENT ON COLUMN infra_codegen_column.java_type IS 'Java 属性类型'; +COMMENT ON COLUMN infra_codegen_column.java_field IS 'Java 属性名'; +COMMENT ON COLUMN infra_codegen_column.dict_type IS '字典类型'; +COMMENT ON COLUMN infra_codegen_column.example IS '数据示例'; +COMMENT ON COLUMN infra_codegen_column.create_operation IS '是否为 Create 创建操作的字段'; +COMMENT ON COLUMN infra_codegen_column.update_operation IS '是否为 Update 更新操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation IS '是否为 List 查询操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation_condition IS 'List 查询操作的条件类型'; +COMMENT ON COLUMN infra_codegen_column.list_operation_result IS '是否为 List 查询操作的返回字段'; +COMMENT ON COLUMN infra_codegen_column.html_type IS '显示类型'; +COMMENT ON COLUMN infra_codegen_column.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_column.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_column.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_column.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_column.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_column IS '代码生成表字段定义'; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +CREATE TABLE infra_codegen_table ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + data_source_config_id bigint NOT NULL, + scene smallint DEFAULT 1 NOT NULL, + table_name varchar(200) DEFAULT '' NULL, + table_comment varchar(500) DEFAULT '' NULL, + remark varchar(500) DEFAULT NULL NULL, + module_name varchar(30) NOT NULL, + business_name varchar(30) NOT NULL, + class_name varchar(100) DEFAULT '' NULL, + class_comment varchar(50) NOT NULL, + author varchar(50) NOT NULL, + template_type smallint DEFAULT 1 NOT NULL, + front_type smallint NOT NULL, + parent_menu_id bigint DEFAULT NULL NULL, + master_table_id bigint DEFAULT NULL NULL, + sub_join_column_id bigint DEFAULT NULL NULL, + sub_join_many bit DEFAULT NULL NULL, + tree_parent_column_id bigint DEFAULT NULL NULL, + tree_name_column_id bigint DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_codegen_table.id IS '编号'; +COMMENT ON COLUMN infra_codegen_table.data_source_config_id IS '数据源配置的编号'; +COMMENT ON COLUMN infra_codegen_table.scene IS '生成场景'; +COMMENT ON COLUMN infra_codegen_table.table_name IS '表名称'; +COMMENT ON COLUMN infra_codegen_table.table_comment IS '表描述'; +COMMENT ON COLUMN infra_codegen_table.remark IS '备注'; +COMMENT ON COLUMN infra_codegen_table.module_name IS '模块名'; +COMMENT ON COLUMN infra_codegen_table.business_name IS '业务名'; +COMMENT ON COLUMN infra_codegen_table.class_name IS '类名称'; +COMMENT ON COLUMN infra_codegen_table.class_comment IS '类描述'; +COMMENT ON COLUMN infra_codegen_table.author IS '作者'; +COMMENT ON COLUMN infra_codegen_table.template_type IS '模板类型'; +COMMENT ON COLUMN infra_codegen_table.front_type IS '前端类型'; +COMMENT ON COLUMN infra_codegen_table.parent_menu_id IS '父菜单编号'; +COMMENT ON COLUMN infra_codegen_table.master_table_id IS '主表的编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_column_id IS '子表关联主表的字段编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_many IS '主表与子表是否一对多'; +COMMENT ON COLUMN infra_codegen_table.tree_parent_column_id IS '树表的父字段编号'; +COMMENT ON COLUMN infra_codegen_table.tree_name_column_id IS '树表的名字字段编号'; +COMMENT ON COLUMN infra_codegen_table.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_table.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_table.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_table.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_table.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_table IS '代码生成表定义'; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +CREATE TABLE infra_config ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + category varchar(50) NOT NULL, + type smallint NOT NULL, + name varchar(100) DEFAULT '' NULL, + config_key varchar(100) DEFAULT '' NULL, + value varchar(500) DEFAULT '' NULL, + visible bit NOT NULL, + remark varchar(500) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_config.id IS '参数主键'; +COMMENT ON COLUMN infra_config.category IS '参数分组'; +COMMENT ON COLUMN infra_config.type IS '参数类型'; +COMMENT ON COLUMN infra_config.name IS '参数名称'; +COMMENT ON COLUMN infra_config.config_key IS '参数键名'; +COMMENT ON COLUMN infra_config.value IS '参数键值'; +COMMENT ON COLUMN infra_config.visible IS '是否可见'; +COMMENT ON COLUMN infra_config.remark IS '备注'; +COMMENT ON COLUMN infra_config.creator IS '创建者'; +COMMENT ON COLUMN infra_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_config.updater IS '更新者'; +COMMENT ON COLUMN infra_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_config IS '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT infra_config ON; +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'system.user.init-password', '123456', '0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-07-20 17:22:47', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', '1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 'test2', 2, 'test3', 'test4', 'test5', '1', 'test6', '1', '2023-12-03 09:55:16', '1', '2023-12-03 09:55:27', '0'); +COMMIT; +SET IDENTITY_INSERT infra_config OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +CREATE TABLE infra_data_source_config ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(100) DEFAULT '' NULL, + url varchar(1024) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) DEFAULT '' NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_data_source_config.id IS '主键编号'; +COMMENT ON COLUMN infra_data_source_config.name IS '参数名称'; +COMMENT ON COLUMN infra_data_source_config.url IS '数据源连接'; +COMMENT ON COLUMN infra_data_source_config.username IS '用户名'; +COMMENT ON COLUMN infra_data_source_config.password IS '密码'; +COMMENT ON COLUMN infra_data_source_config.creator IS '创建者'; +COMMENT ON COLUMN infra_data_source_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_data_source_config.updater IS '更新者'; +COMMENT ON COLUMN infra_data_source_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_data_source_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_data_source_config IS '数据源配置表'; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +CREATE TABLE infra_file ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + config_id bigint DEFAULT NULL NULL, + name varchar(256) DEFAULT NULL NULL, + path varchar(512) NOT NULL, + url varchar(1024) NOT NULL, + type varchar(128) DEFAULT NULL NULL, + size int NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_file.id IS '文件编号'; +COMMENT ON COLUMN infra_file.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file.name IS '文件名'; +COMMENT ON COLUMN infra_file.path IS '文件路径'; +COMMENT ON COLUMN infra_file.url IS '文件 URL'; +COMMENT ON COLUMN infra_file.type IS '文件类型'; +COMMENT ON COLUMN infra_file.size IS '文件大小'; +COMMENT ON COLUMN infra_file.creator IS '创建者'; +COMMENT ON COLUMN infra_file.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file.updater IS '更新者'; +COMMENT ON COLUMN infra_file.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file.deleted IS '是否删除'; +COMMENT ON TABLE infra_file IS '文件表'; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +CREATE TABLE infra_file_config ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(63) NOT NULL, + storage smallint NOT NULL, + remark varchar(255) DEFAULT NULL NULL, + master bit NOT NULL, + config varchar(4096) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_file_config.id IS '编号'; +COMMENT ON COLUMN infra_file_config.name IS '配置名'; +COMMENT ON COLUMN infra_file_config.storage IS '存储器'; +COMMENT ON COLUMN infra_file_config.remark IS '备注'; +COMMENT ON COLUMN infra_file_config.master IS '是否为主配置'; +COMMENT ON COLUMN infra_file_config.config IS '存储配置'; +COMMENT ON COLUMN infra_file_config.creator IS '创建者'; +COMMENT ON COLUMN infra_file_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_config.updater IS '更新者'; +COMMENT ON COLUMN infra_file_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_config IS '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT infra_file_config ON; +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (4, '数据库', 1, '我是数据库', '0', '{"@class":"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', '0'); +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (22, '七牛存储器', 20, '', '1', '{"@class":"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3.cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS","accessSecret":"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY"}', '1', '2024-01-13 22:11:12', '1', '2024-04-03 19:38:34', '0'); +COMMIT; +SET IDENTITY_INSERT infra_file_config OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +CREATE TABLE infra_file_content ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + config_id bigint NOT NULL, + path varchar(512) NOT NULL, + content varchar(10240) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_file_content.id IS '编号'; +COMMENT ON COLUMN infra_file_content.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file_content.path IS '文件路径'; +COMMENT ON COLUMN infra_file_content.content IS '文件内容'; +COMMENT ON COLUMN infra_file_content.creator IS '创建者'; +COMMENT ON COLUMN infra_file_content.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_content.updater IS '更新者'; +COMMENT ON COLUMN infra_file_content.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_content.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_content IS '文件表'; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +CREATE TABLE infra_job ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(32) NOT NULL, + status smallint NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) DEFAULT NULL NULL, + cron_expression varchar(32) NOT NULL, + retry_count int DEFAULT 0 NOT NULL, + retry_interval int DEFAULT 0 NOT NULL, + monitor_timeout int DEFAULT 0 NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_job.id IS '任务编号'; +COMMENT ON COLUMN infra_job.name IS '任务名称'; +COMMENT ON COLUMN infra_job.status IS '任务状态'; +COMMENT ON COLUMN infra_job.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job.cron_expression IS 'CRON 表达式'; +COMMENT ON COLUMN infra_job.retry_count IS '重试次数'; +COMMENT ON COLUMN infra_job.retry_interval IS '重试间隔'; +COMMENT ON COLUMN infra_job.monitor_timeout IS '监控超时时间'; +COMMENT ON COLUMN infra_job.creator IS '创建者'; +COMMENT ON COLUMN infra_job.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job.updater IS '更新者'; +COMMENT ON COLUMN infra_job.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job.deleted IS '是否删除'; +COMMENT ON TABLE infra_job IS '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT infra_job ON; +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2023-07-09 20:51:41', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 14:36:26', '1', '2023-07-22 15:39:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 15:36:23', '1', '2023-07-22 15:39:54', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-23 21:03:44', '1', '2023-07-23 21:09:00', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (21, '交易订单的自动过期 Job', 2, 'tradeOrderAutoCancelJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-25 23:43:26', '1', '2023-09-26 19:23:30', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (22, '交易订单的自动收货 Job', 2, 'tradeOrderAutoReceiveJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 19:23:53', '1', '2023-09-26 23:38:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (23, '交易订单的自动评论 Job', 2, 'tradeOrderAutoCommentJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 23:38:29', '1', '2023-09-27 11:03:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (24, '佣金解冻 Job', 2, 'brokerageRecordUnfreezeJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-28 22:01:46', '1', '2023-09-28 22:01:56', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (25, '访问日志清理 Job', 2, 'accessLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 10:59:41', '1', '2023-10-03 11:01:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (26, '错误日志清理 Job', 2, 'errorLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:00:43', '1', '2023-10-03 11:01:12', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (27, '任务日志清理 Job', 2, 'jobLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:01:33', '1', '2023-10-03 11:01:42', '0'); +COMMIT; +SET IDENTITY_INSERT infra_job OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +CREATE TABLE infra_job_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + job_id bigint NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) DEFAULT NULL NULL, + execute_index smallint DEFAULT 1 NOT NULL, + begin_time datetime NOT NULL, + end_time datetime DEFAULT NULL NULL, + duration int DEFAULT NULL NULL, + status smallint NOT NULL, + result varchar(4000) DEFAULT '' NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN infra_job_log.id IS '日志编号'; +COMMENT ON COLUMN infra_job_log.job_id IS '任务编号'; +COMMENT ON COLUMN infra_job_log.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job_log.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job_log.execute_index IS '第几次执行'; +COMMENT ON COLUMN infra_job_log.begin_time IS '开始执行时间'; +COMMENT ON COLUMN infra_job_log.end_time IS '结束执行时间'; +COMMENT ON COLUMN infra_job_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_job_log.status IS '任务状态'; +COMMENT ON COLUMN infra_job_log.result IS '结果数据'; +COMMENT ON COLUMN infra_job_log.creator IS '创建者'; +COMMENT ON COLUMN infra_job_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job_log.updater IS '更新者'; +COMMENT ON COLUMN infra_job_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job_log.deleted IS '是否删除'; +COMMENT ON TABLE infra_job_log IS '定时任务日志表'; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +CREATE TABLE system_dept ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(30) DEFAULT '' NULL, + parent_id bigint DEFAULT 0 NOT NULL, + sort int DEFAULT 0 NOT NULL, + leader_user_id bigint DEFAULT NULL NULL, + phone varchar(11) DEFAULT NULL NULL, + email varchar(50) DEFAULT NULL NULL, + status smallint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_dept.id IS '部门id'; +COMMENT ON COLUMN system_dept.name IS '部门名称'; +COMMENT ON COLUMN system_dept.parent_id IS '父部门id'; +COMMENT ON COLUMN system_dept.sort IS '显示顺序'; +COMMENT ON COLUMN system_dept.leader_user_id IS '负责人'; +COMMENT ON COLUMN system_dept.phone IS '联系电话'; +COMMENT ON COLUMN system_dept.email IS '邮箱'; +COMMENT ON COLUMN system_dept.status IS '部门状态(0正常 1停用)'; +COMMENT ON COLUMN system_dept.creator IS '创建者'; +COMMENT ON COLUMN system_dept.create_time IS '创建时间'; +COMMENT ON COLUMN system_dept.updater IS '更新者'; +COMMENT ON COLUMN system_dept.update_time IS '更新时间'; +COMMENT ON COLUMN system_dept.deleted IS '是否删除'; +COMMENT ON COLUMN system_dept.tenant_id IS '租户编号'; +COMMENT ON TABLE system_dept IS '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_dept ON; +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-11-14 23:30:36', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:53:35', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2024-03-24 20:56:04', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:15', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, '运维部门', 101, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:28:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-02-16 08:35:45', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', '0', 121); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', '0', 122); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, '产品部门', 101, 100, 1, NULL, NULL, 1, '1', '2023-12-02 09:45:13', '1', '2023-12-02 09:45:31', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, '支持部门', 102, 3, 104, NULL, NULL, 1, '1', '2023-12-02 09:47:38', '1', '2023-12-02 09:47:38', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_dept OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +CREATE TABLE system_dict_data ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + sort int DEFAULT 0 NOT NULL, + label varchar(100) DEFAULT '' NULL, + value varchar(100) DEFAULT '' NULL, + dict_type varchar(100) DEFAULT '' NULL, + status smallint DEFAULT 0 NOT NULL, + color_type varchar(100) DEFAULT '' NULL, + css_class varchar(100) DEFAULT '' NULL, + remark varchar(500) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_dict_data.id IS '字典编码'; +COMMENT ON COLUMN system_dict_data.sort IS '字典排序'; +COMMENT ON COLUMN system_dict_data.label IS '字典标签'; +COMMENT ON COLUMN system_dict_data.value IS '字典键值'; +COMMENT ON COLUMN system_dict_data.dict_type IS '字典类型'; +COMMENT ON COLUMN system_dict_data.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_data.color_type IS '颜色类型'; +COMMENT ON COLUMN system_dict_data.css_class IS 'css 样式'; +COMMENT ON COLUMN system_dict_data.remark IS '备注'; +COMMENT ON COLUMN system_dict_data.creator IS '创建者'; +COMMENT ON COLUMN system_dict_data.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_data.updater IS '更新者'; +COMMENT ON COLUMN system_dict_data.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_data.deleted IS '是否删除'; +COMMENT ON TABLE system_dict_data IS '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_dict_data ON; +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', '2022-03-29 00:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 2, '女', '2', 'system_user_sex', 0, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 23:30:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:05:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:06:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (16, 0, '其它', '0', 'infra_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (17, 1, '查询', '1', 'infra_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (18, 2, '新增', '2', 'infra_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (19, 3, '修改', '3', 'infra_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (20, 4, '删除', '4', 'infra_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (22, 5, '导出', '5', 'infra_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (23, 6, '导入', '6', 'infra_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', '2022-02-16 13:23:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:09:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', '2022-03-10 16:33:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', '2022-03-10 16:33:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', '2022-02-16 19:33:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', '2022-02-16 19:07:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', '2022-02-16 19:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', '2022-02-16 19:07:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', '2021-02-26 00:16:27', '1', '2022-02-16 10:22:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', '2021-02-26 00:16:34', '1', '2022-02-16 10:22:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (66, 1, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2024-07-22 22:23:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-16 10:26:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-16 10:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-16 10:26:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-16 10:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-16 10:28:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-16 10:28:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-16 10:28:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-16 13:11:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-16 13:11:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-16 13:11:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-16 13:11:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', '2022-02-16 10:00:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', '2022-02-16 10:00:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', '2022-02-16 10:00:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', '2021-12-03 10:40:24', '1', '2023-07-19 20:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2023-07-19 20:08:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2023-07-19 20:08:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2023-07-19 20:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2023-07-19 20:09:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', '2021-12-03 10:42:55', '1', '2023-07-19 20:09:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2023-07-19 20:09:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', '1', '2023-07-19 10:08:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', '1', '2023-07-19 10:08:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', '2023-07-19 10:08:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', '2023-07-19 18:04:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', '2023-07-19 18:05:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', '2023-07-19 18:04:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (600, 5, '首页', '1', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (601, 4, '秒杀活动页', '2', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (602, 3, '砍价活动页', '3', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (603, 2, '限时折扣页', '4', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (604, 1, '满减送页', '5', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', '2021-12-10 16:44:59', '1', '2023-07-19 10:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', '1', '2023-07-19 10:15:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:46:26', '1', '2023-07-19 10:15:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1127, 1, '审批中', '1', 'bpm_process_instance_status', 0, 'default', '', '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2024-03-16 16:11:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1128, 2, '审批通过', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2024-03-16 16:11:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1129, 1, '审批中', '1', 'bpm_task_status', 0, 'primary', '', '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2024-03-08 22:41:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1130, 2, '审批通过', '2', 'bpm_task_status', 0, 'success', '', '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1131, 3, '审批不通过', '3', 'bpm_task_status', 0, 'danger', '', '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1132, 4, '已取消', '4', 'bpm_task_status', 0, 'info', '', '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2024-03-08 22:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1135, 10, '角色', '10', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '1', '2024-03-06 02:53:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '1', '2024-03-06 02:53:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2024-03-06 02:53:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1138, 30, '用户', '30', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '1', '2024-03-06 02:53:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1139, 40, '用户组', '40', 'bpm_task_candidate_strategy', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1140, 60, '流程表达式', '60', 'bpm_task_candidate_strategy', 0, 'danger', '', '任务分配规则的类型 - 流程表达式', '103', '2022-01-12 23:34:43', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1141, 22, '岗位', '22', 'bpm_task_candidate_strategy', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '1', '2024-03-06 02:53:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', '2022-03-15 00:25:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', '2022-03-15 00:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', '2022-03-15 00:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', '2022-03-15 00:26:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', '2022-03-15 00:26:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', '2022-05-09 23:58:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', '2022-10-24 21:19:47', '1', '2022-10-24 21:20:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', '2022-10-24 21:20:54', '1', '2022-10-24 21:21:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', '2022-10-24 21:21:11', '1', '2022-10-24 21:21:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', '2022-11-01 12:46:41', '1', '2022-11-01 12:50:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', '2022-11-01 12:46:51', '1', '2022-11-01 12:50:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', '2022-11-02 00:07:34', '1', '2022-11-04 00:07:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', '2022-11-02 00:07:54', '1', '2022-11-04 00:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1169, 1, '通用劵', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', '2022-11-02 00:28:22', '1', '2023-09-28 00:27:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1170, 2, '商品劵', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', '2022-11-02 00:28:34', '1', '2023-09-28 00:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1171, 1, '未使用', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', '2022-11-04 00:15:08', '1', '2023-10-03 12:54:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', '2022-11-04 00:15:21', '1', '2022-11-04 19:16:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', '2022-11-04 00:15:43', '1', '2022-11-04 19:16:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', '2022-11-04 19:13:00', '1', '2022-11-04 19:13:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', '2022-11-04 19:13:13', '1', '2022-11-04 19:14:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', '2022-11-04 22:54:49', '1', '2022-11-04 22:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', '2022-11-04 22:55:06', '1', '2022-11-04 22:55:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', '2022-11-04 22:55:41', '1', '2022-11-04 22:55:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', '2022-11-04 22:56:10', '1', '2022-11-04 22:56:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', '2022-11-04 22:59:45', '1', '2022-11-04 22:59:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', '2022-11-04 23:00:02', '1', '2022-11-04 23:00:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', '2022-11-19 20:53:33', '1', '2022-11-19 20:54:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', '2022-11-19 20:54:36', '1', '2022-11-19 20:58:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', '2022-11-19 20:56:56', '1', '2022-11-19 20:59:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', '2022-11-19 20:59:54', '1', '2022-11-19 21:00:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', '2022-11-19 21:00:33', '1', '2022-11-19 21:00:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', '2022-11-19 21:01:29', '1', '2022-11-19 21:01:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', '2022-11-19 21:02:17', '1', '2022-11-19 21:02:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', '2022-11-19 21:02:37', '1', '2022-11-19 21:03:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', '2022-11-19 21:05:05', '1', '2022-11-19 21:38:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', '2022-11-19 21:05:32', '1', '2022-11-19 21:38:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', '2022-11-19 21:39:19', '1', '2022-11-19 21:39:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', '2022-11-19 21:39:38', '1', '2022-11-19 21:39:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', '2022-12-10 10:51:11', '1', '2022-12-10 10:51:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', '2022-12-10 10:51:30', '1', '2022-12-10 10:51:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', '2022-12-10 10:54:16', '1', '2022-12-10 10:52:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', '2022-12-10 10:54:42', '1', '2022-12-10 10:52:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', '2022-12-10 10:55:02', '1', '2022-12-10 10:59:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', '2022-12-10 16:34:14', '1', '2022-12-10 16:34:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', '2022-12-10 16:34:26', '1', '2022-12-10 16:34:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1201, 2, '拼团订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', '2022-12-10 16:34:36', '1', '2022-12-10 16:34:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1202, 3, '砍价订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', '2022-12-10 16:34:48', '1', '2022-12-10 16:34:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', '2022-12-10 16:49:29', '1', '2022-12-10 16:49:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', '2022-12-10 16:49:53', '1', '2022-12-10 16:51:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', '2022-12-10 16:50:13', '1', '2022-12-10 16:51:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1209, 10, '售后中', '10', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2024-07-21 17:01:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1210, 20, '已退款', '20', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2024-07-21 17:01:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:20:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:21:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:23:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', '2023-01-26 09:53:49', '1', '2023-01-26 16:36:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', '2023-01-26 09:54:28', '1', '2023-01-26 16:36:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', '2023-01-26 09:54:50', '1', '2023-01-26 16:36:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', '2023-01-26 09:55:06', '1', '2023-01-26 16:36:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', '2023-01-28 10:35:59', '1', '2023-01-28 10:35:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', '2023-01-28 10:36:20', '1', '2023-01-28 10:36:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', '2023-02-18 23:32:24', '1', '2023-07-19 20:09:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:03:55', '1', '2023-04-13 00:03:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1335, 11, '订单积分抵扣', '11', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-10-11 07:41:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-08-20 11:59:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', '2023-07-19 18:05:37', '1', '2023-07-19 18:05:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', '2023-07-19 18:10:47', '1', '2023-07-19 18:11:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', '2023-07-19 18:11:05', '1', '2023-07-19 18:11:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', '2023-07-19 20:07:47', '1', '2023-07-19 20:09:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', '2023-07-19 20:08:06', '1', '2023-07-19 20:09:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', '2023-07-20 12:23:17', '1', '2023-07-20 12:23:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', '2023-07-20 12:23:26', '1', '2023-07-20 12:23:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', '2023-07-29 11:10:51', '1', '2023-07-29 03:14:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1349, 12, '订单积分抵扣(整单取消)', '12', 'member_point_biz_type', 0, '', '', '', '1', '2023-08-20 12:00:03', '1', '2023-10-11 07:42:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1352, 11, '下单奖励', '11', 'member_experience_biz_type', 0, 'success', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1353, 12, '下单奖励(整单取消)', '12', 'member_experience_biz_type', 0, 'warning', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:04:55', '1', '2023-08-23 00:04:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:05:05', '1', '2023-08-23 00:05:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1358, 3, '品类劵', '3', 'promotion_product_scope', 0, 'default', '', '', '1', '2023-09-01 23:43:07', '1', '2023-09-28 00:27:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1359, 1, '人人分销', '1', 'brokerage_enabled_condition', 0, '', '', '所有用户都可以分销', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1360, 2, '指定分销', '2', 'brokerage_enabled_condition', 0, '', '', '仅可后台手动设置推广员', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1361, 1, '首次绑定', '1', 'brokerage_bind_mode', 0, '', '', '只要用户没有推广人,随时都可以绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1362, 2, '注册绑定', '2', 'brokerage_bind_mode', 0, '', '', '仅新用户注册时才能绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1363, 3, '覆盖绑定', '3', 'brokerage_bind_mode', 0, '', '', '如果用户已经有推广人,推广人会被变更', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1364, 1, '钱包', '1', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1365, 2, '银行卡', '2', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1366, 3, '微信', '3', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1367, 4, '支付宝', '4', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1368, 1, '订单返佣', '1', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1369, 2, '申请提现', '2', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1370, 3, '申请提现驳回', '3', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1371, 0, '待结算', '0', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1372, 1, '已结算', '1', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1373, 2, '已取消', '2', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1374, 0, '审核中', '0', 'brokerage_withdraw_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1375, 10, '审核通过', '10', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1376, 11, '提现成功', '11', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1377, 20, '审核不通过', '20', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1378, 21, '提现失败', '21', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1379, 0, '工商银行', '0', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1380, 1, '建设银行', '1', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1381, 2, '农业银行', '2', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1382, 3, '中国银行', '3', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1383, 4, '交通银行', '4', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1384, 5, '招商银行', '5', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1385, 21, '钱包', 'wallet', 'pay_channel_code', 0, 'primary', '', '', '1', '2023-10-01 21:46:19', '1', '2023-10-01 21:48:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1386, 1, '砍价中', '1', 'promotion_bargain_record_status', 0, 'default', '', '', '1', '2023-10-05 10:41:26', '1', '2023-10-05 10:41:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1387, 2, '砍价成功', '2', 'promotion_bargain_record_status', 0, 'success', '', '', '1', '2023-10-05 10:41:39', '1', '2023-10-05 10:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1388, 3, '砍价失败', '3', 'promotion_bargain_record_status', 0, 'warning', '', '', '1', '2023-10-05 10:41:57', '1', '2023-10-05 10:41:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1389, 1, '拼团中', '1', 'promotion_combination_record_status', 0, '', '', '', '1', '2023-10-08 07:24:44', '1', '2023-10-08 07:24:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1390, 2, '拼团成功', '2', 'promotion_combination_record_status', 0, 'success', '', '', '1', '2023-10-08 07:24:56', '1', '2023-10-08 07:24:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1391, 3, '拼团失败', '3', 'promotion_combination_record_status', 0, 'warning', '', '', '1', '2023-10-08 07:25:11', '1', '2023-10-08 07:25:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1392, 2, '管理员修改', '2', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:41:34', '1', '2023-10-11 07:41:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1393, 13, '订单积分抵扣(单个退款)', '13', 'member_point_biz_type', 0, '', '', '', '1', '2023-10-11 07:42:29', '1', '2023-10-11 07:42:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1394, 21, '订单积分奖励', '21', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:44', '1', '2023-10-11 07:42:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1395, 22, '订单积分奖励(整单取消)', '22', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:55', '1', '2023-10-11 07:43:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1396, 23, '订单积分奖励(单个退款)', '23', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:43:16', '1', '2023-10-11 07:43:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1397, 13, '下单奖励(单个退款)', '13', 'member_experience_biz_type', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1398, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1399, 6, '支付宝', '6', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:38', '1', '2023-10-18 21:55:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1400, 7, '微信支付', '7', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:53', '1', '2023-10-18 21:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1401, 8, '其他', '8', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1402, 1, 'IT', '1', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:15', '1', '2024-02-18 23:30:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1403, 2, '金融业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:29', '1', '2024-02-18 23:30:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1404, 3, '房地产', '3', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:41', '1', '2024-02-18 23:30:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1405, 4, '商业服务', '4', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:54', '1', '2024-02-18 23:30:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1406, 5, '运输/物流', '5', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:03', '1', '2024-02-18 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1407, 6, '生产', '6', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:13', '1', '2024-02-18 23:31:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1408, 7, '政府', '7', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:27', '1', '2024-02-18 23:31:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1409, 8, '文化传媒', '8', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:37', '1', '2024-02-18 23:31:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', '2023-10-28 23:07:13', '1', '2023-10-28 23:07:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', '2023-10-28 23:07:35', '1', '2023-10-28 23:07:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', '2023-10-28 23:07:53', '1', '2023-10-28 23:07:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:29', '1', '2023-10-28 23:08:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:39', '1', '2023-10-28 23:08:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:47', '1', '2023-10-28 23:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:58', '1', '2023-10-28 23:08:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:12', '1', '2023-10-28 23:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:22', '1', '2023-10-28 23:09:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:39', '1', '2023-10-28 23:09:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:04', '1', '2023-10-28 23:10:04', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:18', '1', '2023-10-28 23:10:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:33', '1', '2023-10-28 23:10:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1435, 10, 'Gitee', '10', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:42', '1', '2023-11-04 13:04:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1436, 20, '钉钉', '20', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:54', '1', '2023-11-04 13:04:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1437, 30, '企业微信', '30', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:09', '1', '2023-11-04 13:05:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1438, 31, '微信公众平台', '31', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:18', '1', '2023-11-04 13:05:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1439, 32, '微信开放平台', '32', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:30', '1', '2023-11-04 13:05:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1440, 34, '微信小程序', '34', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:38', '1', '2023-11-04 13:07:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1441, 1, '上架', '1', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:34', '1', '2023-10-30 21:49:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1442, 0, '下架', '0', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:13', '1', '2023-10-30 21:49:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1443, 15, '子表', '15', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-13 23:06:16', '1', '2023-11-13 23:06:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1444, 10, '主表(标准模式)', '10', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:32:49', '1', '2023-11-14 12:32:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1445, 11, '主表(ERP 模式)', '11', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:33:05', '1', '2023-11-14 12:33:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1446, 12, '主表(内嵌模式)', '12', 'infra_codegen_template_type', 0, '', '', '', '1', '2023-11-14 12:33:31', '1', '2023-11-14 12:33:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1447, 1, '负责人', '1', 'crm_permission_level', 0, 'default', '', '', '1', '2023-11-30 09:53:12', '1', '2023-11-30 09:53:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1448, 2, '只读', '2', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:29', '1', '2023-11-30 09:53:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1449, 3, '读写', '3', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:36', '1', '2023-11-30 09:53:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1450, 0, '未提交', '0', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:56:59', '1', '2023-11-30 18:56:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1451, 10, '审批中', '10', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:10', '1', '2023-11-30 18:57:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1452, 20, '审核通过', '20', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:24', '1', '2023-11-30 18:57:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1453, 30, '审核不通过', '30', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:32', '1', '2023-11-30 18:57:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1454, 40, '已取消', '40', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:42', '1', '2023-11-30 18:57:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1456, 1, '支票', '1', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:29', '1', '2023-10-18 21:54:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1464, 4, '把', '4', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:05', '1', '2023-12-05 23:03:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1465, 5, '枚', '5', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:14', '1', '2023-12-05 23:03:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1466, 6, '瓶', '6', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:20', '1', '2023-12-05 23:03:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1467, 7, '盒', '7', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:30', '1', '2023-12-05 23:03:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1468, 8, '台', '8', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:41', '1', '2023-12-05 23:03:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1469, 9, '吨', '9', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:48', '1', '2023-12-05 23:03:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1470, 10, '千克', '10', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:03', '1', '2023-12-05 23:04:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1471, 11, '米', '11', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:12', '1', '2023-12-05 23:04:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1472, 12, '箱', '12', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:25', '1', '2023-12-05 23:04:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1473, 13, '套', '13', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:34', '1', '2023-12-05 23:04:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1474, 1, '打电话', '1', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:20', '1', '2024-01-15 20:48:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1475, 2, '发短信', '2', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:31', '1', '2024-01-15 20:48:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1476, 3, '上门拜访', '3', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:07', '1', '2024-01-15 20:49:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1477, 4, '微信沟通', '4', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:15', '1', '2024-01-15 20:49:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1478, 4, '钱包余额', '4', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:37', '1', '2023-10-28 16:28:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1479, 3, '银行卡', '3', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:28:21', '1', '2023-10-28 16:28:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1480, 2, '微信余额', '2', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:07', '1', '2023-10-28 16:28:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1481, 1, '支付宝余额', '1', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:27:44', '1', '2023-10-28 16:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1482, 4, '转账失败', '30', 'pay_transfer_status', 0, 'warning', '', '', '1', '2023-10-28 16:24:16', '1', '2023-10-28 16:24:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1483, 3, '转账成功', '20', 'pay_transfer_status', 0, 'success', '', '', '1', '2023-10-28 16:23:50', '1', '2023-10-28 16:23:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1484, 2, '转账进行中', '10', 'pay_transfer_status', 0, 'info', '', '', '1', '2023-10-28 16:23:12', '1', '2023-10-28 16:23:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1485, 1, '等待转账', '0', 'pay_transfer_status', 0, 'default', '', '', '1', '2023-10-28 16:21:43', '1', '2023-10-28 16:23:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1486, 10, '其它入库', '10', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:07:25', '1', '2024-02-05 18:07:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1487, 11, '其它入库(作废)', '11', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:08:07', '1', '2024-02-05 19:20:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1488, 20, '其它出库', '20', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:08:51', '1', '2024-02-05 18:08:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1489, 21, '其它出库(作废)', '21', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:09:00', '1', '2024-02-05 19:20:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1490, 10, '未审核', '10', 'erp_audit_status', 0, 'default', '', '', '1', '2024-02-06 00:00:21', '1', '2024-02-06 00:00:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1491, 20, '已审核', '20', 'erp_audit_status', 0, 'success', '', '', '1', '2024-02-06 00:00:35', '1', '2024-02-06 00:00:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1492, 30, '调拨入库', '30', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:19', '1', '2024-02-07 12:36:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1493, 31, '调拨入库(作废)', '31', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:29', '1', '2024-02-07 20:37:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1494, 32, '调拨出库', '32', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:38', '1', '2024-02-07 12:36:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1495, 33, '调拨出库(作废)', '33', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:49', '1', '2024-02-07 20:37:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1496, 40, '盘盈入库', '40', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:53:00', '1', '2024-02-08 08:53:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1497, 41, '盘盈入库(作废)', '41', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:53:39', '1', '2024-02-16 19:40:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1498, 42, '盘亏出库', '42', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:54:16', '1', '2024-02-08 08:54:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1499, 43, '盘亏出库(作废)', '43', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:54:31', '1', '2024-02-16 19:40:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1500, 50, '销售出库', '50', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-11 21:47:25', '1', '2024-02-11 21:50:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1501, 51, '销售出库(作废)', '51', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-11 21:47:37', '1', '2024-02-11 21:51:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1502, 60, '销售退货入库', '60', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-12 06:51:05', '1', '2024-02-12 06:51:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1503, 61, '销售退货入库(作废)', '61', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-12 06:51:18', '1', '2024-02-12 06:51:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1504, 70, '采购入库', '70', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:02', '1', '2024-02-16 13:10:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1505, 71, '采购入库(作废)', '71', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:10', '1', '2024-02-16 19:40:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1506, 80, '采购退货出库', '80', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:17', '1', '2024-02-16 13:10:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1507, 81, '采购退货出库(作废)', '81', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:26', '1', '2024-02-16 19:40:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1509, 3, '审批不通过', '3', 'bpm_process_instance_status', 0, 'danger', '', '', '1', '2024-03-16 16:12:06', '1', '2024-03-16 16:12:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1510, 4, '已取消', '4', 'bpm_process_instance_status', 0, 'warning', '', '', '1', '2024-03-16 16:12:22', '1', '2024-03-16 16:12:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1511, 5, '已退回', '5', 'bpm_task_status', 0, 'warning', '', '', '1', '2024-03-16 19:10:46', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1512, 6, '委派中', '6', 'bpm_task_status', 0, 'primary', '', '', '1', '2024-03-17 10:06:22', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1513, 7, '审批通过中', '7', 'bpm_task_status', 0, 'success', '', '', '1', '2024-03-17 10:06:47', '1', '2024-03-08 22:41:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1514, 0, '待审批', '0', 'bpm_task_status', 0, 'info', '', '', '1', '2024-03-17 10:07:11', '1', '2024-03-08 22:41:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1515, 35, '发起人自选', '35', 'bpm_task_candidate_strategy', 0, '', '', '', '1', '2024-03-22 19:45:16', '1', '2024-03-22 19:45:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1516, 1, '执行监听器', 'execution', 'bpm_process_listener_type', 0, 'primary', '', '', '1', '2024-03-23 12:54:03', '1', '2024-03-23 19:14:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1517, 1, '任务监听器', 'task', 'bpm_process_listener_type', 0, 'success', '', '', '1', '2024-03-23 12:54:13', '1', '2024-03-23 19:14:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1526, 1, 'Java 类', 'class', 'bpm_process_listener_value_type', 0, 'primary', '', '', '1', '2024-03-23 15:08:45', '1', '2024-03-23 19:14:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1527, 2, '表达式', 'expression', 'bpm_process_listener_value_type', 0, 'success', '', '', '1', '2024-03-23 15:09:06', '1', '2024-03-23 19:14:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1528, 3, '代理表达式', 'delegateExpression', 'bpm_process_listener_value_type', 0, 'info', '', '', '1', '2024-03-23 15:11:23', '1', '2024-03-23 19:14:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1529, 1, '天', '1', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:26', '1', '2024-03-29 22:50:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1530, 2, '周', '2', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:36', '1', '2024-03-29 22:50:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1531, 3, '月', '3', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:46', '1', '2024-03-29 22:50:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1532, 4, '季度', '4', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:01', '1', '2024-03-29 22:51:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1533, 5, '年', '5', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:07', '1', '2024-03-29 22:51:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1534, 1, '赢单', '1', 'crm_business_end_status_type', 0, 'success', '', '', '1', '2024-04-13 23:26:57', '1', '2024-04-13 23:26:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1535, 2, '输单', '2', 'crm_business_end_status_type', 0, 'primary', '', '', '1', '2024-04-13 23:27:31', '1', '2024-04-13 23:27:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1536, 3, '无效', '3', 'crm_business_end_status_type', 0, 'info', '', '', '1', '2024-04-13 23:27:59', '1', '2024-04-13 23:27:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1537, 1, 'OpenAI', 'OpenAI', 'ai_platform', 0, '', '', '', '1', '2024-05-09 22:33:47', '1', '2024-05-09 22:58:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1538, 2, 'Ollama', 'Ollama', 'ai_platform', 0, '', '', '', '1', '2024-05-17 23:02:55', '1', '2024-05-17 23:02:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1539, 3, '文心一言', 'YiYan', 'ai_platform', 0, '', '', '', '1', '2024-05-18 09:24:20', '1', '2024-05-18 09:29:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1540, 4, '讯飞星火', 'XingHuo', 'ai_platform', 0, '', '', '', '1', '2024-05-18 10:08:56', '1', '2024-05-18 10:08:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1541, 5, '通义千问', 'TongYi', 'ai_platform', 0, '', '', '', '1', '2024-05-18 10:32:29', '1', '2024-07-06 15:42:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1542, 6, 'StableDiffusion', 'StableDiffusion', 'ai_platform', 0, '', '', '', '1', '2024-06-01 15:09:31', '1', '2024-06-01 15:10:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1543, 10, '进行中', '10', 'ai_image_status', 0, 'primary', '', '', '1', '2024-06-26 20:51:41', '1', '2024-06-26 20:52:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1544, 20, '已完成', '20', 'ai_image_status', 0, 'success', '', '', '1', '2024-06-26 20:52:07', '1', '2024-06-26 20:52:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1545, 30, '已失败', '30', 'ai_image_status', 0, 'warning', '', '', '1', '2024-06-26 20:52:25', '1', '2024-06-26 20:52:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1546, 7, 'Midjourney', 'Midjourney', 'ai_platform', 0, '', '', '', '1', '2024-06-26 22:14:46', '1', '2024-06-26 22:14:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1547, 10, '进行中', '10', 'ai_music_status', 0, 'primary', '', '', '1', '2024-06-27 22:45:22', '1', '2024-06-28 00:56:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1548, 20, '已完成', '20', 'ai_music_status', 0, 'success', '', '', '1', '2024-06-27 22:45:33', '1', '2024-06-28 00:56:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1549, 30, '已失败', '30', 'ai_music_status', 0, 'danger', '', '', '1', '2024-06-27 22:45:44', '1', '2024-06-28 00:56:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1550, 1, '歌词模式', '1', 'ai_generate_mode', 0, '', '', '', '1', '2024-06-27 22:46:31', '1', '2024-06-28 01:22:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1551, 2, '描述模式', '2', 'ai_generate_mode', 0, '', '', '', '1', '2024-06-27 22:46:37', '1', '2024-06-28 01:22:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1552, 8, 'Suno', 'Suno', 'ai_platform', 0, '', '', '', '1', '2024-06-29 09:13:36', '1', '2024-06-29 09:13:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1553, 9, 'DeepSeek', 'DeepSeek', 'ai_platform', 0, '', '', '', '1', '2024-07-06 12:04:30', '1', '2024-07-06 12:05:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1554, 10, '智谱', 'ZhiPu', 'ai_platform', 0, '', '', '', '1', '2024-07-06 18:00:35', '1', '2024-07-06 18:00:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1555, 4, '长', '4', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:49:03', '1', '2024-07-07 15:49:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1556, 5, '段落', '5', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:49:54', '1', '2024-07-07 15:49:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1557, 6, '文章', '6', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:05', '1', '2024-07-07 15:50:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1558, 7, '博客文章', '7', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:23', '1', '2024-07-07 15:50:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1559, 8, '想法', '8', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:31', '1', '2024-07-07 15:50:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1560, 9, '大纲', '9', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:37', '1', '2024-07-07 15:50:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1561, 1, '自动', '1', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:06', '1', '2024-07-07 15:51:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1562, 2, '友善', '2', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:19', '1', '2024-07-07 15:51:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1563, 3, '随意', '3', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:27', '1', '2024-07-07 15:51:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1564, 4, '友好', '4', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:37', '1', '2024-07-07 15:51:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1565, 5, '专业', '5', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:49', '1', '2024-07-07 15:52:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1566, 6, '诙谐', '6', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:52:15', '1', '2024-07-07 15:52:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1567, 7, '有趣', '7', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:52:24', '1', '2024-07-07 15:52:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1568, 8, '正式', '8', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:54:33', '1', '2024-07-07 15:54:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1569, 5, '段落', '5', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:49:54', '1', '2024-07-07 15:49:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1570, 1, '自动', '1', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:19:34', '1', '2024-07-07 15:19:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1571, 2, '电子邮件', '2', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:19:50', '1', '2024-07-07 15:49:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1572, 3, '消息', '3', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:20:01', '1', '2024-07-07 15:49:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1573, 4, '评论', '4', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:20:13', '1', '2024-07-07 15:49:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1574, 1, '自动', '1', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:18', '1', '2024-07-07 15:44:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1575, 2, '中文', '2', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:28', '1', '2024-07-07 15:44:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1576, 3, '英文', '3', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:37', '1', '2024-07-07 15:44:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1577, 4, '韩语', '4', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:46:28', '1', '2024-07-07 15:46:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1578, 5, '日语', '5', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:46:44', '1', '2024-07-07 15:46:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1579, 1, '自动', '1', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:34', '1', '2024-07-07 15:48:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1580, 2, '短', '2', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:44', '1', '2024-07-07 15:48:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1581, 3, '中等', '3', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:52', '1', '2024-07-07 15:48:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1582, 4, '长', '4', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:49:03', '1', '2024-07-07 15:49:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1584, 1, '撰写', '1', 'ai_write_type', 0, '', '', '', '1', '2024-07-10 21:26:00', '1', '2024-07-10 21:26:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1585, 2, '回复', '2', 'ai_write_type', 0, '', '', '', '1', '2024-07-10 21:26:06', '1', '2024-07-10 21:26:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1586, 2, '腾讯云', 'TENCENT', 'system_sms_channel_code', 0, '', '', '', '1', '2024-07-22 22:23:16', '1', '2024-07-22 22:23:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1587, 3, '华为云', 'HUAWEI', 'system_sms_channel_code', 0, '', '', '', '1', '2024-07-22 22:23:46', '1', '2024-07-22 22:23:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1588, 1, 'OpenAI 微软', 'AzureOpenAI', 'ai_platform', 0, '', '', '', '1', '2024-08-10 14:07:41', '1', '2024-08-10 14:07:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1589, 10, 'BPMN 设计器', '10', 'bpm_model_type', 0, 'primary', '', '', '1', '2024-08-26 15:22:17', '1', '2024-08-26 16:46:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1590, 20, 'SIMPLE 设计器', '20', 'bpm_model_type', 0, 'success', '', '', '1', '2024-08-26 15:22:27', '1', '2024-08-26 16:45:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1591, 4, '七牛云', 'QINIU', 'system_sms_channel_code', 0, '', '', '', '1', '2024-08-31 08:45:03', '1', '2024-08-31 08:45:24', '0'); +COMMIT; +SET IDENTITY_INSERT system_dict_data OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +CREATE TABLE system_dict_type ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(100) DEFAULT '' NULL, + type varchar(100) DEFAULT '' NULL, + status smallint DEFAULT 0 NOT NULL, + remark varchar(500) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + deleted_time datetime DEFAULT NULL NULL +); + +COMMENT ON COLUMN system_dict_type.id IS '字典主键'; +COMMENT ON COLUMN system_dict_type.name IS '字典名称'; +COMMENT ON COLUMN system_dict_type.type IS '字典类型'; +COMMENT ON COLUMN system_dict_type.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_type.remark IS '备注'; +COMMENT ON COLUMN system_dict_type.creator IS '创建者'; +COMMENT ON COLUMN system_dict_type.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_type.updater IS '更新者'; +COMMENT ON COLUMN system_dict_type.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_type.deleted IS '是否删除'; +COMMENT ON COLUMN system_dict_type.deleted_time IS '删除时间'; +COMMENT ON TABLE system_dict_type IS '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_dict_type ON; +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-05-16 20:29:32', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (9, '操作类型', 'infra_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '1', '2022-05-16 20:26:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2023-07-10 10:11:39', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', '2021-12-03 10:53:29', '1', '2023-07-19 18:09:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2023-07-19 10:13:17', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (140, '流程实例的结果', 'bpm_task_status', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2024-03-08 22:42:03', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (142, '任务分配规则的类型', 'bpm_task_candidate_strategy', 0, 'BPM 任务的候选人的策略', '103', '2022-01-12 23:21:04', '103', '2024-03-06 02:53:59', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', '2022-03-10 16:33:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', '2022-03-15 00:24:38', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', '2022-10-24 21:19:04', '1', '2022-10-24 21:19:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', '2022-11-01 12:46:06', '1', '2022-11-01 12:46:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', '2022-11-02 00:06:20', '1', '2022-11-04 00:08:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', '2022-11-02 00:28:01', '1', '2022-11-02 00:28:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', '2022-11-04 00:14:49', '1', '2022-11-04 00:14:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', '2022-11-04 19:12:27', '1', '2022-11-04 19:12:27', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', '2022-11-04 22:54:23', '1', '2022-11-04 22:54:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', '2022-11-04 22:59:23', '1', '2022-11-04 22:59:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', '2022-11-19 20:52:56', '1', '2022-11-19 20:52:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', '2022-11-19 21:04:09', '1', '2022-11-19 21:04:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', '2022-11-19 21:39:04', '1', '2022-11-19 21:39:04', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (160, '终端', 'terminal', 0, '终端', '1', '2022-12-10 10:50:50', '1', '2022-12-10 10:53:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', '2022-12-10 16:33:54', '1', '2022-12-10 16:33:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', '2022-12-10 16:48:44', '1', '2022-12-10 16:48:44', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', '2022-12-10 20:58:08', '1', '2022-12-10 20:58:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', '2023-01-16 23:29:56', '1', '2023-01-16 23:29:56', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', '2023-01-17 22:17:09', '1', '2023-01-17 22:17:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', '2023-07-20 12:23:03', '1', '2023-07-20 12:23:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', '2023-08-23 00:03:14', '1', '2023-08-23 00:03:14', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (176, '分佣模式', 'brokerage_enabled_condition', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (177, '分销关系绑定模式', 'brokerage_bind_mode', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (178, '佣金提现类型', 'brokerage_withdraw_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (179, '佣金记录业务类型', 'brokerage_record_biz_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (180, '佣金记录状态', 'brokerage_record_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (181, '佣金提现状态', 'brokerage_withdraw_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (182, '佣金提现银行', 'brokerage_bank_name', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (183, '砍价记录的状态', 'promotion_bargain_record_status', 0, '', '1', '2023-10-05 10:41:08', '1', '2023-10-05 10:41:08', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (184, '拼团记录的状态', 'promotion_combination_record_status', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-10-08 07:24:25', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (185, '回款-回款方式', 'crm_receivable_return_type', 0, '回款-回款方式', '1', '2023-10-18 21:54:10', '1', '2023-10-18 21:54:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (186, 'CRM 客户行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', '2023-10-28 22:57:07', '1', '2024-02-18 23:30:22', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', '2023-10-28 22:59:12', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', '2023-10-28 23:00:34', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (600, 'Banner 位置', 'promotion_banner_position', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-11-04 13:04:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (601, '社交类型', 'system_social_type', 0, '', '1', '2023-11-04 13:03:54', '1', '2023-11-04 13:03:54', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (604, '产品状态', 'crm_product_status', 0, '', '1', '2023-10-30 21:47:59', '1', '2023-10-30 21:48:45', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (605, 'CRM 数据权限的级别', 'crm_permission_level', 0, '', '1', '2023-11-30 09:51:59', '1', '2023-11-30 09:51:59', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (606, 'CRM 审批状态', 'crm_audit_status', 0, '', '1', '2023-11-30 18:56:23', '1', '2023-11-30 18:56:23', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (607, 'CRM 产品单位', 'crm_product_unit', 0, '', '1', '2023-12-05 23:01:51', '1', '2023-12-05 23:01:51', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (608, 'CRM 跟进方式', 'crm_follow_up_type', 0, '', '1', '2024-01-15 20:48:05', '1', '2024-01-15 20:48:05', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (609, '支付转账类型', 'pay_transfer_type', 0, '', '1', '2023-10-28 16:27:18', '1', '2023-10-28 16:27:18', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (610, '转账订单状态', 'pay_transfer_status', 0, '', '1', '2023-10-28 16:18:32', '1', '2023-10-28 16:18:32', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (611, 'ERP 库存明细的业务类型', 'erp_stock_record_biz_type', 0, 'ERP 库存明细的业务类型', '1', '2024-02-05 18:07:02', '1', '2024-02-05 18:07:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (612, 'ERP 审批状态', 'erp_audit_status', 0, '', '1', '2024-02-06 00:00:07', '1', '2024-02-06 00:00:07', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (613, 'BPM 监听器类型', 'bpm_process_listener_type', 0, '', '1', '2024-03-23 12:52:24', '1', '2024-03-09 15:54:28', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (615, 'BPM 监听器值类型', 'bpm_process_listener_value_type', 0, '', '1', '2024-03-23 13:00:31', '1', '2024-03-23 13:00:31', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (616, '时间间隔', 'date_interval', 0, '', '1', '2024-03-29 22:50:09', '1', '2024-03-29 22:50:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (619, 'CRM 商机结束状态类型', 'crm_business_end_status_type', 0, '', '1', '2024-04-13 23:23:00', '1', '2024-04-13 23:23:00', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (620, 'AI 模型平台', 'ai_platform', 0, '', '1', '2024-05-09 22:27:38', '1', '2024-05-09 22:27:38', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (621, 'AI 绘画状态', 'ai_image_status', 0, '', '1', '2024-06-26 20:51:23', '1', '2024-06-26 20:51:23', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (622, 'AI 音乐状态', 'ai_music_status', 0, '', '1', '2024-06-27 22:45:07', '1', '2024-06-28 00:56:27', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (623, 'AI 音乐生成模式', 'ai_generate_mode', 0, '', '1', '2024-06-27 22:46:21', '1', '2024-06-28 01:22:29', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (624, '写作语气', 'ai_write_tone', 0, '', '1', '2024-07-07 15:19:02', '1', '2024-07-07 15:19:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (625, '写作语言', 'ai_write_language', 0, '', '1', '2024-07-07 15:18:52', '1', '2024-07-07 15:18:52', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (626, '写作长度', 'ai_write_length', 0, '', '1', '2024-07-07 15:18:41', '1', '2024-07-07 15:18:41', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (627, '写作格式', 'ai_write_format', 0, '', '1', '2024-07-07 15:14:34', '1', '2024-07-07 15:14:34', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (628, 'AI 写作类型', 'ai_write_type', 0, '', '1', '2024-07-10 21:25:29', '1', '2024-07-10 21:25:29', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (629, 'BPM 流程模型类型', 'bpm_model_type', 0, '', '1', '2024-08-26 15:21:43', '1', '2024-08-26 15:21:43', '0', '1970-01-01 00:00:00'); +COMMIT; +SET IDENTITY_INSERT system_dict_type OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +CREATE TABLE system_login_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + log_type bigint NOT NULL, + trace_id varchar(64) DEFAULT '' NULL, + user_id bigint DEFAULT 0 NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + username varchar(50) DEFAULT '' NULL, + result smallint NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_login_log.id IS '访问ID'; +COMMENT ON COLUMN system_login_log.log_type IS '日志类型'; +COMMENT ON COLUMN system_login_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_login_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_login_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_login_log.username IS '用户账号'; +COMMENT ON COLUMN system_login_log.result IS '登陆结果'; +COMMENT ON COLUMN system_login_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_login_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_login_log.creator IS '创建者'; +COMMENT ON COLUMN system_login_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_login_log.updater IS '更新者'; +COMMENT ON COLUMN system_login_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_login_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_login_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_login_log IS '系统访问记录'; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +CREATE TABLE system_mail_account ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + mail varchar(255) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NOT NULL, + host varchar(255) NOT NULL, + port int NOT NULL, + ssl_enable bit DEFAULT '0' NOT NULL, + starttls_enable bit DEFAULT '0' NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_mail_account.id IS '主键'; +COMMENT ON COLUMN system_mail_account.mail IS '邮箱'; +COMMENT ON COLUMN system_mail_account.username IS '用户名'; +COMMENT ON COLUMN system_mail_account.password IS '密码'; +COMMENT ON COLUMN system_mail_account.host IS 'SMTP 服务器域名'; +COMMENT ON COLUMN system_mail_account.port IS 'SMTP 服务器端口'; +COMMENT ON COLUMN system_mail_account.ssl_enable IS '是否开启 SSL'; +COMMENT ON COLUMN system_mail_account.starttls_enable IS '是否开启 STARTTLS'; +COMMENT ON COLUMN system_mail_account.creator IS '创建者'; +COMMENT ON COLUMN system_mail_account.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_account.updater IS '更新者'; +COMMENT ON COLUMN system_mail_account.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_account.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_account IS '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_mail_account ON; +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, '0', '0', '1', '2023-01-25 17:39:52', '1', '2024-07-27 22:39:12', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, '1', '0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, '0', '0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', '1'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, '1', '0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', '1'); +COMMIT; +SET IDENTITY_INSERT system_mail_account OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +CREATE TABLE system_mail_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint DEFAULT NULL NULL, + user_type smallint DEFAULT NULL NULL, + to_mail varchar(255) NOT NULL, + account_id bigint NOT NULL, + from_mail varchar(255) NOT NULL, + template_id bigint NOT NULL, + template_code varchar(63) NOT NULL, + template_nickname varchar(255) DEFAULT NULL NULL, + template_title varchar(255) NOT NULL, + template_content varchar(10240) NOT NULL, + template_params varchar(255) NOT NULL, + send_status smallint DEFAULT 0 NOT NULL, + send_time datetime DEFAULT NULL NULL, + send_message_id varchar(255) DEFAULT NULL NULL, + send_exception varchar(4096) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_mail_log.id IS '编号'; +COMMENT ON COLUMN system_mail_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_mail_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_mail_log.to_mail IS '接收邮箱地址'; +COMMENT ON COLUMN system_mail_log.account_id IS '邮箱账号编号'; +COMMENT ON COLUMN system_mail_log.from_mail IS '发送邮箱地址'; +COMMENT ON COLUMN system_mail_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_mail_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_mail_log.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_mail_log.template_title IS '邮件标题'; +COMMENT ON COLUMN system_mail_log.template_content IS '邮件内容'; +COMMENT ON COLUMN system_mail_log.template_params IS '邮件参数'; +COMMENT ON COLUMN system_mail_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_mail_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_mail_log.send_message_id IS '发送返回的消息 ID'; +COMMENT ON COLUMN system_mail_log.send_exception IS '发送异常'; +COMMENT ON COLUMN system_mail_log.creator IS '创建者'; +COMMENT ON COLUMN system_mail_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_log.updater IS '更新者'; +COMMENT ON COLUMN system_mail_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_log.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_log IS '邮件日志表'; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +CREATE TABLE system_mail_template ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(63) NOT NULL, + code varchar(63) NOT NULL, + account_id bigint NOT NULL, + nickname varchar(255) DEFAULT NULL NULL, + title varchar(255) NOT NULL, + content varchar(10240) NOT NULL, + params varchar(255) NOT NULL, + status smallint NOT NULL, + remark varchar(255) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_mail_template.id IS '编号'; +COMMENT ON COLUMN system_mail_template.name IS '模板名称'; +COMMENT ON COLUMN system_mail_template.code IS '模板编码'; +COMMENT ON COLUMN system_mail_template.account_id IS '发送的邮箱账号编号'; +COMMENT ON COLUMN system_mail_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_mail_template.title IS '模板标题'; +COMMENT ON COLUMN system_mail_template.content IS '模板内容'; +COMMENT ON COLUMN system_mail_template.params IS '参数数组'; +COMMENT ON COLUMN system_mail_template.status IS '开启状态'; +COMMENT ON COLUMN system_mail_template.remark IS '备注'; +COMMENT ON COLUMN system_mail_template.creator IS '创建者'; +COMMENT ON COLUMN system_mail_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_template.updater IS '更新者'; +COMMENT ON COLUMN system_mail_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_template.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_template IS '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_mail_template ON; +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '["code","name"]', 0, '3', '1', '2021-10-11 08:10:00', '1', '2023-12-02 19:51:14', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '["key01","key02"]', 0, NULL, '1', '2023-01-26 01:27:40', '1', '2023-01-27 10:32:16', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', '2023-01-27 15:50:35', '1', '2023-01-27 16:34:49', '0'); +COMMIT; +SET IDENTITY_INSERT system_mail_template OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +CREATE TABLE system_menu ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(50) NOT NULL, + permission varchar(100) DEFAULT '' NULL, + type smallint NOT NULL, + sort int DEFAULT 0 NOT NULL, + parent_id bigint DEFAULT 0 NOT NULL, + path varchar(200) DEFAULT '' NULL, + icon varchar(100) DEFAULT '#' NULL, + component varchar(255) DEFAULT NULL NULL, + component_name varchar(255) DEFAULT NULL NULL, + status smallint DEFAULT 0 NOT NULL, + visible bit DEFAULT '1' NOT NULL, + keep_alive bit DEFAULT '1' NOT NULL, + always_show bit DEFAULT '1' NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_menu.id IS '菜单ID'; +COMMENT ON COLUMN system_menu.name IS '菜单名称'; +COMMENT ON COLUMN system_menu.permission IS '权限标识'; +COMMENT ON COLUMN system_menu.type IS '菜单类型'; +COMMENT ON COLUMN system_menu.sort IS '显示顺序'; +COMMENT ON COLUMN system_menu.parent_id IS '父菜单ID'; +COMMENT ON COLUMN system_menu.path IS '路由地址'; +COMMENT ON COLUMN system_menu.icon IS '菜单图标'; +COMMENT ON COLUMN system_menu.component IS '组件路径'; +COMMENT ON COLUMN system_menu.component_name IS '组件名'; +COMMENT ON COLUMN system_menu.status IS '菜单状态'; +COMMENT ON COLUMN system_menu.visible IS '是否可见'; +COMMENT ON COLUMN system_menu.keep_alive IS '是否缓存'; +COMMENT ON COLUMN system_menu.always_show IS '是否总是显示'; +COMMENT ON COLUMN system_menu.creator IS '创建者'; +COMMENT ON COLUMN system_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_menu.updater IS '更新者'; +COMMENT ON COLUMN system_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_menu.deleted IS '是否删除'; +COMMENT ON TABLE system_menu IS '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_menu ON; +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-06-18 01:19:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-03-01 08:28:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-09-20 16:26:19', '1', '2024-02-29 12:38:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:02:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-05-01 18:35:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:07:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:02:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (107, '通知公告', '', 2, 4, 2739, 'notice', 'ep:takeaway-box', 'system/notice/index', 'SystemNotice', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-22 23:56:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:08:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:13:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (110, '定时任务', '', 2, 7, 2, 'job', 'fa-solid:tasks', 'infra/job/index', 'InfraJob', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:57:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:05:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:document-copy', 'infra/codegen/index', 'InfraCodegen', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:01:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:09:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:10:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, '1', '1', '1', '', '2021-02-06 12:42:49', '1', '2023-11-15 23:45:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, '1', '1', '1', '', '2021-02-08 20:41:31', '1', '2024-04-23 00:07:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2024-02-29 08:54:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '', '2021-02-26 02:18:24', '1', '2024-04-22 23:58:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2024-02-29 08:55:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, '1', '1', '1', '', '2021-03-12 20:16:20', '1', '2024-02-29 08:53:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1093, '短信管理', '', 1, 1, 2739, 'sms', 'ep:message', NULL, NULL, 0, '1', '1', '1', '1', '2021-04-05 01:10:16', '1', '2024-04-22 23:56:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'fa:stack-exchange', 'system/sms/channel/index', 'SystemSmsChannel', 0, '1', '1', '1', '', '2021-04-01 11:07:15', '1', '2024-02-29 01:15:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'ep:connection', 'system/sms/template/index', 'SystemSmsTemplate', 0, '1', '1', '1', '', '2021-04-01 17:35:17', '1', '2024-02-29 01:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'fa:edit', 'system/sms/log/index', 'SystemSmsLog', 0, '1', '1', '1', '', '2021-04-11 08:37:05', '1', '2024-02-29 08:49:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1117, '支付管理', '', 1, 30, 0, '/pay', 'ep:money', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-25 16:43:41', '1', '2024-02-29 08:58:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2024-02-29 12:38:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'fa:apple', 'pay/app/index', 'PayApp', 0, '1', '1', '1', '', '2021-11-10 01:13:30', '1', '2024-02-29 08:59:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'ep:house', 'system/tenant/index', 'SystemTenant', 0, '1', '1', '1', '', '2021-12-14 12:31:43', '1', '2024-02-29 01:01:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'fa:registered', 'pay/refund/index', 'PayRefund', 0, '1', '1', '1', '', '2021-12-25 08:29:07', '1', '2024-02-29 08:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'fa:cc-paypal', 'pay/order/index', 'PayOrder', 0, '1', '1', '1', '', '2021-12-25 08:49:43', '1', '2024-02-29 08:59:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:26:36', '1', '2024-02-29 12:43:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:28:30', '1', '2024-02-29 12:36:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2024-03-19 12:25:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, '1', '1', '1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '1', '2022-01-07 23:51:48', '1', '2024-03-21 00:33:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2024-03-21 23:52:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, '1', '1', '1', '1', '2022-01-08 10:33:37', '1', '2024-02-29 12:37:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, '1', '1', '1', '1', '2022-01-08 10:34:13', '1', '2024-02-29 12:37:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, '1', '1', '1', '', '2022-01-14 02:14:20', '1', '2024-03-21 23:55:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'fa-solid:house-user', NULL, NULL, 0, '1', '1', '1', '1', '2022-02-20 01:41:13', '1', '2024-02-29 00:59:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'fa:bars', 'system/tenantPackage/index', 'SystemTenantPackage', 0, '1', '1', '1', '', '2022-02-19 17:44:06', '1', '2024-02-29 01:01:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, '1', '1', '1', '', '2022-03-15 14:35:28', '1', '2024-02-29 08:52:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, '1', '1', '1', '1', '2022-03-16 23:47:40', '1', '2024-04-23 00:02:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:avatar', NULL, NULL, 0, '1', '1', '1', '1', '2022-04-23 01:03:15', '1', '2023-12-08 23:40:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:data-analysis', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, '1', '1', '1', '', '2022-04-27 14:37:32', '1', '2024-02-29 08:51:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, '1', '1', '1', '1', '2022-05-09 23:38:17', '1', '2024-02-29 01:12:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2024-02-29 01:13:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1281, '报表管理', '', 2, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, '1', '1', '1', '1', '2022-07-10 20:22:15', '1', '2024-02-29 12:33:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'GoView', 0, '1', '1', '1', '1', '2022-07-10 20:26:36', '1', '2024-02-29 12:33:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2000, '商品中心', '', 1, 60, 2362, 'product', 'fa:product-hunt', NULL, NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-09-30 11:52:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2002, '商品分类', '', 2, 2, 2000, 'category', 'ep:cellphone', 'mall/product/category/index', 'ProductCategory', 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-08-21 10:27:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2003, '分类查询', 'product:category:query', 3, 1, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2004, '分类创建', 'product:category:create', 3, 2, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2005, '分类更新', 'product:category:update', 3, 3, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2006, '分类删除', 'product:category:delete', 3, 4, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2008, '商品品牌', '', 2, 3, 2000, 'brand', 'ep:chicken', 'mall/product/brand/index', 'ProductBrand', 0, '1', '1', '1', '', '2022-07-30 13:52:44', '1', '2023-08-21 10:27:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2009, '品牌查询', 'product:brand:query', 3, 1, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2010, '品牌创建', 'product:brand:create', 3, 2, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2011, '品牌更新', 'product:brand:update', 3, 3, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2012, '品牌删除', 'product:brand:delete', 3, 4, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2014, '商品列表', '', 2, 1, 2000, 'spu', 'ep:apple', 'mall/product/spu/index', 'ProductSpu', 0, '1', '1', '1', '', '2022-07-30 14:22:58', '1', '2023-08-21 10:27:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2015, '商品查询', 'product:spu:query', 3, 1, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2016, '商品创建', 'product:spu:create', 3, 2, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2017, '商品更新', 'product:spu:update', 3, 3, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2018, '商品删除', 'product:spu:delete', 3, 4, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2019, '商品属性', '', 2, 4, 2000, 'property', 'ep:cold-drink', 'mall/product/property/index', 'ProductProperty', 0, '1', '1', '1', '', '2022-08-01 14:55:35', '1', '2023-08-26 11:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2020, '规格查询', 'product:property:query', 3, 1, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2021, '规格创建', 'product:property:create', 3, 2, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2022, '规格更新', 'product:property:update', 3, 3, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2023, '规格删除', 'product:property:delete', 3, 4, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2025, 'Banner', '', 2, 100, 2387, 'banner', 'fa:bandcamp', 'mall/promotion/banner/index', NULL, 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2026, 'Banner查询', 'promotion:banner:query', 3, 1, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2027, 'Banner创建', 'promotion:banner:create', 3, 2, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2028, 'Banner更新', 'promotion:banner:update', 3, 3, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2029, 'Banner删除', 'promotion:banner:delete', 3, 4, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2030, '营销中心', '', 1, 70, 2362, 'promotion', 'ep:present', NULL, NULL, 0, '1', '1', '1', '1', '2022-10-31 21:25:09', '1', '2023-09-30 11:54:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2032, '优惠劵列表', '', 2, 1, 2365, 'template', 'ep:discount', 'mall/promotion/coupon/template/index', 'PromotionCouponTemplate', 0, '1', '1', '1', '', '2022-10-31 22:27:14', '1', '2023-10-03 12:40:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2033, '优惠劵模板查询', 'promotion:coupon-template:query', 3, 1, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2034, '优惠劵模板创建', 'promotion:coupon-template:create', 3, 2, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2035, '优惠劵模板更新', 'promotion:coupon-template:update', 3, 3, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2036, '优惠劵模板删除', 'promotion:coupon-template:delete', 3, 4, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2038, '领取记录', '', 2, 2, 2365, 'list', 'ep:collection-tag', 'mall/promotion/coupon/index', 'PromotionCoupon', 0, '1', '1', '1', '', '2022-11-03 23:21:31', '1', '2023-10-03 12:55:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2039, '优惠劵查询', 'promotion:coupon:query', 3, 1, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2040, '优惠劵删除', 'promotion:coupon:delete', 3, 4, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2041, '满减送', '', 2, 10, 2390, 'reward-activity', 'ep:goblet-square-full', 'mall/promotion/rewardActivity/index', 'PromotionRewardActivity', 0, '1', '1', '1', '', '2022-11-04 23:47:49', '1', '2023-10-21 19:24:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2042, '满减送活动查询', 'promotion:reward-activity:query', 3, 1, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2043, '满减送活动创建', 'promotion:reward-activity:create', 3, 2, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2044, '满减送活动更新', 'promotion:reward-activity:update', 3, 3, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2045, '满减送活动删除', 'promotion:reward-activity:delete', 3, 4, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2047, '限时折扣', '', 2, 7, 2390, 'discount-activity', 'ep:timer', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, '1', '1', '1', '', '2022-11-05 17:12:15', '1', '2023-10-21 19:24:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, '1', '1', '1', '', '2022-11-06 22:24:49', '1', '2023-06-24 18:57:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, '1', '1', '1', '', '2022-11-15 19:46:50', '1', '2023-06-24 18:57:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:48:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2072, '订单中心', '', 1, 65, 2362, 'trade', 'ep:eleme', NULL, NULL, 0, '1', '1', '1', '1', '2022-11-19 18:57:19', '1', '2023-09-30 11:54:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2073, '售后退款', '', 2, 2, 2072, 'after-sale', 'ep:refrigerator', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, '1', '1', '1', '', '2022-11-19 20:15:32', '1', '2023-10-01 21:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2075, '秒杀活动关闭', 'promotion:seckill-activity:close', 3, 5, 2059, '', '', '', '', 0, '1', '1', '1', '1', '2022-11-28 20:20:15', '1', '2023-10-03 18:34:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2076, '订单列表', '', 2, 1, 2072, 'order', 'ep:list', 'mall/trade/order/index', 'TradeOrder', 0, '1', '1', '1', '1', '2022-12-10 21:05:44', '1', '2023-10-01 21:42:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, '1', '1', '1', '1', '2022-12-23 17:35:05', '1', '2024-02-29 08:50:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'ep:compass', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-01 20:11:04', '1', '2024-02-29 12:39:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'fa:user', 'mp/account/index', 'MpAccount', 0, '1', '1', '1', '1', '2023-01-01 20:13:31', '1', '2024-02-29 12:42:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2086, '新增账号', 'mp:account:create', 3, 1, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-01 20:21:40', '1', '2023-01-07 17:32:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2087, '修改账号', 'mp:account:update', 3, 2, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:32:46', '1', '2023-01-07 17:32:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2088, '查询账号', 'mp:account:query', 3, 0, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:07', '1', '2023-01-07 17:33:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2089, '删除账号', 'mp:account:delete', 3, 3, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:21', '1', '2023-01-07 17:33:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2090, '生成二维码', 'mp:account:qr-code', 3, 4, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:58', '1', '2023-01-07 17:33:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2091, '清空 API 配额', 'mp:account:clear-quota', 3, 5, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 18:20:32', '1', '2023-01-07 18:20:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2092, '数据统计', 'mp:statistics:query', 2, 2, 2084, 'statistics', 'ep:trend-charts', 'mp/statistics/index', 'MpStatistics', 0, '1', '1', '1', '1', '2023-01-07 20:17:36', '1', '2024-02-29 12:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2093, '标签管理', '', 2, 3, 2084, 'tag', 'ep:collection-tag', 'mp/tag/index', 'MpTag', 0, '1', '1', '1', '1', '2023-01-08 11:37:32', '1', '2024-02-29 12:42:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2094, '查询标签', 'mp:tag:query', 3, 0, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:03', '1', '2023-01-08 11:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2095, '新增标签', 'mp:tag:create', 3, 1, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:23', '1', '2023-01-08 11:59:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2096, '修改标签', 'mp:tag:update', 3, 2, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:41', '1', '2023-01-08 11:59:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2097, '删除标签', 'mp:tag:delete', 3, 3, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:04', '1', '2023-01-08 12:00:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2098, '同步标签', 'mp:tag:sync', 3, 4, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:29', '1', '2023-01-08 12:00:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2099, '粉丝管理', '', 2, 4, 2084, 'user', 'fa:user-secret', 'mp/user/index', 'MpUser', 0, '1', '1', '1', '1', '2023-01-08 16:51:20', '1', '2024-02-29 12:42:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2100, '查询粉丝', 'mp:user:query', 3, 0, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:16:59', '1', '2023-01-08 17:17:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2101, '修改粉丝', 'mp:user:update', 3, 1, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:11', '1', '2023-01-08 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2102, '同步粉丝', 'mp:user:sync', 3, 2, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:40', '1', '2023-01-08 17:17:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2103, '消息管理', '', 2, 5, 2084, 'message', 'ep:message', 'mp/message/index', 'MpMessage', 0, '1', '1', '1', '1', '2023-01-08 18:44:19', '1', '2024-02-29 12:42:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2104, '图文发表记录', '', 2, 10, 2084, 'free-publish', 'ep:edit-pen', 'mp/freePublish/index', 'MpFreePublish', 0, '1', '1', '1', '1', '2023-01-13 00:30:50', '1', '2024-02-29 12:43:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2105, '查询发布列表', 'mp:free-publish:query', 3, 1, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:17', '1', '2023-01-13 07:19:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2106, '发布草稿', 'mp:free-publish:submit', 3, 2, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:46', '1', '2023-01-13 07:19:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2107, '删除发布记录', 'mp:free-publish:delete', 3, 3, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:20:01', '1', '2023-01-13 07:20:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2108, '图文草稿箱', '', 2, 9, 2084, 'draft', 'ep:edit', 'mp/draft/index', 'MpDraft', 0, '1', '1', '1', '1', '2023-01-13 07:40:21', '1', '2024-02-29 12:43:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2109, '新建草稿', 'mp:draft:create', 3, 1, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 23:15:30', '1', '2023-01-13 23:15:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2110, '修改草稿', 'mp:draft:update', 3, 2, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:08:47', '1', '2023-01-14 10:08:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2111, '查询草稿', 'mp:draft:query', 3, 0, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:01', '1', '2023-01-14 10:09:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2112, '删除草稿', 'mp:draft:delete', 3, 3, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:19', '1', '2023-01-14 10:09:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2113, '素材管理', '', 2, 8, 2084, 'material', 'ep:basketball', 'mp/material/index', 'MpMaterial', 0, '1', '1', '1', '1', '2023-01-14 14:12:07', '1', '2024-02-29 12:43:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2114, '上传临时素材', 'mp:material:upload-temporary', 3, 1, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:33:55', '1', '2023-01-14 15:33:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2115, '上传永久素材', 'mp:material:upload-permanent', 3, 2, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:34:14', '1', '2023-01-14 15:34:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2116, '删除素材', 'mp:material:delete', 3, 3, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:35:37', '1', '2023-01-14 15:35:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2117, '上传图文图片', 'mp:material:upload-news-image', 3, 4, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:36:31', '1', '2023-01-14 15:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2118, '查询素材', 'mp:material:query', 3, 5, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:39:22', '1', '2023-01-14 15:39:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2119, '菜单管理', '', 2, 6, 2084, 'menu', 'ep:menu', 'mp/menu/index', 'MpMenu', 0, '1', '1', '1', '1', '2023-01-14 17:43:54', '1', '2024-02-29 12:42:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2120, '自动回复', '', 2, 7, 2084, 'auto-reply', 'fa-solid:republican', 'mp/autoReply/index', 'MpAutoReply', 0, '1', '1', '1', '1', '2023-01-15 22:13:09', '1', '2024-02-29 12:43:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2121, '查询回复', 'mp:auto-reply:query', 3, 0, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:41', '1', '2023-01-16 22:28:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2122, '新增回复', 'mp:auto-reply:create', 3, 1, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:54', '1', '2023-01-16 22:28:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2123, '修改回复', 'mp:auto-reply:update', 3, 2, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:05', '1', '2023-01-16 22:29:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2124, '删除回复', 'mp:auto-reply:delete', 3, 3, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:34', '1', '2023-01-16 22:29:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2125, '查询菜单', 'mp:menu:query', 3, 0, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:05:41', '1', '2023-01-17 23:05:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2126, '保存菜单', 'mp:menu:save', 3, 1, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:01', '1', '2023-01-17 23:06:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2127, '删除菜单', 'mp:menu:delete', 3, 2, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:16', '1', '2023-01-17 23:06:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2128, '查询消息', 'mp:message:query', 3, 0, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:14', '1', '2023-01-17 23:07:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2129, '发送消息', 'mp:message:send', 3, 1, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:26', '1', '2023-01-17 23:07:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2130, '邮箱管理', '', 2, 2, 2739, 'mail', 'fa-solid:mail-bulk', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-25 17:27:44', '1', '2024-04-22 23:56:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'fa:universal-access', 'system/mail/account/index', 'SystemMailAccount', 0, '1', '1', '1', '', '2023-01-25 09:33:48', '1', '2024-02-29 08:48:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'fa:tag', 'system/mail/template/index', 'SystemMailTemplate', 0, '1', '1', '1', '', '2023-01-25 12:05:31', '1', '2024-02-29 08:48:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'fa:edit', 'system/mail/log/index', 'SystemMailLog', 0, '1', '1', '1', '', '2023-01-26 02:16:50', '1', '2024-02-29 08:48:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-26 02:16:50', '', '2023-01-26 02:16:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-26 23:29:15', '1', '2023-01-26 23:29:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2144, '站内信管理', '', 1, 3, 2739, 'notify', 'ep:message-box', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-28 10:25:18', '1', '2024-04-22 23:56:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'fa:archive', 'system/notify/template/index', 'SystemNotifyTemplate', 0, '1', '1', '1', '', '2023-01-28 02:26:42', '1', '2024-02-29 08:49:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-28 10:54:43', '1', '2023-01-28 10:54:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'fa:edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, '1', '1', '1', '', '2023-01-28 04:28:22', '1', '2024-02-29 08:49:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 04:28:22', '', '2023-01-28 04:28:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'JimuReport', 0, '1', '1', '1', '1', '2023-02-07 00:03:19', '1', '2024-02-29 12:34:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:14', '1', '2023-02-07 19:25:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2155, '更新项目', 'report:go-view-project:update', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2023-02-07 19:25:34', '1', '2024-04-24 20:01:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:46:28', '1', '2024-07-28 11:36:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, '1', '1', '1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2164, '配送管理', '', 1, 3, 2072, 'delivery', 'ep:shopping-cart', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:18:02', '1', '2023-09-28 10:58:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', 'ep:bicycle', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:22:06', '1', '2023-08-30 21:02:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', 'ep:add-location', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:23:14', '1', '2023-08-30 21:03:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', 'ep:compass', 'mall/trade/delivery/express/index', 'Express', 0, '1', '1', '1', '1', '2023-05-18 09:27:21', '1', '2023-08-30 21:02:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', 'ep:coordinate', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, '1', '1', '1', '1', '2023-05-20 06:48:10', '1', '2023-08-30 21:03:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', 'ep:basketball', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, '1', '1', '1', '1', '2023-05-25 10:50:00', '1', '2023-08-30 21:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, '1', '1', '1', '1', '2023-06-24 17:39:13', '1', '2023-06-24 18:55:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'ep:bicycle', NULL, NULL, 0, '1', '1', '1', '1', '2023-06-10 00:42:03', '1', '2023-08-20 09:23:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2275, '会员配置', '', 2, 0, 2262, 'config', 'fa:archive', 'member/config/index', 'MemberConfig', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2023-10-01 23:41:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2276, '会员配置查询', 'member:config:query', 3, 1, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:48:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2277, '会员配置保存', 'member:config:save', 3, 2, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:49:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2281, '签到配置', '', 2, 2, 2300, 'config', 'ep:calendar', 'member/signin/config/index', 'SignInConfig', 0, '1', '1', '1', '', '2023-06-10 03:26:12', '1', '2023-08-20 19:25:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2287, '会员积分', '', 2, 10, 2262, 'record', 'fa:asterisk', 'member/point/record/index', 'PointRecord', 0, '1', '1', '1', '', '2023-06-10 04:18:50', '1', '2023-10-01 23:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:18:50', '', '2023-06-10 04:18:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2293, '签到记录', '', 2, 3, 2300, 'record', 'ep:chicken', 'member/signin/record/index', 'SignInRecord', 0, '1', '1', '1', '', '2023-06-10 04:48:22', '1', '2023-08-20 19:26:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2300, '会员签到', '', 1, 11, 2262, 'signin', 'ep:alarm-clock', '', '', 0, '1', '1', '1', '1', '2023-06-27 22:49:53', '1', '2023-08-20 09:23:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2301, '回调通知', '', 2, 5, 1117, 'notify', 'ep:mute-notification', 'pay/notify/index', 'PayNotify', 0, '1', '1', '1', '', '2023-07-20 04:41:32', '1', '2024-01-18 23:56:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2302, '支付通知查询', 'pay:notify:query', 3, 1, 2301, '', '', '', NULL, 0, '1', '1', '1', '', '2023-07-20 04:41:32', '', '2023-07-20 04:41:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2303, '拼团活动', '', 2, 3, 2030, 'combination', 'fa:group', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:19:54', '1', '2023-08-12 17:20:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2304, '拼团商品', '', 2, 1, 2303, 'acitivity', 'ep:apple', 'mall/promotion/combination/activity/index', 'PromotionCombinationActivity', 0, '1', '1', '1', '1', '2023-08-12 17:22:03', '1', '2023-08-12 17:22:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2305, '拼团活动查询', 'promotion:combination-activity:query', 3, 1, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:32', '1', '2023-11-24 11:57:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2306, '拼团活动创建', 'promotion:combination-activity:create', 3, 2, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:49', '1', '2023-08-12 17:54:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2307, '拼团活动更新', 'promotion:combination-activity:update', 3, 3, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:04', '1', '2023-08-12 17:55:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2308, '拼团活动删除', 'promotion:combination-activity:delete', 3, 4, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:23', '1', '2023-08-12 17:55:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2309, '拼团活动关闭', 'promotion:combination-activity:close', 3, 5, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:37', '1', '2023-10-06 10:51:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2310, '砍价活动', '', 2, 4, 2030, 'bargain', 'ep:box', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:27:25', '1', '2023-08-13 00:27:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2311, '砍价商品', '', 2, 1, 2310, 'activity', 'ep:burger', 'mall/promotion/bargain/activity/index', 'PromotionBargainActivity', 0, '1', '1', '1', '1', '2023-08-13 00:28:49', '1', '2023-10-05 01:16:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2312, '砍价活动查询', 'promotion:bargain-activity:query', 3, 1, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:30', '1', '2023-08-13 00:32:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2313, '砍价活动创建', 'promotion:bargain-activity:create', 3, 2, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:44', '1', '2023-08-13 00:32:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2314, '砍价活动更新', 'promotion:bargain-activity:update', 3, 3, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:55', '1', '2023-08-13 00:32:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2315, '砍价活动删除', 'promotion:bargain-activity:delete', 3, 4, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:34:50', '1', '2023-08-13 00:34:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2316, '砍价活动关闭', 'promotion:bargain-activity:close', 3, 5, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:35:02', '1', '2023-08-13 00:35:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2317, '会员管理', '', 2, 0, 2262, 'user', 'ep:avatar', 'member/user/index', 'MemberUser', 0, '1', '1', '1', '', '2023-08-19 04:12:15', '1', '2023-08-24 00:50:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2318, '会员用户查询', 'member:user:query', 3, 1, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2319, '会员用户更新', 'member:user:update', 3, 3, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2320, '会员标签', '', 2, 1, 2262, 'tag', 'ep:collection-tag', 'member/tag/index', 'MemberTag', 0, '1', '1', '1', '', '2023-08-20 01:03:08', '1', '2023-08-20 09:23:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2321, '会员标签查询', 'member:tag:query', 3, 1, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2322, '会员标签创建', 'member:tag:create', 3, 2, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2323, '会员标签更新', 'member:tag:update', 3, 3, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2324, '会员标签删除', 'member:tag:delete', 3, 4, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2325, '会员等级', '', 2, 2, 2262, 'level', 'fa:level-up', 'member/level/index', 'MemberLevel', 0, '1', '1', '1', '', '2023-08-22 12:41:01', '1', '2023-08-22 21:47:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2326, '会员等级查询', 'member:level:query', 3, 1, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2327, '会员等级创建', 'member:level:create', 3, 2, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2328, '会员等级更新', 'member:level:update', 3, 3, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2329, '会员等级删除', 'member:level:delete', 3, 4, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2330, '会员分组', '', 2, 3, 2262, 'group', 'fa:group', 'member/group/index', 'MemberGroup', 0, '1', '1', '1', '', '2023-08-22 13:50:06', '1', '2023-10-01 23:42:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2331, '用户分组查询', 'member:group:query', 3, 1, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2332, '用户分组创建', 'member:group:create', 3, 2, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2333, '用户分组更新', 'member:group:update', 3, 3, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2334, '用户分组删除', 'member:group:delete', 3, 4, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2335, '用户等级修改', 'member:user:update-level', 3, 5, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-23 16:49:05', '', '2023-08-23 16:50:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2336, '商品评论', '', 2, 5, 2000, 'comment', 'ep:comment', 'mall/product/comment/index', 'ProductComment', 0, '1', '1', '1', '1', '2023-08-26 11:03:00', '1', '2023-08-26 11:03:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2337, '评论查询', 'product:comment:query', 3, 1, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:01', '1', '2023-08-26 11:04:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2338, '添加自评', 'product:comment:create', 3, 2, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:23', '1', '2023-08-26 11:08:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2339, '商家回复', 'product:comment:update', 3, 3, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:37', '1', '2023-08-26 11:04:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2340, '显隐评论', 'product:comment:update', 3, 4, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:55', '1', '2023-08-26 11:04:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2341, '优惠劵发送', 'promotion:coupon:send', 3, 2, 2038, '', '', '', '', 0, '1', '1', '1', '1', '2023-09-02 00:03:14', '1', '2023-09-02 00:03:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2342, '交易配置', '', 2, 0, 2072, 'config', 'ep:setting', 'mall/trade/config/index', 'TradeConfig', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:30:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2343, '交易中心配置查询', 'trade:config:query', 3, 1, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2344, '交易中心配置保存', 'trade:config:save', 3, 2, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2345, '分销管理', '', 1, 4, 2072, 'brokerage', 'fa-solid:project-diagram', '', '', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2023-09-28 10:58:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2346, '分销用户', '', 2, 0, 2345, 'brokerage-user', 'fa-solid:user-tie', 'mall/trade/brokerage/user/index', 'TradeBrokerageUser', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2347, '分销用户查询', 'trade:brokerage-user:query', 3, 1, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2348, '分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2349, '分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2350, '分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2351, '分销用户修改推广员', 'trade:brokerage-user:update-bind-user', 3, 5, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2352, '分销用户清除推广员', 'trade:brokerage-user:clear-bind-user', 3, 6, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2353, '佣金记录', '', 2, 1, 2345, 'brokerage-record', 'fa:money', 'mall/trade/brokerage/record/index', 'TradeBrokerageRecord', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2354, '佣金记录查询', 'trade:brokerage-record:query', 3, 1, 2353, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2355, '佣金提现', '', 2, 2, 2345, 'brokerage-withdraw', 'fa:credit-card', 'mall/trade/brokerage/withdraw/index', 'TradeBrokerageWithdraw', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2356, '佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2357, '佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2358, '统计中心', '', 1, 75, 2362, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2023-09-30 11:54:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2359, '交易统计', '', 2, 4, 2358, 'trade', 'fa-solid:credit-card', 'mall/statistics/trade/index', 'TradeStatistics', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2024-02-26 20:42:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2360, '交易统计查询', 'statistics:trade:query', 3, 1, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2361, '交易统计导出', 'statistics:trade:export', 3, 2, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2362, '商城系统', '', 1, 59, 0, '/mall', 'ep:shop', '', '', 0, '1', '1', '1', '1', '2023-09-30 11:52:02', '1', '2023-09-30 11:52:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2363, '用户积分修改', 'member:user:update-point', 3, 6, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-01 14:39:43', '', '2023-10-01 14:39:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2364, '用户余额修改', 'member:user:update-balance', 3, 7, 2317, '', '', '', '', 0, '1', '1', '1', '', '2023-10-01 14:39:43', '1', '2023-10-01 22:42:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2365, '优惠劵', '', 1, 2, 2030, 'coupon', 'fa-solid:disease', '', '', 0, '1', '1', '1', '1', '2023-10-03 12:39:15', '1', '2023-10-05 00:16:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2366, '砍价记录', '', 2, 2, 2310, 'record', 'ep:list', 'mall/promotion/bargain/record/index', 'PromotionBargainRecord', 0, '1', '1', '1', '', '2023-10-05 02:49:06', '1', '2023-10-05 10:50:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2367, '砍价记录查询', 'promotion:bargain-record:query', 3, 1, 2366, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-05 02:49:06', '', '2023-10-05 02:49:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2368, '助力记录查询', 'promotion:bargain-help:query', 3, 2, 2366, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-05 12:27:49', '1', '2023-10-05 12:27:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2369, '拼团记录', 'promotion:combination-record:query', 2, 2, 2303, 'record', 'ep:avatar', 'mall/promotion/combination/record/index.vue', 'PromotionCombinationRecord', 0, '1', '1', '1', '1', '2023-10-08 07:10:22', '1', '2023-10-08 07:34:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2374, '会员统计', '', 2, 2, 2358, 'member', 'ep:avatar', 'mall/statistics/member/index', 'MemberStatistics', 0, '1', '1', '1', '', '2023-10-11 04:39:24', '1', '2024-02-26 20:41:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2375, '会员统计查询', 'statistics:member:query', 3, 1, 2374, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-11 04:39:24', '', '2023-10-11 04:39:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2376, '订单核销', 'trade:order:pick-up', 3, 10, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-14 17:11:58', '1', '2023-10-14 17:11:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2377, '文章分类', '', 2, 0, 2387, 'article/category', 'fa:certificate', 'mall/promotion/article/category/index', 'ArticleCategory', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:38:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2378, '分类查询', 'promotion:article-category:query', 3, 1, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2379, '分类创建', 'promotion:article-category:create', 3, 2, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2380, '分类更新', 'promotion:article-category:update', 3, 3, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2381, '分类删除', 'promotion:article-category:delete', 3, 4, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2382, '文章列表', '', 2, 2, 2387, 'article', 'ep:connection', 'mall/promotion/article/index', 'Article', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:41:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2383, '文章管理查询', 'promotion:article:query', 3, 1, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2384, '文章管理创建', 'promotion:article:create', 3, 2, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2385, '文章管理更新', 'promotion:article:update', 3, 3, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2386, '文章管理删除', 'promotion:article:delete', 3, 4, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2387, '内容管理', '', 1, 1, 2030, 'content', 'ep:collection', '', '', 0, '1', '1', '1', '1', '2023-10-16 09:37:31', '1', '2023-10-16 09:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2388, '商城首页', '', 2, 1, 2362, 'home', 'ep:home-filled', 'mall/home/index', 'MallHome', 0, '1', '1', '1', '', '2023-10-16 12:10:33', '', '2023-10-16 12:10:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2389, '核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder', 0, '1', '1', '1', '', '2023-10-19 16:09:51', '', '2023-10-19 16:09:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2390, '优惠活动', '', 1, 99, 2030, 'youhui', 'ep:aim', '', '', 0, '1', '1', '1', '1', '2023-10-21 19:23:49', '1', '2023-10-21 19:23:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2391, '客户管理', '', 2, 10, 2397, 'customer', 'fa:address-book-o', 'crm/customer/index', 'CrmCustomer', 0, '1', '1', '1', '', '2023-10-29 09:04:21', '1', '2024-02-17 17:13:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2392, '客户查询', 'crm:customer:query', 3, 1, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2393, '客户创建', 'crm:customer:create', 3, 2, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2394, '客户更新', 'crm:customer:update', 3, 3, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2395, '客户删除', 'crm:customer:delete', 3, 4, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2396, '客户导出', 'crm:customer:export', 3, 5, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2397, 'CRM 系统', '', 1, 200, 0, '/crm', 'ep:avatar', '', '', 0, '1', '1', '1', '1', '2023-10-29 17:08:30', '1', '2024-02-04 15:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2398, '合同管理', '', 2, 50, 2397, 'contract', 'ep:notebook', 'crm/contract/index', 'CrmContract', 0, '1', '1', '1', '', '2023-10-29 10:50:41', '1', '2024-02-17 17:15:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2399, '合同查询', 'crm:contract:query', 3, 1, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2400, '合同创建', 'crm:contract:create', 3, 2, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2401, '合同更新', 'crm:contract:update', 3, 3, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2402, '合同删除', 'crm:contract:delete', 3, 4, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2403, '合同导出', 'crm:contract:export', 3, 5, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2404, '线索管理', '', 2, 8, 2397, 'clue', 'fa:pagelines', 'crm/clue/index', 'CrmClue', 0, '1', '1', '1', '', '2023-10-29 11:06:29', '1', '2024-02-17 17:15:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2405, '线索查询', 'crm:clue:query', 3, 1, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2406, '线索创建', 'crm:clue:create', 3, 2, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2407, '线索更新', 'crm:clue:update', 3, 3, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2408, '线索删除', 'crm:clue:delete', 3, 4, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2409, '线索导出', 'crm:clue:export', 3, 5, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2410, '商机管理', '', 2, 40, 2397, 'business', 'fa:bus', 'crm/business/index', 'CrmBusiness', 0, '1', '1', '1', '', '2023-10-29 11:12:35', '1', '2024-02-17 17:14:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2411, '商机查询', 'crm:business:query', 3, 1, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2412, '商机创建', 'crm:business:create', 3, 2, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2413, '商机更新', 'crm:business:update', 3, 3, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2414, '商机删除', 'crm:business:delete', 3, 4, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2415, '商机导出', 'crm:business:export', 3, 5, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2416, '联系人管理', '', 2, 20, 2397, 'contact', 'fa:address-book-o', 'crm/contact/index', 'CrmContact', 0, '1', '1', '1', '', '2023-10-29 11:14:56', '1', '2024-02-17 17:13:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2417, '联系人查询', 'crm:contact:query', 3, 1, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2418, '联系人创建', 'crm:contact:create', 3, 2, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2419, '联系人更新', 'crm:contact:update', 3, 3, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2420, '联系人删除', 'crm:contact:delete', 3, 4, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2421, '联系人导出', 'crm:contact:export', 3, 5, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2422, '回款管理', '', 2, 60, 2397, 'receivable', 'ep:money', 'crm/receivable/index', 'CrmReceivable', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2423, '回款管理查询', 'crm:receivable:query', 3, 1, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2424, '回款管理创建', 'crm:receivable:create', 3, 2, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2425, '回款管理更新', 'crm:receivable:update', 3, 3, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2426, '回款管理删除', 'crm:receivable:delete', 3, 4, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2427, '回款管理导出', 'crm:receivable:export', 3, 5, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2428, '回款计划', '', 2, 61, 2397, 'receivable-plan', 'fa:money', 'crm/receivable/plan/index', 'CrmReceivablePlan', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2429, '回款计划查询', 'crm:receivable-plan:query', 3, 1, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2430, '回款计划创建', 'crm:receivable-plan:create', 3, 2, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2431, '回款计划更新', 'crm:receivable-plan:update', 3, 3, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2432, '回款计划删除', 'crm:receivable-plan:delete', 3, 4, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2433, '回款计划导出', 'crm:receivable-plan:export', 3, 5, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2435, '商城装修', '', 2, 20, 2030, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2436, '装修模板', '', 2, 1, 2435, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2437, '装修模板查询', 'promotion:diy-template:query', 3, 1, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2438, '装修模板创建', 'promotion:diy-template:create', 3, 2, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2439, '装修模板更新', 'promotion:diy-template:update', 3, 3, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2440, '装修模板删除', 'promotion:diy-template:delete', 3, 4, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2441, '装修模板使用', 'promotion:diy-template:use', 3, 5, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2442, '装修页面', '', 2, 2, 2435, 'diy-page', 'foundation:page-edit', 'mall/promotion/diy/page/index', 'DiyPage', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2443, '装修页面查询', 'promotion:diy-page:query', 3, 1, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2444, '装修页面创建', 'promotion:diy-page:create', 3, 2, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2445, '装修页面更新', 'promotion:diy-page:update', 3, 3, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2446, '装修页面删除', 'promotion:diy-page:delete', 3, 4, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2447, '三方登录', '', 1, 10, 1, 'social', 'fa:rocket', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:12:01', '1', '2024-02-29 01:14:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2448, '三方应用', '', 2, 1, 2447, 'client', 'ep:set-up', 'system/social/client/index.vue', 'SocialClient', 0, '1', '1', '1', '1', '2023-11-04 12:17:19', '1', '2024-05-04 19:09:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2449, '三方应用查询', 'system:social-client:query', 3, 1, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:12', '1', '2023-11-04 12:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2450, '三方应用创建', 'system:social-client:create', 3, 2, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:58', '1', '2023-11-04 12:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2451, '三方应用更新', 'system:social-client:update', 3, 3, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:27', '1', '2023-11-04 12:44:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2452, '三方应用删除', 'system:social-client:delete', 3, 4, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:43', '1', '2023-11-04 12:44:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2453, '三方用户', 'system:social-user:query', 2, 2, 2447, 'user', 'ep:avatar', 'system/social/user/index.vue', 'SocialUser', 0, '1', '1', '1', '1', '2023-11-04 14:01:05', '1', '2023-11-04 14:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, '1', '1', '1', '', '2023-11-13 04:39:51', '1', '2023-11-16 23:53:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, '1', '1', '1', '', '2023-11-15 14:42:30', '1', '2023-11-16 20:34:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, '1', '1', '1', '', '2023-11-16 12:18:27', '1', '2023-11-16 20:35:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, '1', '1', '1', '', '2023-11-16 12:53:37', '1', '2023-11-16 23:10:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2497, '主子表(ERP)', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, '1', '1', '1', '', '2023-11-16 15:50:59', '1', '2023-11-17 13:19:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2516, '客户公海配置', '', 2, 0, 2524, 'customer-pool-config', 'ep:data-analysis', 'crm/customer/poolConfig/index', 'CrmCustomerPoolConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:31', '1', '2024-01-03 19:52:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2517, '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, 2516, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:31', '', '2023-11-18 13:33:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2518, '客户限制配置', '', 2, 1, 2524, 'customer-limit-config', 'ep:avatar', 'crm/customer/limitConfig/index', 'CrmCustomerLimitConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:53', '1', '2024-02-24 16:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2519, '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2520, '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2521, '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2522, '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2523, '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2524, '系统配置', '', 1, 999, 2397, 'config', 'ep:connection', '', '', 0, '1', '1', '1', '1', '2023-11-18 21:58:00', '1', '2024-02-17 17:14:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, '1', '1', '1', '1', '2023-11-23 19:41:55', '1', '2024-04-23 00:02:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2526, '产品管理', '', 2, 80, 2397, 'product', 'fa:product-hunt', 'crm/product/index', 'CrmProduct', 0, '1', '1', '1', '1', '2023-12-05 22:45:26', '1', '2024-02-20 20:36:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2527, '产品查询', 'crm:product:query', 3, 1, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:16', '1', '2023-12-05 22:47:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2528, '产品创建', 'crm:product:create', 3, 2, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:41', '1', '2023-12-05 22:47:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2529, '产品更新', 'crm:product:update', 3, 3, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:03', '1', '2023-12-05 22:48:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2530, '产品删除', 'crm:product:delete', 3, 4, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:17', '1', '2023-12-05 22:48:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2531, '产品导出', 'crm:product:export', 3, 5, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:29', '1', '2023-12-05 22:48:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2532, '产品分类配置', '', 2, 3, 2524, 'product/category', 'fa-solid:window-restore', 'crm/product/category/index', 'CrmProductCategory', 0, '1', '1', '1', '1', '2023-12-06 12:52:36', '1', '2023-12-06 12:52:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2533, '产品分类查询', 'crm:product-category:query', 3, 1, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:23', '1', '2023-12-06 12:53:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2534, '产品分类创建', 'crm:product-category:create', 3, 2, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:41', '1', '2023-12-06 12:53:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2535, '产品分类更新', 'crm:product-category:update', 3, 3, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:59', '1', '2023-12-06 12:53:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2536, '产品分类删除', 'crm:product-category:delete', 3, 4, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:54:14', '1', '2023-12-06 12:54:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2543, '关联商机', 'crm:contact:create-business', 3, 10, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:25', '1', '2024-01-02 17:28:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2544, '取关商机', 'crm:contact:delete-business', 3, 11, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:43', '1', '2024-01-02 17:28:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2545, '商品统计', '', 2, 3, 2358, 'product', 'fa:product-hunt', 'mall/statistics/product/index', 'ProductStatistics', 0, '1', '1', '1', '', '2023-12-15 18:54:28', '1', '2024-02-26 20:41:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2546, '客户公海', '', 2, 30, 2397, 'customer/pool', 'fa-solid:swimming-pool', 'crm/customer/pool/index', 'CrmCustomerPool', 0, '1', '1', '1', '1', '2024-01-15 21:29:34', '1', '2024-02-17 17:14:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2547, '订单查询', 'trade:order:query', 3, 1, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:00', '1', '2024-01-16 08:52:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2548, '订单更新', 'trade:order:update', 3, 2, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:21', '1', '2024-01-16 08:52:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2549, '支付&退款案例', '', 2, 1, 2161, 'order', 'fa:paypal', 'pay/demo/order/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:45:00', '1', '2024-01-18 23:47:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2550, '转账案例', '', 2, 2, 2161, 'transfer', 'fa:transgender-alt', 'pay/demo/transfer/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:51:16', '1', '2024-01-18 23:51:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2551, '钱包管理', '', 1, 4, 1117, 'wallet', 'ep:wallet', '', '', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '1', '2024-02-29 08:58:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2552, '充值套餐', '', 2, 2, 2551, 'wallet-recharge-package', 'fa:leaf', 'pay/wallet/rechargePackage/index', 'WalletRechargePackage', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2553, '钱包充值套餐查询', 'pay:wallet-recharge-package:query', 3, 1, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2554, '钱包充值套餐创建', 'pay:wallet-recharge-package:create', 3, 2, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2555, '钱包充值套餐更新', 'pay:wallet-recharge-package:update', 3, 3, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2556, '钱包充值套餐删除', 'pay:wallet-recharge-package:delete', 3, 4, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2557, '钱包余额', '', 2, 1, 2551, 'wallet-balance', 'fa:leaf', 'pay/wallet/balance/index', 'WalletBalance', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2558, '钱包余额查询', 'pay:wallet:query', 3, 1, 2557, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2559, '转账订单', '', 2, 3, 1117, 'transfer', 'ep:credit-card', 'pay/transfer/index', 'PayTransfer', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2560, '数据统计', '', 1, 200, 2397, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '1', '2024-01-26 22:50:35', '1', '2024-02-24 20:10:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2561, '排行榜', 'crm:statistics-rank:query', 2, 1, 2560, 'ranking', 'fa:area-chart', 'crm/statistics/rank/index', 'CrmStatisticsRank', 0, '1', '1', '1', '1', '2024-01-26 22:52:09', '1', '2024-04-24 19:39:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2562, '客户导入', 'crm:customer:import', 3, 6, 2391, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-01 13:09:00', '1', '2024-02-01 13:09:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2563, 'ERP 系统', '', 1, 300, 0, '/erp', 'fa-solid:store', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:37:25', '1', '2024-02-04 15:37:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2564, '产品管理', '', 1, 40, 2563, 'product', 'fa:product-hunt', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:38:43', '1', '2024-02-04 15:38:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2565, '产品信息', '', 2, 0, 2564, 'product', 'fa-solid:apple-alt', 'erp/product/product/index', 'ErpProduct', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-05 14:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2566, '产品查询', 'erp:product:query', 3, 1, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:21:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2567, '产品创建', 'erp:product:create', 3, 2, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2568, '产品更新', 'erp:product:update', 3, 3, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2569, '产品删除', 'erp:product:delete', 3, 4, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2570, '产品导出', 'erp:product:export', 3, 5, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2571, '产品分类', '', 2, 1, 2564, 'product-category', 'fa:certificate', 'erp/product/category/index', 'ErpProductCategory', 0, '1', '1', '1', '', '2024-02-04 09:21:04', '1', '2024-02-04 17:24:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2572, '分类查询', 'erp:product-category:query', 3, 1, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2573, '分类创建', 'erp:product-category:create', 3, 2, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2574, '分类更新', 'erp:product-category:update', 3, 3, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2575, '分类删除', 'erp:product-category:delete', 3, 4, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2576, '分类导出', 'erp:product-category:export', 3, 5, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2577, '产品单位', '', 2, 2, 2564, 'unit', 'ep:opportunity', 'erp/product/unit/index', 'ErpProductUnit', 0, '1', '1', '1', '', '2024-02-04 11:54:08', '1', '2024-02-04 19:54:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2578, '单位查询', 'erp:product-unit:query', 3, 1, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2579, '单位创建', 'erp:product-unit:create', 3, 2, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2580, '单位更新', 'erp:product-unit:update', 3, 3, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2581, '单位删除', 'erp:product-unit:delete', 3, 4, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2582, '单位导出', 'erp:product-unit:export', 3, 5, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2583, '库存管理', '', 1, 30, 2563, 'stock', 'fa:window-restore', '', '', 0, '1', '1', '1', '1', '2024-02-05 00:29:37', '1', '2024-02-05 00:29:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2584, '仓库信息', '', 2, 0, 2583, 'warehouse', 'ep:house', 'erp/stock/warehouse/index', 'ErpWarehouse', 0, '1', '1', '1', '', '2024-02-04 17:12:09', '1', '2024-02-05 01:12:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2585, '仓库查询', 'erp:warehouse:query', 3, 1, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2586, '仓库创建', 'erp:warehouse:create', 3, 2, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2587, '仓库更新', 'erp:warehouse:update', 3, 3, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2588, '仓库删除', 'erp:warehouse:delete', 3, 4, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2589, '仓库导出', 'erp:warehouse:export', 3, 5, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2590, '产品库存', '', 2, 1, 2583, 'stock', 'ep:coffee', 'erp/stock/stock/index', 'ErpStock', 0, '1', '1', '1', '', '2024-02-05 06:40:50', '1', '2024-02-05 14:42:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2591, '库存查询', 'erp:stock:query', 3, 1, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2592, '库存导出', 'erp:stock:export', 3, 5, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2593, '出入库明细', '', 2, 2, 2583, 'record', 'fa-solid:blog', 'erp/stock/record/index', 'ErpStockRecord', 0, '1', '1', '1', '', '2024-02-05 10:27:21', '1', '2024-02-06 17:26:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2594, '库存明细查询', 'erp:stock-record:query', 3, 1, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2595, '库存明细导出', 'erp:stock-record:export', 3, 5, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2596, '其它入库', '', 2, 3, 2583, 'in', 'ep:zoom-in', 'erp/stock/in/index', 'ErpStockIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2597, '其它入库单查询', 'erp:stock-in:query', 3, 1, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2598, '其它入库单创建', 'erp:stock-in:create', 3, 2, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2599, '其它入库单更新', 'erp:stock-in:update', 3, 3, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2600, '其它入库单删除', 'erp:stock-in:delete', 3, 4, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2601, '其它入库单导出', 'erp:stock-in:export', 3, 5, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2602, '采购管理', '', 1, 10, 2563, 'purchase', 'fa:buysellads', '', '', 0, '1', '1', '1', '1', '2024-02-06 16:01:01', '1', '2024-02-06 16:01:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2603, '供应商信息', '', 2, 4, 2602, 'supplier', 'fa:superpowers', 'erp/purchase/supplier/index', 'ErpSupplier', 0, '1', '1', '1', '', '2024-02-06 08:21:55', '1', '2024-02-06 16:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2604, '供应商查询', 'erp:supplier:query', 3, 1, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2605, '供应商创建', 'erp:supplier:create', 3, 2, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2606, '供应商更新', 'erp:supplier:update', 3, 3, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2607, '供应商删除', 'erp:supplier:delete', 3, 4, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2608, '供应商导出', 'erp:supplier:export', 3, 5, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2609, '其它入库单审批', 'erp:stock-in:update-status', 3, 6, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2610, '其它出库', '', 2, 4, 2583, 'out', 'ep:zoom-out', 'erp/stock/out/index', 'ErpStockOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2611, '其它出库单查询', 'erp:stock-out:query', 3, 1, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2612, '其它出库单创建', 'erp:stock-out:create', 3, 2, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2613, '其它出库单更新', 'erp:stock-out:update', 3, 3, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2614, '其它出库单删除', 'erp:stock-out:delete', 3, 4, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2615, '其它出库单导出', 'erp:stock-out:export', 3, 5, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2616, '其它出库单审批', 'erp:stock-out:update-status', 3, 6, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2617, '销售管理', '', 1, 20, 2563, 'sale', 'fa:sellsy', '', '', 0, '1', '1', '1', '1', '2024-02-07 15:12:32', '1', '2024-02-07 15:12:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2618, '客户信息', '', 2, 4, 2617, 'customer', 'ep:avatar', 'erp/sale/customer/index', 'ErpCustomer', 0, '1', '1', '1', '', '2024-02-07 07:21:45', '1', '2024-02-07 15:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2619, '客户查询', 'erp:customer:query', 3, 1, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2620, '客户创建', 'erp:customer:create', 3, 2, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2621, '客户更新', 'erp:customer:update', 3, 3, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2622, '客户删除', 'erp:customer:delete', 3, 4, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2623, '客户导出', 'erp:customer:export', 3, 5, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2624, '库存调拨', '', 2, 5, 2583, 'move', 'ep:folder-remove', 'erp/stock/move/index', 'ErpStockMove', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-16 18:53:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2625, '库存调度单查询', 'erp:stock-move:query', 3, 1, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2626, '库存调度单创建', 'erp:stock-move:create', 3, 2, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2627, '库存调度单更新', 'erp:stock-move:update', 3, 3, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2628, '库存调度单删除', 'erp:stock-move:delete', 3, 4, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2629, '库存调度单导出', 'erp:stock-move:export', 3, 5, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2630, '库存调度单审批', 'erp:stock-move:update-status', 3, 6, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2631, '库存盘点', '', 2, 6, 2583, 'check', 'ep:circle-check-filled', 'erp/stock/check/index', 'ErpStockCheck', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-08 08:31:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2632, '库存盘点单查询', 'erp:stock-check:query', 3, 1, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2633, '库存盘点单创建', 'erp:stock-check:create', 3, 2, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2634, '库存盘点单更新', 'erp:stock-check:update', 3, 3, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2635, '库存盘点单删除', 'erp:stock-check:delete', 3, 4, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2636, '库存盘点单导出', 'erp:stock-check:export', 3, 5, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2637, '库存盘点单审批', 'erp:stock-check:update-status', 3, 6, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2638, '销售订单', '', 2, 1, 2617, 'order', 'fa:first-order', 'erp/sale/order/index', 'ErpSaleOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 21:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2639, '销售订单查询', 'erp:sale-order:query', 3, 1, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2640, '销售订单创建', 'erp:sale-order:create', 3, 2, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2641, '销售订单更新', 'erp:sale-order:update', 3, 3, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2642, '销售订单删除', 'erp:sale-order:delete', 3, 4, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2643, '销售订单导出', 'erp:sale-order:export', 3, 5, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2644, '销售订单审批', 'erp:sale-order:update-status', 3, 6, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2645, '财务管理', '', 1, 50, 2563, 'finance', 'ep:money', '', '', 0, '1', '1', '1', '1', '2024-02-10 08:05:58', '1', '2024-02-10 08:06:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2646, '结算账户', '', 2, 10, 2645, 'account', 'fa:universal-access', 'erp/finance/account/index', 'ErpAccount', 0, '1', '1', '1', '', '2024-02-10 00:15:07', '1', '2024-02-14 08:24:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2647, '结算账户查询', 'erp:account:query', 3, 1, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2648, '结算账户创建', 'erp:account:create', 3, 2, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2649, '结算账户更新', 'erp:account:update', 3, 3, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2650, '结算账户删除', 'erp:account:delete', 3, 4, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2651, '结算账户导出', 'erp:account:export', 3, 5, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2652, '销售出库', '', 2, 2, 2617, 'out', 'ep:sold-out', 'erp/sale/out/index', 'ErpSaleOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 22:02:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2653, '销售出库查询', 'erp:sale-out:query', 3, 1, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2654, '销售出库创建', 'erp:sale-out:create', 3, 2, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2655, '销售出库更新', 'erp:sale-out:update', 3, 3, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2656, '销售出库删除', 'erp:sale-out:delete', 3, 4, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2657, '销售出库导出', 'erp:sale-out:export', 3, 5, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2658, '销售出库审批', 'erp:sale-out:update-status', 3, 6, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2659, '销售退货', '', 2, 3, 2617, 'return', 'fa-solid:bone', 'erp/sale/return/index', 'ErpSaleReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 06:12:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2660, '销售退货查询', 'erp:sale-return:query', 3, 1, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2661, '销售退货创建', 'erp:sale-return:create', 3, 2, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2662, '销售退货更新', 'erp:sale-return:update', 3, 3, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2663, '销售退货删除', 'erp:sale-return:delete', 3, 4, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2664, '销售退货导出', 'erp:sale-return:export', 3, 5, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2665, '销售退货审批', 'erp:sale-return:update-status', 3, 6, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2666, '采购订单', '', 2, 1, 2602, 'order', 'fa-solid:border-all', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 08:51:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2667, '采购订单查询', 'erp:purchase-order:query', 3, 1, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2668, '采购订单创建', 'erp:purchase-order:create', 3, 2, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2669, '采购订单更新', 'erp:purchase-order:update', 3, 3, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2670, '采购订单删除', 'erp:purchase-order:delete', 3, 4, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2671, '采购订单导出', 'erp:purchase-order:export', 3, 5, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2672, '采购订单审批', 'erp:purchase-order:update-status', 3, 6, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2673, '采购入库', '', 2, 2, 2602, 'in', 'fa-solid:gopuram', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 11:19:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2674, '采购入库查询', 'erp:purchase-in:query', 3, 1, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2675, '采购入库创建', 'erp:purchase-in:create', 3, 2, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2676, '采购入库更新', 'erp:purchase-in:update', 3, 3, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2677, '采购入库删除', 'erp:purchase-in:delete', 3, 4, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2678, '采购入库导出', 'erp:purchase-in:export', 3, 5, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2679, '采购入库审批', 'erp:purchase-in:update-status', 3, 6, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2680, '采购退货', '', 2, 3, 2602, 'return', 'ep:minus', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 20:51:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2681, '采购退货查询', 'erp:purchase-return:query', 3, 1, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2682, '采购退货创建', 'erp:purchase-return:create', 3, 2, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2683, '采购退货更新', 'erp:purchase-return:update', 3, 3, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2684, '采购退货删除', 'erp:purchase-return:delete', 3, 4, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2685, '采购退货导出', 'erp:purchase-return:export', 3, 5, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2686, '采购退货审批', 'erp:purchase-return:update-status', 3, 6, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2687, '付款单', '', 2, 1, 2645, 'payment', 'ep:caret-right', 'erp/finance/payment/index', 'ErpFinancePayment', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-14 08:24:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2688, '付款单查询', 'erp:finance-payment:query', 3, 1, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2689, '付款单创建', 'erp:finance-payment:create', 3, 2, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2690, '付款单更新', 'erp:finance-payment:update', 3, 3, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2691, '付款单删除', 'erp:finance-payment:delete', 3, 4, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2692, '付款单导出', 'erp:finance-payment:export', 3, 5, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2693, '付款单审批', 'erp:finance-payment:update-status', 3, 6, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2694, '收款单', '', 2, 2, 2645, 'receipt', 'ep:expand', 'erp/finance/receipt/index', 'ErpFinanceReceipt', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-15 19:35:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2695, '收款单查询', 'erp:finance-receipt:query', 3, 1, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2696, '收款单创建', 'erp:finance-receipt:create', 3, 2, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2697, '收款单更新', 'erp:finance-receipt:update', 3, 3, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2698, '收款单删除', 'erp:finance-receipt:delete', 3, 4, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2699, '收款单导出', 'erp:finance-receipt:export', 3, 5, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2700, '收款单审批', 'erp:finance-receipt:update-status', 3, 6, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2701, '待办事项', '', 2, 0, 2397, 'backlog', 'fa-solid:tasks', 'crm/backlog/index', 'CrmBacklog', 0, '1', '1', '1', '1', '2024-02-17 17:17:11', '1', '2024-02-17 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2702, 'ERP 首页', 'erp:statistics:query', 2, 0, 2563, 'home', 'ep:home-filled', 'erp/home/index.vue', 'ErpHome', 0, '1', '1', '1', '1', '2024-02-18 16:49:40', '1', '2024-02-26 21:12:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2703, '商机状态配置', '', 2, 4, 2524, 'business-status', 'fa-solid:charging-station', 'crm/business/status/index', 'CrmBusinessStatus', 0, '1', '1', '1', '1', '2024-02-21 20:15:17', '1', '2024-02-21 20:15:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2704, '商机状态查询', 'crm:business-status:query', 3, 1, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:36', '1', '2024-02-21 20:36:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2705, '商机状态创建', 'crm:business-status:create', 3, 2, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:57', '1', '2024-02-21 20:35:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2706, '商机状态更新', 'crm:business-status:update', 3, 3, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:21', '1', '2024-02-21 20:36:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2707, '商机状态删除', 'crm:business-status:delete', 3, 4, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:36', '1', '2024-02-21 20:36:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2708, '合同配置', '', 2, 5, 2524, 'contract-config', 'ep:connection', 'crm/contract/config/index', 'CrmContractConfig', 0, '1', '1', '1', '1', '2024-02-24 16:44:40', '1', '2024-02-24 16:44:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2709, '客户公海配置查询', 'crm:customer-pool-config:query', 3, 2, 2516, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:19', '1', '2024-02-24 16:45:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2710, '合同配置更新', 'crm:contract-config:update', 3, 1, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:56', '1', '2024-02-24 16:45:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2711, '合同配置查询', 'crm:contract-config:query', 3, 2, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:46:16', '1', '2024-02-24 16:46:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2712, '客户分析', 'crm:statistics-customer:query', 2, 0, 2560, 'customer', 'ep:avatar', 'crm/statistics/customer/index.vue', 'CrmStatisticsCustomer', 0, '1', '1', '1', '1', '2024-03-09 16:43:56', '1', '2024-05-04 20:38:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, '1', '1', '1', '1', '2024-03-17 21:50:23', '1', '2024-04-24 19:55:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-21 23:51:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, '1', '0', '1', '1', '2024-03-19 19:46:05', '1', '2024-03-23 19:03:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, '1', '1', '1', '1', '2024-03-21 23:57:30', '1', '2024-03-21 23:57:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:18:27', '1', '2024-03-22 08:19:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:19:25', '1', '2024-03-22 08:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, '1', '1', '1', '1', '2024-03-22 08:43:22', '1', '2024-03-22 08:43:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:43:49', '1', '2024-03-22 08:43:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, '1', '1', '1', '', '2024-03-09 16:05:34', '1', '2024-03-23 13:13:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, '1', '1', '1', '', '2024-03-09 22:35:08', '1', '2024-03-23 19:43:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2736, '员工业绩', 'crm:statistics-performance:query', 2, 3, 2560, 'performance', 'ep:dish-dot', 'crm/statistics/performance/index', 'CrmStatisticsPerformance', 0, '1', '1', '1', '1', '2024-04-05 13:49:20', '1', '2024-04-24 19:42:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2737, '客户画像', 'crm:statistics-portrait:query', 2, 4, 2560, 'portrait', 'ep:picture', 'crm/statistics/portrait/index', 'CrmStatisticsPortrait', 0, '1', '1', '1', '1', '2024-04-05 13:57:40', '1', '2024-04-24 19:42:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2738, '销售漏斗', 'crm:statistics-funnel:query', 2, 5, 2560, 'funnel', 'ep:grape', 'crm/statistics/funnel/index', 'CrmStatisticsFunnel', 0, '1', '1', '1', '1', '2024-04-13 10:53:26', '1', '2024-04-24 19:39:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2739, '消息中心', '', 1, 7, 1, 'messages', 'ep:chat-dot-round', '', '', 0, '1', '1', '1', '1', '2024-04-22 23:54:30', '1', '2024-04-23 09:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, '1', '1', '1', '1', '2024-04-23 00:04:44', '1', '2024-04-23 00:04:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2741, '领取公海客户', 'crm:customer:receive', 3, 1, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:47:45', '1', '2024-04-24 19:47:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2742, '分配公海客户', 'crm:customer:distribute', 3, 2, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:48:05', '1', '2024-04-24 19:48:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2743, '商品统计查询', 'statistics:product:query', 3, 1, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:05', '1', '2024-04-24 19:50:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2744, '商品统计导出', 'statistics:product:export', 3, 2, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:26', '1', '2024-04-24 19:50:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2745, '支付渠道查询', 'pay:channel:query', 3, 10, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:01', '1', '2024-04-24 19:53:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2746, '支付渠道创建', 'pay:channel:create', 3, 11, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:18', '1', '2024-04-24 19:53:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2747, '支付渠道更新', 'pay:channel:update', 3, 12, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:32', '1', '2024-04-24 19:53:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2748, '支付渠道删除', 'pay:channel:delete', 3, 13, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:54:34', '1', '2024-04-24 19:54:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2749, '商品收藏查询', 'product:favorite:query', 3, 10, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:55:47', '1', '2024-04-24 19:55:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2750, '商品浏览查询', 'product:browse-history:query', 3, 20, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:57:43', '1', '2024-04-24 19:57:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2751, '售后同意', 'trade:after-sale:agree', 3, 2, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:58:40', '1', '2024-04-24 19:58:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2752, '售后不同意', 'trade:after-sale:disagree', 3, 3, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:59:03', '1', '2024-04-24 19:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2753, '售后确认退货', 'trade:after-sale:receive', 3, 4, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:07', '1', '2024-04-24 20:00:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2754, '售后确认退款', 'trade:after-sale:refund', 3, 5, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:24', '1', '2024-04-24 20:00:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2755, '删除项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:01:37', '1', '2024-04-24 20:01:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2756, '会员等级记录查询', 'member:level-record:query', 3, 10, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:32', '1', '2024-04-24 20:02:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2757, '会员经验记录查询', 'member:experience-record:query', 3, 11, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:51', '1', '2024-04-24 20:02:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2758, 'AI 大模型', '', 1, 400, 0, '/ai', 'fa:apple', '', '', 0, '1', '1', '1', '1', '2024-05-07 15:07:56', '1', '2024-05-25 12:36:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2759, 'AI 对话', '', 2, 1, 2758, 'chat', 'ep:message', 'ai/chat/index/index.vue', 'AiChat', 0, '1', '1', '1', '1', '2024-05-07 15:09:14', '1', '2024-07-07 17:15:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2760, '控制台', '', 1, 100, 2758, 'console', 'ep:setting', '', '', 0, '1', '1', '1', '1', '2024-05-09 22:39:09', '1', '2024-05-24 23:34:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2761, 'API 密钥', '', 2, 0, 2760, 'api-key', 'ep:key', 'ai/model/apiKey/index.vue', 'AiApiKey', 0, '1', '1', '1', '', '2024-05-09 14:52:56', '1', '2024-05-10 22:44:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2762, 'API 密钥查询', 'ai:api-key:query', 3, 1, 2761, '', '', '', '', 0, '1', '1', '1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2763, 'API 密钥创建', 'ai:api-key:create', 3, 2, 2761, '', '', '', '', 0, '1', '1', '1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2764, 'API 密钥更新', 'ai:api-key:update', 3, 3, 2761, '', '', '', '', 0, '1', '1', '1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2765, 'API 密钥删除', 'ai:api-key:delete', 3, 4, 2761, '', '', '', '', 0, '1', '1', '1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2767, '聊天模型', '', 2, 0, 2760, 'chat-model', 'fa-solid:abacus', 'ai/model/chatModel/index.vue', 'AiChatModel', 0, '1', '1', '1', '', '2024-05-10 14:42:48', '1', '2024-05-10 22:44:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2768, '聊天模型查询', 'ai:chat-model:query', 3, 1, 2767, '', '', '', '', 0, '1', '1', '1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2769, '聊天模型创建', 'ai:chat-model:create', 3, 2, 2767, '', '', '', '', 0, '1', '1', '1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2770, '聊天模型更新', 'ai:chat-model:update', 3, 3, 2767, '', '', '', '', 0, '1', '1', '1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2771, '聊天模型删除', 'ai:chat-model:delete', 3, 4, 2767, '', '', '', '', 0, '1', '1', '1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2773, '聊天角色', '', 2, 0, 2760, 'chat-role', 'fa:user-secret', 'ai/model/chatRole/index.vue', 'AiChatRole', 0, '1', '1', '1', '', '2024-05-13 12:39:28', '1', '2024-05-13 20:41:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2774, '聊天角色查询', 'ai:chat-role:query', 3, 1, 2773, '', '', '', NULL, 0, '1', '1', '1', '', '2024-05-13 12:39:28', '', '2024-05-13 12:39:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2775, '聊天角色创建', 'ai:chat-role:create', 3, 2, 2773, '', '', '', NULL, 0, '1', '1', '1', '', '2024-05-13 12:39:28', '', '2024-05-13 12:39:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2776, '聊天角色更新', 'ai:chat-role:update', 3, 3, 2773, '', '', '', NULL, 0, '1', '1', '1', '', '2024-05-13 12:39:28', '', '2024-05-13 12:39:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2777, '聊天角色删除', 'ai:chat-role:delete', 3, 4, 2773, '', '', '', '', 0, '1', '1', '1', '1', '2024-05-13 21:43:38', '1', '2024-05-13 21:43:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2778, '聊天管理', '', 2, 10, 2760, 'chat-conversation', 'ep:chat-square', 'ai/chat/manager/index.vue', 'AiChatManager', 0, '1', '1', '1', '', '2024-05-24 15:39:18', '1', '2024-06-26 21:36:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2779, '会话查询', 'ai:chat-conversation:query', 3, 1, 2778, '', '', '', '', 0, '1', '1', '1', '', '2024-05-24 15:39:18', '1', '2024-05-25 08:38:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2780, '会话删除', 'ai:chat-conversation:delete', 3, 2, 2778, '', '', '', '', 0, '1', '1', '1', '', '2024-05-24 15:39:18', '1', '2024-05-25 08:38:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2781, '消息查询', 'ai:chat-message:query', 3, 11, 2778, '', '', '', '', 0, '1', '1', '1', '1', '2024-05-25 08:38:56', '1', '2024-05-25 08:38:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2782, '消息删除', 'ai:chat-message:delete', 3, 12, 2778, '', '', '', '', 0, '1', '1', '1', '1', '2024-05-25 08:39:10', '1', '2024-05-25 08:39:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2783, 'AI 绘画', '', 2, 2, 2758, 'image', 'ep:picture-rounded', 'ai/image/index/index.vue', 'AiImage', 0, '1', '1', '1', '1', '2024-05-26 11:45:17', '1', '2024-07-07 17:18:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2784, '绘画管理', '', 2, 11, 2760, 'image', 'fa:file-image-o', 'ai/image/manager/index.vue', 'AiImageManager', 0, '1', '1', '1', '', '2024-06-26 13:32:31', '1', '2024-06-26 21:37:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2785, '绘画查询', 'ai:image:query', 3, 1, 2784, '', '', '', '', 0, '1', '1', '1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:21:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2786, '绘画删除', 'ai:image:delete', 3, 4, 2784, '', '', '', '', 0, '1', '1', '1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:22:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2787, '绘图更新', 'ai:image:update', 3, 2, 2784, '', '', '', '', 0, '1', '1', '1', '1', '2024-06-26 22:47:56', '1', '2024-08-31 09:21:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2788, '音乐管理', '', 2, 12, 2760, 'music', 'fa:music', 'ai/music/manager/index.vue', 'AiMusicManager', 0, '1', '1', '1', '', '2024-06-27 15:03:33', '1', '2024-06-27 23:04:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2789, '音乐查询', 'ai:music:query', 3, 1, 2788, '', '', '', NULL, 0, '1', '1', '1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2790, '音乐更新', 'ai:music:update', 3, 3, 2788, '', '', '', NULL, 0, '1', '1', '1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2791, '音乐删除', 'ai:music:delete', 3, 4, 2788, '', '', '', NULL, 0, '1', '1', '1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2792, 'AI 写作', '', 2, 3, 2758, 'write', 'fa-solid:book-reader', 'ai/write/index/index.vue', 'AiWrite', 0, '1', '1', '1', '1', '2024-07-08 09:26:44', '1', '2024-07-16 13:03:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2793, '写作管理', '', 2, 13, 2760, 'write', 'fa:bookmark-o', 'ai/write/manager/index.vue', 'AiWriteManager', 0, '1', '1', '1', '', '2024-07-10 13:24:34', '1', '2024-07-10 21:31:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2794, 'AI 写作查询', 'ai:write:query', 3, 1, 2793, '', '', '', NULL, 0, '1', '1', '1', '', '2024-07-10 13:24:34', '', '2024-07-10 13:24:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2795, 'AI 写作删除', 'ai:write:delete', 3, 4, 2793, '', '', '', NULL, 0, '1', '1', '1', '', '2024-07-10 13:24:34', '', '2024-07-10 13:24:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2796, 'AI 音乐', '', 2, 4, 2758, 'music', 'fa:music', 'ai/music/index/index.vue', 'AiMusic', 0, '1', '1', '1', '1', '2024-07-17 09:21:12', '1', '2024-07-29 21:11:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2797, '客服中心', '', 2, 100, 2362, 'kefu', 'fa-solid:user-alt', 'mall/promotion/kefu/index', 'KeFu', 0, '1', '1', '1', '1', '2024-07-17 23:49:05', '1', '2024-07-17 23:49:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2798, 'AI 思维导图', '', 2, 5, 2758, 'mind-map', 'fa:sitemap', 'ai/mindmap/index/index.vue', 'AiMindMap', 0, '1', '1', '1', '1', '2024-07-29 21:31:59', '1', '2024-07-29 21:33:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2799, '导图管理', '', 2, 14, 2760, 'mind-map', 'fa:map', 'ai/mindmap/manager/index', 'AiMindMapManager', 0, '1', '1', '1', '', '2024-08-10 09:15:09', '1', '2024-08-10 17:24:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2800, '思维导图查询', 'ai:mind-map:query', 3, 1, 2799, '', '', '', NULL, 0, '1', '1', '1', '', '2024-08-10 09:15:09', '', '2024-08-10 09:15:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2801, '思维导图删除', 'ai:mind-map:delete', 3, 4, 2799, '', '', '', NULL, 0, '1', '1', '1', '', '2024-08-10 09:15:09', '', '2024-08-10 09:15:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2802, '会话查询', 'promotion:kefu-conversation:query', 3, 1, 2797, '', '', '', '', 0, '1', '1', '1', '1', '2024-08-31 09:17:52', '1', '2024-08-31 09:18:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2803, '会话更新', 'promotion:kefu-conversation:update', 3, 2, 2797, '', '', '', '', 0, '1', '1', '1', '1', '2024-08-31 09:18:15', '1', '2024-08-31 09:19:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2804, '消息查询', 'promotion:kefu-message:query', 3, 10, 2797, '', '', '', '', 0, '1', '1', '1', '1', '2024-08-31 09:18:42', '1', '2024-08-31 09:18:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2805, '会话删除', 'promotion:kefu-conversation:delete', 3, 3, 2797, '', '', '', '', 0, '1', '1', '1', '1', '2024-08-31 09:19:51', '1', '2024-08-31 09:20:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2806, '消息发送', 'promotion:kefu-message:send', 3, 12, 2797, '', '', '', '', 0, '1', '1', '1', '1', '2024-08-31 09:20:06', '1', '2024-08-31 09:20:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2807, '消息更新', 'promotion:kefu-message:update', 3, 11, 2797, '', '', '', '', 0, '1', '1', '1', '1', '2024-08-31 09:20:22', '1', '2024-08-31 09:20:22', '0'); +COMMIT; +SET IDENTITY_INSERT system_menu OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +CREATE TABLE system_notice ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + title varchar(50) NOT NULL, + content text NOT NULL, + type smallint NOT NULL, + status smallint DEFAULT 0 NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_notice.id IS '公告ID'; +COMMENT ON COLUMN system_notice.title IS '公告标题'; +COMMENT ON COLUMN system_notice.content IS '公告内容'; +COMMENT ON COLUMN system_notice.type IS '公告类型(1通知 2公告)'; +COMMENT ON COLUMN system_notice.status IS '公告状态(0正常 1关闭)'; +COMMENT ON COLUMN system_notice.creator IS '创建者'; +COMMENT ON COLUMN system_notice.create_time IS '创建时间'; +COMMENT ON COLUMN system_notice.updater IS '更新者'; +COMMENT ON COLUMN system_notice.update_time IS '更新时间'; +COMMENT ON COLUMN system_notice.deleted IS '是否删除'; +COMMENT ON COLUMN system_notice.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notice IS '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_notice ON; +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '芋道的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '维护通知:2018-07-01 系统凌晨维护', '

11112222

', 2, 1, 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 20:07:26', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', '0', 121); +COMMIT; +SET IDENTITY_INSERT system_notice OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +CREATE TABLE system_notify_message ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type smallint NOT NULL, + template_id bigint NOT NULL, + template_code varchar(64) NOT NULL, + template_nickname varchar(63) NOT NULL, + template_content varchar(1024) NOT NULL, + template_type int NOT NULL, + template_params varchar(255) NOT NULL, + read_status bit NOT NULL, + read_time datetime DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_notify_message.id IS '用户ID'; +COMMENT ON COLUMN system_notify_message.user_id IS '用户id'; +COMMENT ON COLUMN system_notify_message.user_type IS '用户类型'; +COMMENT ON COLUMN system_notify_message.template_id IS '模版编号'; +COMMENT ON COLUMN system_notify_message.template_code IS '模板编码'; +COMMENT ON COLUMN system_notify_message.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_notify_message.template_content IS '模版内容'; +COMMENT ON COLUMN system_notify_message.template_type IS '模版类型'; +COMMENT ON COLUMN system_notify_message.template_params IS '模版参数'; +COMMENT ON COLUMN system_notify_message.read_status IS '是否已读'; +COMMENT ON COLUMN system_notify_message.read_time IS '阅读时间'; +COMMENT ON COLUMN system_notify_message.creator IS '创建者'; +COMMENT ON COLUMN system_notify_message.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_message.updater IS '更新者'; +COMMENT ON COLUMN system_notify_message.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_message.deleted IS '是否删除'; +COMMENT ON COLUMN system_notify_message.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notify_message IS '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_notify_message ON; +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:44:08', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:45:04', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 103, 2, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{"name":"哈哈"}', '0', NULL, '1', '2023-01-28 21:02:20', '1', '2023-01-28 21:02:20', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 22:21:42', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 22:22:07', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 1, 2, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{"name":"2","what":"3"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:45:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 1, 2, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{"name":"123"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:50:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-28 08:35:46","price":"0.09"}', '0', NULL, '1', '2023-09-28 16:36:22', '1', '2023-09-28 16:36:22', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-30 20:59:40","price":"1.00"}', '0', NULL, '1', '2023-10-03 12:11:34', '1', '2023-10-03 12:11:34', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_notify_message OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +CREATE TABLE system_notify_template ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(63) NOT NULL, + code varchar(64) NOT NULL, + nickname varchar(255) NOT NULL, + content varchar(1024) NOT NULL, + type smallint NOT NULL, + params varchar(255) DEFAULT NULL NULL, + status smallint NOT NULL, + remark varchar(255) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_notify_template.id IS '主键'; +COMMENT ON COLUMN system_notify_template.name IS '模板名称'; +COMMENT ON COLUMN system_notify_template.code IS '模版编码'; +COMMENT ON COLUMN system_notify_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_notify_template.content IS '模版内容'; +COMMENT ON COLUMN system_notify_template.type IS '类型'; +COMMENT ON COLUMN system_notify_template.params IS '参数数组'; +COMMENT ON COLUMN system_notify_template.status IS '状态'; +COMMENT ON COLUMN system_notify_template.remark IS '备注'; +COMMENT ON COLUMN system_notify_template.creator IS '创建者'; +COMMENT ON COLUMN system_notify_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_template.updater IS '更新者'; +COMMENT ON COLUMN system_notify_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_template.deleted IS '是否删除'; +COMMENT ON TABLE system_notify_template IS '站内信模板表'; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +CREATE TABLE system_oauth2_access_token ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type smallint NOT NULL, + user_info varchar(512) NOT NULL, + access_token varchar(255) NOT NULL, + refresh_token varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) DEFAULT NULL NULL, + expires_time datetime NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +CREATE INDEX idx_system_oauth2_access_token_01 ON system_oauth2_access_token (access_token); +CREATE INDEX idx_system_oauth2_access_token_02 ON system_oauth2_access_token (refresh_token); + +COMMENT ON COLUMN system_oauth2_access_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_access_token.user_info IS '用户信息'; +COMMENT ON COLUMN system_oauth2_access_token.access_token IS '访问令牌'; +COMMENT ON COLUMN system_oauth2_access_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_access_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_access_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_access_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_access_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_access_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_access_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_access_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_access_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_access_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_access_token IS 'OAuth2 访问令牌'; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +CREATE TABLE system_oauth2_approve ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type smallint NOT NULL, + client_id varchar(255) NOT NULL, + scope varchar(255) DEFAULT '' NULL, + approved bit DEFAULT '0' NOT NULL, + expires_time datetime NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_oauth2_approve.id IS '编号'; +COMMENT ON COLUMN system_oauth2_approve.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_approve.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_approve.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_approve.scope IS '授权范围'; +COMMENT ON COLUMN system_oauth2_approve.approved IS '是否接受'; +COMMENT ON COLUMN system_oauth2_approve.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_approve.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_approve.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_approve.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_approve.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_approve.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_approve.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_approve IS 'OAuth2 批准表'; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +CREATE TABLE system_oauth2_client ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + client_id varchar(255) NOT NULL, + secret varchar(255) NOT NULL, + name varchar(255) NOT NULL, + logo varchar(255) NOT NULL, + description varchar(255) DEFAULT NULL NULL, + status smallint NOT NULL, + access_token_validity_seconds int NOT NULL, + refresh_token_validity_seconds int NOT NULL, + redirect_uris varchar(255) NOT NULL, + authorized_grant_types varchar(255) NOT NULL, + scopes varchar(255) DEFAULT NULL NULL, + auto_approve_scopes varchar(255) DEFAULT NULL NULL, + authorities varchar(255) DEFAULT NULL NULL, + resource_ids varchar(255) DEFAULT NULL NULL, + additional_information varchar(4096) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_oauth2_client.id IS '编号'; +COMMENT ON COLUMN system_oauth2_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_client.secret IS '客户端密钥'; +COMMENT ON COLUMN system_oauth2_client.name IS '应用名'; +COMMENT ON COLUMN system_oauth2_client.logo IS '应用图标'; +COMMENT ON COLUMN system_oauth2_client.description IS '应用描述'; +COMMENT ON COLUMN system_oauth2_client.status IS '状态'; +COMMENT ON COLUMN system_oauth2_client.access_token_validity_seconds IS '访问令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.refresh_token_validity_seconds IS '刷新令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.redirect_uris IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_client.authorized_grant_types IS '授权类型'; +COMMENT ON COLUMN system_oauth2_client.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_client.auto_approve_scopes IS '自动通过的授权范围'; +COMMENT ON COLUMN system_oauth2_client.authorities IS '权限'; +COMMENT ON COLUMN system_oauth2_client.resource_ids IS '资源'; +COMMENT ON COLUMN system_oauth2_client.additional_information IS '附加信息'; +COMMENT ON COLUMN system_oauth2_client.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_client.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_client.deleted IS '是否删除'; +COMMENT ON TABLE system_oauth2_client IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_oauth2_client ON; +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 2592000, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', '[]', '["user.read","user.write"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2024-02-22 16:31:52', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', '啦啦啦啦', 0, 1800, 43200, '["https://www.iocoder.cn"]', '["password","authorization_code","implicit"]', '["user_info","projects"]', '["user_info"]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2023-12-02 21:01:01', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["authorization_code","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-09-29 13:28:31', '1', '2022-09-29 13:28:31', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["password","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-10-04 17:40:16', '1', '2022-10-04 20:31:21', '0'); +COMMIT; +SET IDENTITY_INSERT system_oauth2_client OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +CREATE TABLE system_oauth2_code ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type smallint NOT NULL, + code varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) DEFAULT '' NULL, + expires_time datetime NOT NULL, + redirect_uri varchar(255) DEFAULT NULL NULL, + state varchar(255) DEFAULT '' NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_oauth2_code.id IS '编号'; +COMMENT ON COLUMN system_oauth2_code.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_code.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_code.code IS '授权码'; +COMMENT ON COLUMN system_oauth2_code.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_code.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_code.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_code.redirect_uri IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_code.state IS '状态'; +COMMENT ON COLUMN system_oauth2_code.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_code.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_code IS 'OAuth2 授权码表'; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +CREATE TABLE system_oauth2_refresh_token ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + refresh_token varchar(32) NOT NULL, + user_type smallint NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) DEFAULT NULL NULL, + expires_time datetime NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_oauth2_refresh_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_refresh_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_refresh_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_refresh_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_refresh_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_refresh_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_refresh_token IS 'OAuth2 刷新令牌'; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +CREATE TABLE system_operate_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + trace_id varchar(64) DEFAULT '' NULL, + user_id bigint NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + type varchar(50) NOT NULL, + sub_type varchar(50) NOT NULL, + biz_id bigint NOT NULL, + action varchar(2000) DEFAULT '' NULL, + extra varchar(2000) DEFAULT '' NULL, + request_method varchar(16) DEFAULT '' NULL, + request_url varchar(255) DEFAULT '' NULL, + user_ip varchar(50) DEFAULT NULL NULL, + user_agent varchar(200) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_operate_log.id IS '日志主键'; +COMMENT ON COLUMN system_operate_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_operate_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_operate_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_operate_log.type IS '操作模块类型'; +COMMENT ON COLUMN system_operate_log.sub_type IS '操作名'; +COMMENT ON COLUMN system_operate_log.biz_id IS '操作数据模块编号'; +COMMENT ON COLUMN system_operate_log.action IS '操作内容'; +COMMENT ON COLUMN system_operate_log.extra IS '拓展字段'; +COMMENT ON COLUMN system_operate_log.request_method IS '请求方法名'; +COMMENT ON COLUMN system_operate_log.request_url IS '请求地址'; +COMMENT ON COLUMN system_operate_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_operate_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_operate_log.creator IS '创建者'; +COMMENT ON COLUMN system_operate_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_operate_log.updater IS '更新者'; +COMMENT ON COLUMN system_operate_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_operate_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_operate_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_operate_log IS '操作日志记录 V2 版本'; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +CREATE TABLE system_post ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + code varchar(64) NOT NULL, + name varchar(50) NOT NULL, + sort int NOT NULL, + status smallint NOT NULL, + remark varchar(500) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_post.id IS '岗位ID'; +COMMENT ON COLUMN system_post.code IS '岗位编码'; +COMMENT ON COLUMN system_post.name IS '岗位名称'; +COMMENT ON COLUMN system_post.sort IS '显示顺序'; +COMMENT ON COLUMN system_post.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_post.remark IS '备注'; +COMMENT ON COLUMN system_post.creator IS '创建者'; +COMMENT ON COLUMN system_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_post.updater IS '更新者'; +COMMENT ON COLUMN system_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_post IS '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_post ON; +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2023-02-11 15:19:04', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 09:18:20', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 10:04:37', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 'HR', '人力资源', 5, 0, '', '1', '2024-03-24 20:45:40', '1', '2024-03-24 20:45:40', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_post OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +CREATE TABLE system_role ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(30) NOT NULL, + code varchar(100) NOT NULL, + sort int NOT NULL, + data_scope smallint DEFAULT 1 NOT NULL, + data_scope_dept_ids varchar(500) DEFAULT '' NULL, + status smallint NOT NULL, + type smallint NOT NULL, + remark varchar(500) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_role.id IS '角色ID'; +COMMENT ON COLUMN system_role.name IS '角色名称'; +COMMENT ON COLUMN system_role.code IS '角色权限字符串'; +COMMENT ON COLUMN system_role.sort IS '显示顺序'; +COMMENT ON COLUMN system_role.data_scope IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT ON COLUMN system_role.data_scope_dept_ids IS '数据范围(指定部门数组)'; +COMMENT ON COLUMN system_role.status IS '角色状态(0正常 1停用)'; +COMMENT ON COLUMN system_role.type IS '角色类型'; +COMMENT ON COLUMN system_role.remark IS '备注'; +COMMENT ON COLUMN system_role.creator IS '创建者'; +COMMENT ON COLUMN system_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_role.updater IS '更新者'; +COMMENT ON COLUMN system_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role IS '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_role ON; +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '', '', '2021-01-06 13:49:35', '1', '2024-08-11 10:41:10', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (153, '某角色', 'tt', 4, 1, '', 0, 2, '', '1', '2024-08-17 14:09:35', '1', '2024-08-17 14:09:35', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_role OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +CREATE TABLE system_role_menu ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + role_id bigint NOT NULL, + menu_id bigint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_role_menu.id IS '自增编号'; +COMMENT ON COLUMN system_role_menu.role_id IS '角色ID'; +COMMENT ON COLUMN system_role_menu.menu_id IS '菜单ID'; +COMMENT ON COLUMN system_role_menu.creator IS '创建者'; +COMMENT ON COLUMN system_role_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_role_menu.updater IS '更新者'; +COMMENT ON COLUMN system_role_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_role_menu.deleted IS '是否删除'; +COMMENT ON COLUMN system_role_menu.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role_menu IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_role_menu ON; +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1729, 109, 100, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1730, 109, 101, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1731, 109, 1063, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1732, 109, 1064, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1733, 109, 1001, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1734, 109, 1065, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1735, 109, 1002, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1736, 109, 1003, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1737, 109, 1004, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1738, 109, 1005, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1739, 109, 1006, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1740, 109, 1007, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1741, 109, 1008, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1742, 109, 1009, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1743, 109, 1010, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1744, 109, 1011, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1745, 109, 1012, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1746, 111, 100, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1747, 111, 101, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1748, 111, 1063, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1749, 111, 1064, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1750, 111, 1001, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1751, 111, 1065, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1752, 111, 1002, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1753, 111, 1003, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1754, 111, 1004, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1755, 111, 1005, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1756, 111, 1006, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1757, 111, 1007, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1758, 111, 1008, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1759, 111, 1009, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1760, 111, 1010, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1761, 111, 1011, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1762, 111, 1012, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1763, 109, 100, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1764, 109, 101, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1765, 109, 1063, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1766, 109, 1064, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1767, 109, 1001, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1768, 109, 1065, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1769, 109, 1002, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1770, 109, 1003, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1771, 109, 1004, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1772, 109, 1005, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1773, 109, 1006, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1774, 109, 1007, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1775, 109, 1008, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1776, 109, 1009, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1777, 109, 1010, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1778, 109, 1011, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1779, 109, 1012, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1780, 111, 100, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1781, 111, 101, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1782, 111, 1063, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1783, 111, 1064, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1784, 111, 1001, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1785, 111, 1065, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1786, 111, 1002, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1787, 111, 1003, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1788, 111, 1004, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1789, 111, 1005, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1790, 111, 1006, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1791, 111, 1007, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1792, 111, 1008, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1793, 111, 1009, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1794, 111, 1010, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1795, 111, 1011, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1796, 111, 1012, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1797, 109, 100, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1798, 109, 101, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1799, 109, 1063, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1800, 109, 1064, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1801, 109, 1001, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1802, 109, 1065, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1803, 109, 1002, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1804, 109, 1003, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1805, 109, 1004, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1806, 109, 1005, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1807, 109, 1006, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1808, 109, 1007, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1809, 109, 1008, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1810, 109, 1009, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1811, 109, 1010, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1812, 109, 1011, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1813, 109, 1012, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1814, 111, 100, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1815, 111, 101, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1816, 111, 1063, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1817, 111, 1064, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1818, 111, 1001, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1819, 111, 1065, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1820, 111, 1002, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1821, 111, 1003, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1822, 111, 1004, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1823, 111, 1005, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1824, 111, 1006, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1825, 111, 1007, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1826, 111, 1008, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1827, 111, 1009, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1828, 111, 1010, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1829, 111, 1011, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1830, 111, 1012, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1831, 109, 103, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1832, 109, 1017, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1833, 109, 1018, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1834, 109, 1019, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1835, 109, 1020, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1836, 111, 103, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1837, 111, 1017, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1838, 111, 1018, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1839, 111, 1019, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1840, 111, 1020, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1841, 109, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1842, 109, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1843, 109, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1844, 109, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1845, 109, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1846, 111, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1847, 111, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1848, 111, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1849, 111, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1850, 111, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2003, 2, 1036, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2004, 2, 1037, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2005, 2, 1038, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2006, 2, 1039, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2013, 2, 1050, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2014, 2, 1051, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2015, 2, 1052, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2016, 2, 1053, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2017, 2, 1054, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2018, 2, 1056, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2019, 2, 1057, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2020, 2, 1058, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2022, 2, 1059, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2023, 2, 1060, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2034, 2, 1075, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2039, 2, 1087, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2044, 2, 1095, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2045, 2, 1096, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2046, 2, 1097, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2047, 2, 1098, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2048, 2, 1101, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2049, 2, 1102, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2050, 2, 1103, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2051, 2, 1104, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2052, 2, 1105, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2053, 2, 1106, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2054, 2, 1108, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2055, 2, 1109, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2061, 2, 1127, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2069, 2, 1135, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2070, 2, 1136, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2071, 2, 1137, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2073, 2, 1139, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2074, 2, 115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2075, 2, 1140, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2077, 2, 1141, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2078, 2, 1142, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2079, 2, 1143, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2080, 2, 1150, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2081, 2, 1161, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2082, 2, 1162, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2083, 2, 1163, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2084, 2, 1164, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2085, 2, 1165, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2086, 2, 1166, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2087, 2, 1173, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2088, 2, 1174, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2089, 2, 1175, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2102, 2, 1229, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2116, 2, 1254, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2117, 2, 1255, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2118, 2, 1256, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2119, 2, 1257, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2120, 2, 1258, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2121, 2, 1259, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2122, 2, 1260, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2142, 2, 1014, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2144, 2, 1016, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2152, 2, 1281, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2153, 2, 1282, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2154, 2, 2000, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2155, 2, 2002, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2156, 2, 2003, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2157, 2, 2004, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2158, 2, 2005, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2159, 2, 2006, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2160, 2, 2008, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2161, 2, 2009, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2162, 2, 2010, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2163, 2, 2011, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2164, 2, 2012, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2170, 2, 2019, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2171, 2, 2020, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2172, 2, 2021, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2173, 2, 2022, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2174, 2, 2023, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2175, 2, 2025, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2177, 2, 2027, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2178, 2, 2028, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2179, 2, 2029, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2180, 2, 2014, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2181, 2, 2015, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2182, 2, 2016, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2183, 2, 2017, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2184, 2, 2018, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2188, 101, 1024, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2189, 101, 1, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2190, 101, 1025, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2191, 101, 1026, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2192, 101, 1027, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2193, 101, 1028, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2194, 101, 1029, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2195, 101, 1030, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2196, 101, 1036, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2197, 101, 1037, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2198, 101, 1038, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2199, 101, 1039, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2200, 101, 1040, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2201, 101, 1042, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2202, 101, 1043, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2203, 101, 1045, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2204, 101, 1046, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2205, 101, 1048, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2206, 101, 2083, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2207, 101, 1063, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2208, 101, 1064, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2209, 101, 1065, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2210, 101, 1093, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2211, 101, 1094, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2212, 101, 1095, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2213, 101, 1096, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2214, 101, 1097, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2215, 101, 1098, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2216, 101, 1100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2217, 101, 1101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2218, 101, 1102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2219, 101, 1103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2220, 101, 1104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2221, 101, 1105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2222, 101, 1106, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2223, 101, 2130, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2224, 101, 1107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2225, 101, 2131, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2226, 101, 1108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2227, 101, 2132, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2228, 101, 1109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2229, 101, 2133, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2230, 101, 2134, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2232, 101, 2135, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2234, 101, 2136, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2236, 101, 2137, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2238, 101, 2138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2240, 101, 2139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2242, 101, 2140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2243, 101, 2141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2244, 101, 2142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2245, 101, 2143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2246, 101, 2144, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2247, 101, 2145, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2248, 101, 2146, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2249, 101, 2147, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2250, 101, 100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2251, 101, 2148, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2252, 101, 101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2253, 101, 2149, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2254, 101, 102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2255, 101, 2150, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2256, 101, 103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2257, 101, 2151, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2258, 101, 104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2259, 101, 2152, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2260, 101, 105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2261, 101, 107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2262, 101, 108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2263, 101, 109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2264, 101, 1138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2265, 101, 1139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2266, 101, 1140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2267, 101, 1141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2268, 101, 1142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2269, 101, 1143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2270, 101, 1224, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2271, 101, 1225, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2272, 101, 1226, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2273, 101, 1227, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2274, 101, 1228, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2275, 101, 1229, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2282, 101, 1261, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2283, 101, 1263, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2284, 101, 1264, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2285, 101, 1265, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2286, 101, 1266, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2287, 101, 1267, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2288, 101, 1001, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2289, 101, 1002, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2290, 101, 1003, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2291, 101, 1004, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2292, 101, 1005, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2293, 101, 1006, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2294, 101, 1007, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2295, 101, 1008, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2296, 101, 1009, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2297, 101, 1010, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2298, 101, 1011, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2299, 101, 1012, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2300, 101, 500, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2301, 101, 1013, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2302, 101, 501, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2303, 101, 1014, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2304, 101, 1015, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2305, 101, 1016, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2306, 101, 1017, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2307, 101, 1018, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2308, 101, 1019, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2309, 101, 1020, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2310, 101, 1021, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2311, 101, 1022, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2312, 101, 1023, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2929, 109, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2930, 109, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2931, 109, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2932, 109, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2933, 109, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2934, 109, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2935, 109, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2936, 109, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2937, 109, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2938, 109, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2939, 109, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2940, 109, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2941, 111, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2942, 111, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2943, 111, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2944, 111, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2945, 111, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2946, 111, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2947, 111, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2948, 111, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2949, 111, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2950, 111, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2951, 111, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2952, 111, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2993, 109, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2994, 109, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2995, 109, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2996, 109, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2997, 109, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2998, 109, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2999, 109, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3000, 109, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3001, 109, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3002, 109, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3003, 109, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3004, 109, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3005, 109, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3006, 109, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3007, 109, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3008, 109, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3009, 109, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3017, 109, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3018, 109, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3019, 109, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3020, 109, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3021, 109, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3022, 109, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3023, 109, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3024, 109, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3025, 109, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3026, 109, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3027, 109, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3028, 109, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3029, 109, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3030, 109, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3031, 109, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3032, 109, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3033, 109, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3034, 109, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3035, 109, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3036, 109, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3037, 109, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3038, 109, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3039, 109, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3040, 109, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3041, 109, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3042, 109, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3043, 109, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3044, 109, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3045, 109, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3046, 109, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3047, 109, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3048, 109, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3049, 109, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3050, 109, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3051, 109, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3052, 109, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3053, 109, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3054, 109, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3055, 109, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3056, 109, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3057, 109, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3058, 109, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3059, 109, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3060, 109, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3061, 109, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3062, 109, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3063, 109, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3064, 109, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3065, 109, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3066, 109, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3067, 109, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3068, 109, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3069, 111, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3070, 111, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3071, 111, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3072, 111, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3073, 111, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3074, 111, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3075, 111, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3076, 111, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3077, 111, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3078, 111, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3079, 111, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3080, 111, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3081, 111, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3082, 111, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3083, 111, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3084, 111, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3085, 111, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3093, 111, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3094, 111, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3095, 111, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3096, 111, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3097, 111, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3098, 111, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3099, 111, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3100, 111, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3101, 111, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3102, 111, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3103, 111, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3104, 111, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3105, 111, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3106, 111, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3107, 111, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3108, 111, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3109, 111, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3110, 111, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3111, 111, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3112, 111, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3113, 111, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3114, 111, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3115, 111, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3116, 111, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3117, 111, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3118, 111, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3119, 111, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3120, 111, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3121, 111, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3122, 111, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3123, 111, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3124, 111, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3125, 111, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3126, 111, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3127, 111, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3128, 111, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3129, 111, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3130, 111, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3131, 111, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3132, 111, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3133, 111, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3134, 111, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3135, 111, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3136, 111, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3137, 111, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3138, 111, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3139, 111, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3140, 111, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3141, 111, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3142, 111, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3143, 111, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3144, 111, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3221, 109, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3222, 109, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3223, 109, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3224, 109, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3225, 109, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3226, 111, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3227, 111, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3228, 111, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3229, 111, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3230, 111, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4163, 109, 5, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4164, 109, 1118, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4165, 109, 1119, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4166, 109, 1120, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4167, 109, 2713, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4168, 109, 2714, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4169, 109, 2715, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4170, 109, 2716, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4171, 109, 2717, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4172, 109, 2718, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4173, 109, 2720, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4174, 109, 1185, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4175, 109, 2721, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4176, 109, 1186, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4177, 109, 2722, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4178, 109, 1187, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4179, 109, 2723, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4180, 109, 1188, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4181, 109, 2724, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4182, 109, 1189, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4183, 109, 2725, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4184, 109, 1190, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4185, 109, 2726, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4186, 109, 1191, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4187, 109, 2727, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4188, 109, 1192, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4189, 109, 2728, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4190, 109, 1193, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4191, 109, 2729, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4192, 109, 1194, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4193, 109, 2730, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4194, 109, 1195, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4195, 109, 2731, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4196, 109, 1196, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4197, 109, 2732, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4198, 109, 1197, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4199, 109, 2733, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4200, 109, 1198, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4201, 109, 2734, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4202, 109, 1199, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4203, 109, 2735, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4204, 109, 1200, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4205, 109, 1201, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4206, 109, 1202, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4207, 109, 1207, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4208, 109, 1208, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4209, 109, 1209, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4210, 109, 1210, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4211, 109, 1211, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4212, 109, 1212, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4213, 109, 1213, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4214, 109, 1215, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4215, 109, 1216, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4216, 109, 1217, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4217, 109, 1218, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4218, 109, 1219, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4219, 109, 1220, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4220, 109, 1221, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4221, 109, 1222, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4222, 111, 5, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4223, 111, 1118, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4224, 111, 1119, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4225, 111, 1120, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4226, 111, 2713, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4227, 111, 2714, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4228, 111, 2715, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4229, 111, 2716, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4230, 111, 2717, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4231, 111, 2718, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4232, 111, 2720, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4233, 111, 1185, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4234, 111, 2721, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4235, 111, 1186, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4236, 111, 2722, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4237, 111, 1187, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4238, 111, 2723, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4239, 111, 1188, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4240, 111, 2724, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4241, 111, 1189, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4242, 111, 2725, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4243, 111, 1190, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4244, 111, 2726, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4245, 111, 1191, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4246, 111, 2727, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4247, 111, 1192, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4248, 111, 2728, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4249, 111, 1193, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4250, 111, 2729, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4251, 111, 1194, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4252, 111, 2730, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4253, 111, 1195, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4254, 111, 2731, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4255, 111, 1196, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4256, 111, 2732, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4257, 111, 1197, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4258, 111, 2733, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4259, 111, 1198, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4260, 111, 2734, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4261, 111, 1199, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4262, 111, 2735, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4263, 111, 1200, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4264, 111, 1201, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4265, 111, 1202, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4266, 111, 1207, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4267, 111, 1208, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4268, 111, 1209, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4269, 111, 1210, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4270, 111, 1211, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4271, 111, 1212, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4272, 111, 1213, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4273, 111, 1215, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4274, 111, 1216, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4275, 111, 1217, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4276, 111, 1218, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4277, 111, 1219, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4278, 111, 1220, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4279, 111, 1221, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5779, 2, 2739, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5780, 2, 2740, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5781, 2, 2758, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5782, 2, 2759, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5783, 2, 2362, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5784, 2, 2387, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5785, 2, 2030, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5786, 101, 2758, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5787, 101, 2759, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5788, 101, 2783, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5789, 109, 2739, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5790, 109, 2740, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5791, 111, 2739, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5792, 111, 2740, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', '0', 122); +COMMIT; +SET IDENTITY_INSERT system_role_menu OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +CREATE TABLE system_sms_channel ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + signature varchar(12) NOT NULL, + code varchar(63) NOT NULL, + status smallint NOT NULL, + remark varchar(255) DEFAULT NULL NULL, + api_key varchar(128) NOT NULL, + api_secret varchar(128) DEFAULT NULL NULL, + callback_url varchar(255) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_sms_channel.id IS '编号'; +COMMENT ON COLUMN system_sms_channel.signature IS '短信签名'; +COMMENT ON COLUMN system_sms_channel.code IS '渠道编码'; +COMMENT ON COLUMN system_sms_channel.status IS '开启状态'; +COMMENT ON COLUMN system_sms_channel.remark IS '备注'; +COMMENT ON COLUMN system_sms_channel.api_key IS '短信 API 的账号'; +COMMENT ON COLUMN system_sms_channel.api_secret IS '短信 API 的秘钥'; +COMMENT ON COLUMN system_sms_channel.callback_url IS '短信发送回调 URL'; +COMMENT ON COLUMN system_sms_channel.creator IS '创建者'; +COMMENT ON COLUMN system_sms_channel.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_channel.updater IS '更新者'; +COMMENT ON COLUMN system_sms_channel.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_channel.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_channel IS '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_sms_channel ON; +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2024-08-04 08:53:26', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', '0'); +COMMIT; +SET IDENTITY_INSERT system_sms_channel OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +CREATE TABLE system_sms_code ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + mobile varchar(11) NOT NULL, + code varchar(6) NOT NULL, + create_ip varchar(15) NOT NULL, + scene smallint NOT NULL, + today_index smallint NOT NULL, + used smallint NOT NULL, + used_time datetime DEFAULT NULL NULL, + used_ip varchar(255) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +CREATE INDEX idx_system_sms_code_01 ON system_sms_code (mobile); + +COMMENT ON COLUMN system_sms_code.id IS '编号'; +COMMENT ON COLUMN system_sms_code.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_code.code IS '验证码'; +COMMENT ON COLUMN system_sms_code.create_ip IS '创建 IP'; +COMMENT ON COLUMN system_sms_code.scene IS '发送场景'; +COMMENT ON COLUMN system_sms_code.today_index IS '今日发送的第几条'; +COMMENT ON COLUMN system_sms_code.used IS '是否使用'; +COMMENT ON COLUMN system_sms_code.used_time IS '使用时间'; +COMMENT ON COLUMN system_sms_code.used_ip IS '使用 IP'; +COMMENT ON COLUMN system_sms_code.creator IS '创建者'; +COMMENT ON COLUMN system_sms_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_code.updater IS '更新者'; +COMMENT ON COLUMN system_sms_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_sms_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_sms_code IS '手机验证码'; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +CREATE TABLE system_sms_log ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + channel_id bigint NOT NULL, + channel_code varchar(63) NOT NULL, + template_id bigint NOT NULL, + template_code varchar(63) NOT NULL, + template_type smallint NOT NULL, + template_content varchar(255) NOT NULL, + template_params varchar(255) NOT NULL, + api_template_id varchar(63) NOT NULL, + mobile varchar(11) NOT NULL, + user_id bigint DEFAULT NULL NULL, + user_type smallint DEFAULT NULL NULL, + send_status smallint DEFAULT 0 NOT NULL, + send_time datetime DEFAULT NULL NULL, + api_send_code varchar(63) DEFAULT NULL NULL, + api_send_msg varchar(255) DEFAULT NULL NULL, + api_request_id varchar(255) DEFAULT NULL NULL, + api_serial_no varchar(255) DEFAULT NULL NULL, + receive_status smallint DEFAULT 0 NOT NULL, + receive_time datetime DEFAULT NULL NULL, + api_receive_code varchar(63) DEFAULT NULL NULL, + api_receive_msg varchar(255) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_sms_log.id IS '编号'; +COMMENT ON COLUMN system_sms_log.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_log.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_sms_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_sms_log.template_type IS '短信类型'; +COMMENT ON COLUMN system_sms_log.template_content IS '短信内容'; +COMMENT ON COLUMN system_sms_log.template_params IS '短信参数'; +COMMENT ON COLUMN system_sms_log.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_log.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_sms_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_sms_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_sms_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_sms_log.api_send_code IS '短信 API 发送结果的编码'; +COMMENT ON COLUMN system_sms_log.api_send_msg IS '短信 API 发送失败的提示'; +COMMENT ON COLUMN system_sms_log.api_request_id IS '短信 API 发送返回的唯一请求 ID'; +COMMENT ON COLUMN system_sms_log.api_serial_no IS '短信 API 发送返回的序号'; +COMMENT ON COLUMN system_sms_log.receive_status IS '接收状态'; +COMMENT ON COLUMN system_sms_log.receive_time IS '接收时间'; +COMMENT ON COLUMN system_sms_log.api_receive_code IS 'API 接收结果的编码'; +COMMENT ON COLUMN system_sms_log.api_receive_msg IS 'API 接收结果的说明'; +COMMENT ON COLUMN system_sms_log.creator IS '创建者'; +COMMENT ON COLUMN system_sms_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_log.updater IS '更新者'; +COMMENT ON COLUMN system_sms_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_log.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_log IS '短信日志'; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +CREATE TABLE system_sms_template ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + type smallint NOT NULL, + status smallint NOT NULL, + code varchar(63) NOT NULL, + name varchar(63) NOT NULL, + content varchar(255) NOT NULL, + params varchar(255) NOT NULL, + remark varchar(255) DEFAULT NULL NULL, + api_template_id varchar(63) NOT NULL, + channel_id bigint NOT NULL, + channel_code varchar(63) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_sms_template.id IS '编号'; +COMMENT ON COLUMN system_sms_template.type IS '模板类型'; +COMMENT ON COLUMN system_sms_template.status IS '开启状态'; +COMMENT ON COLUMN system_sms_template.code IS '模板编码'; +COMMENT ON COLUMN system_sms_template.name IS '模板名称'; +COMMENT ON COLUMN system_sms_template.content IS '模板内容'; +COMMENT ON COLUMN system_sms_template.params IS '参数数组'; +COMMENT ON COLUMN system_sms_template.remark IS '备注'; +COMMENT ON COLUMN system_sms_template.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_template.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_template.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_template.creator IS '创建者'; +COMMENT ON COLUMN system_sms_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_template.updater IS '更新者'; +COMMENT ON COLUMN system_sms_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_template.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_template IS '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_sms_template ON; +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', '测试备注', '4383920', 4, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2024-08-18 11:57:18', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', 4, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2024-08-18 11:57:07', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2023-12-02 22:35:34', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', 4, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2024-08-18 11:57:06', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 4, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2024-08-18 11:57:04', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (17, 2, 0, 'bpm_task_timeout', '【工作流】任务审批超时', '您收到了一条超时的待办任务:{processInstanceName}-{taskName},处理链接:{detailUrl}', '["processInstanceName","taskName","detailUrl"]', '', 'X', 4, 'DEBUG_DING_TALK', '1', '2024-08-16 21:59:15', '1', '2024-08-16 21:59:34', '0'); +COMMIT; +SET IDENTITY_INSERT system_sms_template OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +CREATE TABLE system_social_client ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(255) NOT NULL, + social_type smallint NOT NULL, + user_type smallint NOT NULL, + client_id varchar(255) NOT NULL, + client_secret varchar(255) NOT NULL, + agent_id varchar(255) DEFAULT NULL NULL, + status smallint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_social_client.id IS '编号'; +COMMENT ON COLUMN system_social_client.name IS '应用名'; +COMMENT ON COLUMN system_social_client.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_client.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_social_client.client_secret IS '客户端密钥'; +COMMENT ON COLUMN system_social_client.agent_id IS '代理编号'; +COMMENT ON COLUMN system_social_client.status IS '状态'; +COMMENT ON COLUMN system_social_client.creator IS '创建者'; +COMMENT ON COLUMN system_social_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_client.updater IS '更新者'; +COMMENT ON COLUMN system_social_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_client.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_client.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_client IS '社交客户端表'; + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_social_client ON; +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '钉钉', 20, 2, 'dingvrnreaje3yqvzhxg', 'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, '', '2023-10-18 11:21:18', '1', '2023-12-20 21:28:26', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '钉钉(王土豆)', 20, 2, 'dingtsu9hpepjkbmthhw', 'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, '', '2023-10-18 11:21:18', '', '2023-12-20 21:28:26', '1', 121); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '微信公众号', 31, 1, 'wx5b23ba7a5589ecbb', '2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, '', '2023-10-18 16:07:46', '1', '2023-12-20 21:28:23', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (43, '微信小程序', 34, 1, 'wx63c280fe3248a3e7', '6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, '', '2023-10-19 13:37:41', '1', '2023-12-20 21:28:25', '1', 1); +COMMIT; +SET IDENTITY_INSERT system_social_client OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +CREATE TABLE system_social_user ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + type smallint NOT NULL, + openid varchar(32) NOT NULL, + token varchar(256) DEFAULT NULL NULL, + raw_token_info varchar(1024) NOT NULL, + nickname varchar(32) NOT NULL, + avatar varchar(255) DEFAULT NULL NULL, + raw_user_info varchar(1024) NOT NULL, + code varchar(256) NOT NULL, + state varchar(256) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_social_user.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user.type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user.openid IS '社交 openid'; +COMMENT ON COLUMN system_social_user.token IS '社交 token'; +COMMENT ON COLUMN system_social_user.raw_token_info IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.nickname IS '用户昵称'; +COMMENT ON COLUMN system_social_user.avatar IS '用户头像'; +COMMENT ON COLUMN system_social_user.raw_user_info IS '原始用户数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.code IS '最后一次的认证 code'; +COMMENT ON COLUMN system_social_user.state IS '最后一次的认证 state'; +COMMENT ON COLUMN system_social_user.creator IS '创建者'; +COMMENT ON COLUMN system_social_user.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user.updater IS '更新者'; +COMMENT ON COLUMN system_social_user.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user IS '社交用户表'; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +CREATE TABLE system_social_user_bind ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type smallint NOT NULL, + social_type smallint NOT NULL, + social_user_id bigint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_social_user_bind.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user_bind.user_id IS '用户编号'; +COMMENT ON COLUMN system_social_user_bind.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_user_bind.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user_bind.social_user_id IS '社交用户的编号'; +COMMENT ON COLUMN system_social_user_bind.creator IS '创建者'; +COMMENT ON COLUMN system_social_user_bind.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user_bind.updater IS '更新者'; +COMMENT ON COLUMN system_social_user_bind.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user_bind.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user_bind.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user_bind IS '社交绑定表'; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +CREATE TABLE system_tenant ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(30) NOT NULL, + contact_user_id bigint DEFAULT NULL NULL, + contact_name varchar(30) NOT NULL, + contact_mobile varchar(500) DEFAULT NULL NULL, + status smallint DEFAULT 0 NOT NULL, + website varchar(256) DEFAULT '' NULL, + package_id bigint NOT NULL, + expire_time datetime NOT NULL, + account_count int NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_tenant.id IS '租户编号'; +COMMENT ON COLUMN system_tenant.name IS '租户名'; +COMMENT ON COLUMN system_tenant.contact_user_id IS '联系人的用户编号'; +COMMENT ON COLUMN system_tenant.contact_name IS '联系人'; +COMMENT ON COLUMN system_tenant.contact_mobile IS '联系手机'; +COMMENT ON COLUMN system_tenant.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant.website IS '绑定域名'; +COMMENT ON COLUMN system_tenant.package_id IS '租户套餐编号'; +COMMENT ON COLUMN system_tenant.expire_time IS '过期时间'; +COMMENT ON COLUMN system_tenant.account_count IS '账号数量'; +COMMENT ON COLUMN system_tenant.creator IS '创建者'; +COMMENT ON COLUMN system_tenant.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant.updater IS '更新者'; +COMMENT ON COLUMN system_tenant.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant IS '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_tenant ON; +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2025-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2024-07-20 22:21:53', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-29 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2024-07-20 15:51:18', '0'); +COMMIT; +SET IDENTITY_INSERT system_tenant OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +CREATE TABLE system_tenant_package ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(30) NOT NULL, + status smallint DEFAULT 0 NOT NULL, + remark varchar(256) DEFAULT '' NULL, + menu_ids varchar(4096) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_tenant_package.id IS '套餐编号'; +COMMENT ON COLUMN system_tenant_package.name IS '套餐名'; +COMMENT ON COLUMN system_tenant_package.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant_package.remark IS '备注'; +COMMENT ON COLUMN system_tenant_package.menu_ids IS '关联的菜单编号'; +COMMENT ON COLUMN system_tenant_package.creator IS '创建者'; +COMMENT ON COLUMN system_tenant_package.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant_package.updater IS '更新者'; +COMMENT ON COLUMN system_tenant_package.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant_package.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant_package IS '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_tenant_package ON; +INSERT INTO system_tenant_package (id, name, status, remark, menu_ids, creator, create_time, updater, update_time, deleted) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2739,2484,2740,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-07-13 22:37:24', '0'); +COMMIT; +SET IDENTITY_INSERT system_tenant_package OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +CREATE TABLE system_user_post ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint DEFAULT 0 NOT NULL, + post_id bigint DEFAULT 0 NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_user_post.id IS 'id'; +COMMENT ON COLUMN system_user_post.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_post.post_id IS '岗位ID'; +COMMENT ON COLUMN system_user_post.creator IS '创建者'; +COMMENT ON COLUMN system_user_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_post.updater IS '更新者'; +COMMENT ON COLUMN system_user_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_post IS '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_user_post ON; +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 104, 1, '1', '2022-05-16 19:36:28', '1', '2022-05-16 19:36:28', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (116, 117, 2, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 118, 1, '1', '2022-07-09 17:44:44', '1', '2022-07-09 17:44:44', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (125, 1, 2, '1', '2024-07-13 22:31:39', '1', '2024-07-13 22:31:39', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_user_post OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +CREATE TABLE system_user_role ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + role_id bigint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NULL, + deleted bit DEFAULT '0' NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_user_role.id IS '自增编号'; +COMMENT ON COLUMN system_user_role.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN system_user_role.creator IS '创建者'; +COMMENT ON COLUMN system_user_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_role.updater IS '更新者'; +COMMENT ON COLUMN system_user_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_role IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_user_role ON; +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (20, 104, 101, '1', '2022-05-28 15:43:57', '1', '2022-05-28 15:43:57', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (22, 115, 2, '1', '2022-07-21 22:08:30', '1', '2022-07-21 22:08:30', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (35, 112, 1, '1', '2024-03-15 20:00:24', '1', '2024-03-15 20:00:24', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (36, 118, 1, '1', '2024-03-17 09:12:08', '1', '2024-03-17 09:12:08', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (38, 114, 101, '1', '2024-03-24 22:23:03', '1', '2024-03-24 22:23:03', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_user_role OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +CREATE TABLE system_users ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + username varchar(30) NOT NULL, + password varchar(100) DEFAULT '' NULL, + nickname varchar(30) NOT NULL, + remark varchar(500) DEFAULT NULL NULL, + dept_id bigint DEFAULT NULL NULL, + post_ids varchar(255) DEFAULT NULL NULL, + email varchar(50) DEFAULT '' NULL, + mobile varchar(11) DEFAULT '' NULL, + sex smallint DEFAULT 0 NULL, + avatar varchar(512) DEFAULT '' NULL, + status smallint DEFAULT 0 NOT NULL, + login_ip varchar(50) DEFAULT '' NULL, + login_date datetime DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN system_users.id IS '用户ID'; +COMMENT ON COLUMN system_users.username IS '用户账号'; +COMMENT ON COLUMN system_users.password IS '密码'; +COMMENT ON COLUMN system_users.nickname IS '用户昵称'; +COMMENT ON COLUMN system_users.remark IS '备注'; +COMMENT ON COLUMN system_users.dept_id IS '部门ID'; +COMMENT ON COLUMN system_users.post_ids IS '岗位编号数组'; +COMMENT ON COLUMN system_users.email IS '用户邮箱'; +COMMENT ON COLUMN system_users.mobile IS '手机号码'; +COMMENT ON COLUMN system_users.sex IS '用户性别'; +COMMENT ON COLUMN system_users.avatar IS '头像地址'; +COMMENT ON COLUMN system_users.status IS '帐号状态(0正常 1停用)'; +COMMENT ON COLUMN system_users.login_ip IS '最后登录IP'; +COMMENT ON COLUMN system_users.login_date IS '最后登录时间'; +COMMENT ON COLUMN system_users.creator IS '创建者'; +COMMENT ON COLUMN system_users.create_time IS '创建时间'; +COMMENT ON COLUMN system_users.updater IS '更新者'; +COMMENT ON COLUMN system_users.update_time IS '更新时间'; +COMMENT ON COLUMN system_users.deleted IS '是否删除'; +COMMENT ON COLUMN system_users.tenant_id IS '租户编号'; +COMMENT ON TABLE system_users IS '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT system_users ON; +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1,2]', 'aoteman@126.com', '18818260277', 2, 'http://test.win.iocoder.cn/bf2002b38950c904243be7c825d3f82e29f25a44526583c3fde2ebdff3a87f75.png', 0, '0:0:0:0:0:0:0:1', '2024-08-26 16:54:00', 'admin', '2021-01-05 17:03:47', NULL, '2024-08-26 16:54:00', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 0, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', '1', '2024-08-17 11:06:13', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, 'yuanma', '$2a$04$fUBSmjKCPYAUmnMzOb6qE.eZCGPhHi1JmAKclODbfS/O7fHOl2bH6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-08-11 17:48:12', '', '2021-01-13 23:50:35', NULL, '2024-08-11 17:48:12', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, 'test', '$2a$04$jDFLttgfik0QqJKAbfhMa.2A9xXoZmAIxakdFJUzkX.MgBKT6ddo6', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-08-11 09:38:08', '', '2021-01-21 02:13:53', NULL, '2024-08-11 09:38:08', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', '0', 118); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', '0', 119); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', '0', 120); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-07-20 22:23:17', '1', '2022-02-22 00:56:14', NULL, '2024-07-20 22:23:17', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', '0', 122); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号02', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2024-08-11 10:12:03', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-04-04 09:48:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', '0', 1); +COMMIT; +SET IDENTITY_INSERT system_users OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +CREATE TABLE win_demo01_contact ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(100) DEFAULT '' NULL, + sex smallint NOT NULL, + birthday datetime NOT NULL, + description varchar(255) NOT NULL, + avatar varchar(512) DEFAULT NULL NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN win_demo01_contact.id IS '编号'; +COMMENT ON COLUMN win_demo01_contact.name IS '名字'; +COMMENT ON COLUMN win_demo01_contact.sex IS '性别'; +COMMENT ON COLUMN win_demo01_contact.birthday IS '出生年'; +COMMENT ON COLUMN win_demo01_contact.description IS '简介'; +COMMENT ON COLUMN win_demo01_contact.avatar IS '头像'; +COMMENT ON COLUMN win_demo01_contact.creator IS '创建者'; +COMMENT ON COLUMN win_demo01_contact.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo01_contact.updater IS '更新者'; +COMMENT ON COLUMN win_demo01_contact.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo01_contact.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo01_contact.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo01_contact IS '示例联系人表'; + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT win_demo01_contact ON; +INSERT INTO win_demo01_contact (id, name, sex, birthday, description, avatar, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 2, '2023-11-07 00:00:00', '

天蚕土豆!呀

', 'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', '1', '2023-11-15 23:34:30', '1', '2023-11-15 23:47:39', '0', 1); +COMMIT; +SET IDENTITY_INSERT win_demo01_contact OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +CREATE TABLE win_demo02_category ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(100) DEFAULT '' NULL, + parent_id bigint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN win_demo02_category.id IS '编号'; +COMMENT ON COLUMN win_demo02_category.name IS '名字'; +COMMENT ON COLUMN win_demo02_category.parent_id IS '父级编号'; +COMMENT ON COLUMN win_demo02_category.creator IS '创建者'; +COMMENT ON COLUMN win_demo02_category.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo02_category.updater IS '更新者'; +COMMENT ON COLUMN win_demo02_category.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo02_category.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo02_category.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo02_category IS '示例分类表'; + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT win_demo02_category ON; +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 0, '1', '2023-11-15 23:34:30', '1', '2023-11-16 20:24:23', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '番茄', 0, '1', '2023-11-16 20:24:00', '1', '2023-11-16 20:24:15', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '怪怪', 0, '1', '2023-11-16 20:24:32', '1', '2023-11-16 20:24:32', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '小番茄', 2, '1', '2023-11-16 20:24:39', '1', '2023-11-16 20:24:39', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大番茄', 2, '1', '2023-11-16 20:24:46', '1', '2023-11-16 20:24:46', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, '11', 3, '1', '2023-11-24 19:29:34', '1', '2023-11-24 19:29:34', '0', 1); +COMMIT; +SET IDENTITY_INSERT win_demo02_category OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +CREATE TABLE win_demo03_course ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + student_id bigint NOT NULL, + name varchar(100) DEFAULT '' NULL, + score smallint NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN win_demo03_course.id IS '编号'; +COMMENT ON COLUMN win_demo03_course.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_course.name IS '名字'; +COMMENT ON COLUMN win_demo03_course.score IS '分数'; +COMMENT ON COLUMN win_demo03_course.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_course.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_course.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_course.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_course.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_course.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_course IS '学生课程表'; + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT win_demo03_course ON; +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, '语文', 66, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 2, '数学', 22, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (11, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (12, 2, '电脑', 33, '1', '2023-11-17 00:20:42', '1', '2023-11-16 16:20:45', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (13, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2023-11-17 13:13:20', '0', 1); +COMMIT; +SET IDENTITY_INSERT win_demo03_course OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +CREATE TABLE win_demo03_grade ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + student_id bigint NOT NULL, + name varchar(100) DEFAULT '' NULL, + teacher varchar(255) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN win_demo03_grade.id IS '编号'; +COMMENT ON COLUMN win_demo03_grade.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_grade.name IS '名字'; +COMMENT ON COLUMN win_demo03_grade.teacher IS '班主任'; +COMMENT ON COLUMN win_demo03_grade.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_grade.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_grade.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_grade.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_grade.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_grade.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_grade IS '学生班级表'; + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT win_demo03_grade ON; +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 2, '三年 2 班', '周杰伦', '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '华为', '遥遥领先', '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 9, '小图', '小娃111', '1', '2023-11-17 13:10:23', '1', '2023-11-17 13:10:23', '0', 1); +COMMIT; +SET IDENTITY_INSERT win_demo03_grade OFF; +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +CREATE TABLE win_demo03_student ( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(100) DEFAULT '' NULL, + sex smallint NOT NULL, + birthday datetime NOT NULL, + description varchar(255) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +); + +COMMENT ON COLUMN win_demo03_student.id IS '编号'; +COMMENT ON COLUMN win_demo03_student.name IS '名字'; +COMMENT ON COLUMN win_demo03_student.sex IS '性别'; +COMMENT ON COLUMN win_demo03_student.birthday IS '出生日期'; +COMMENT ON COLUMN win_demo03_student.description IS '简介'; +COMMENT ON COLUMN win_demo03_student.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_student.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_student.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_student.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_student.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_student.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_student IS '学生表'; + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT win_demo03_student ON; +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '小白', 1, '2023-11-16 00:00:00', '

厉害

', '1', '2023-11-16 23:21:49', '1', '2023-11-17 16:49:06', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大黑', 2, '2023-11-13 00:00:00', '

你在教我做事?

', '1', '2023-11-16 23:22:46', '1', '2023-11-17 16:49:07', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, '小花', 1, '2023-11-07 00:00:00', '

哈哈哈

', '1', '2023-11-17 00:04:47', '1', '2023-11-17 16:49:08', '0', 1); +COMMIT; +SET IDENTITY_INSERT win_demo03_student OFF; +-- @formatter:on + diff --git a/sql/kingbase/quartz.sql b/sql/kingbase/quartz.sql new file mode 100644 index 0000000..ff1e215 --- /dev/null +++ b/sql/kingbase/quartz.sql @@ -0,0 +1,170 @@ +set client_min_messages = WARNING; +DROP TABLE IF EXISTS qrtz_fired_triggers; +DROP TABLE IF EXISTS qrtz_paused_trigger_grps; +DROP TABLE IF EXISTS qrtz_scheduler_state; +DROP TABLE IF EXISTS qrtz_locks; +DROP TABLE IF EXISTS qrtz_simprop_triggers; +DROP TABLE IF EXISTS qrtz_simple_triggers; +DROP TABLE IF EXISTS qrtz_cron_triggers; +DROP TABLE IF EXISTS qrtz_blob_triggers; +DROP TABLE IF EXISTS qrtz_triggers; +DROP TABLE IF EXISTS qrtz_job_details; +DROP TABLE IF EXISTS qrtz_calendars; +set client_min_messages = NOTICE; + +CREATE TABLE qrtz_job_details + ( + sched_name TEXT NOT NULL, + job_name TEXT NOT NULL, + job_group TEXT NOT NULL, + description TEXT NULL, + job_class_name TEXT NOT NULL, + is_durable BOOL NOT NULL, + is_nonconcurrent BOOL NOT NULL, + is_update_data BOOL NOT NULL, + requests_recovery BOOL NOT NULL, + job_data BYTEA NULL, + PRIMARY KEY (sched_name,job_name,job_group) +); + +CREATE TABLE qrtz_triggers + ( + sched_name TEXT NOT NULL, + trigger_name TEXT NOT NULL, + trigger_group TEXT NOT NULL, + job_name TEXT NOT NULL, + job_group TEXT NOT NULL, + description TEXT NULL, + next_fire_time BIGINT NULL, + prev_fire_time BIGINT NULL, + priority INTEGER NULL, + trigger_state TEXT NOT NULL, + trigger_type TEXT NOT NULL, + start_time BIGINT NOT NULL, + end_time BIGINT NULL, + calendar_name TEXT NULL, + misfire_instr SMALLINT NULL, + job_data BYTEA NULL, + PRIMARY KEY (sched_name,trigger_name,trigger_group), + FOREIGN KEY (sched_name,job_name,job_group) + REFERENCES qrtz_job_details(sched_name,job_name,job_group) +); + +CREATE TABLE qrtz_simple_triggers + ( + sched_name TEXT NOT NULL, + trigger_name TEXT NOT NULL, + trigger_group TEXT NOT NULL, + repeat_count BIGINT NOT NULL, + repeat_interval BIGINT NOT NULL, + times_triggered BIGINT NOT NULL, + PRIMARY KEY (sched_name,trigger_name,trigger_group), + FOREIGN KEY (sched_name,trigger_name,trigger_group) + REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE +); + +CREATE TABLE QRTZ_SIMPROP_TRIGGERS + ( + sched_name TEXT NOT NULL, + trigger_name TEXT NOT NULL , + trigger_group TEXT NOT NULL , + str_prop_1 TEXT NULL, + str_prop_2 TEXT NULL, + str_prop_3 TEXT NULL, + int_prop_1 INTEGER NULL, + int_prop_2 INTEGER NULL, + long_prop_1 BIGINT NULL, + long_prop_2 BIGINT NULL, + dec_prop_1 NUMERIC NULL, + dec_prop_2 NUMERIC NULL, + bool_prop_1 BOOL NULL, + bool_prop_2 BOOL NULL, + time_zone_id TEXT NULL, + PRIMARY KEY (sched_name,trigger_name,trigger_group), + FOREIGN KEY (sched_name,trigger_name,trigger_group) + REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE +); + +CREATE TABLE qrtz_cron_triggers + ( + sched_name TEXT NOT NULL, + trigger_name TEXT NOT NULL, + trigger_group TEXT NOT NULL, + cron_expression TEXT NOT NULL, + time_zone_id TEXT, + PRIMARY KEY (sched_name,trigger_name,trigger_group), + FOREIGN KEY (sched_name,trigger_name,trigger_group) + REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE +); + +CREATE TABLE qrtz_blob_triggers + ( + sched_name TEXT NOT NULL, + trigger_name TEXT NOT NULL, + trigger_group TEXT NOT NULL, + blob_data BYTEA NULL, + PRIMARY KEY (sched_name,trigger_name,trigger_group), + FOREIGN KEY (sched_name,trigger_name,trigger_group) + REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE +); + +CREATE TABLE qrtz_calendars + ( + sched_name TEXT NOT NULL, + calendar_name TEXT NOT NULL, + calendar BYTEA NOT NULL, + PRIMARY KEY (sched_name,calendar_name) +); + +CREATE TABLE qrtz_paused_trigger_grps + ( + sched_name TEXT NOT NULL, + trigger_group TEXT NOT NULL, + PRIMARY KEY (sched_name,trigger_group) +); + +CREATE TABLE qrtz_fired_triggers + ( + sched_name TEXT NOT NULL, + entry_id TEXT NOT NULL, + trigger_name TEXT NOT NULL, + trigger_group TEXT NOT NULL, + instance_name TEXT NOT NULL, + fired_time BIGINT NOT NULL, + sched_time BIGINT NOT NULL, + priority INTEGER NOT NULL, + state TEXT NOT NULL, + job_name TEXT NULL, + job_group TEXT NULL, + is_nonconcurrent BOOL NOT NULL, + requests_recovery BOOL NULL, + PRIMARY KEY (sched_name,entry_id) +); + +CREATE TABLE qrtz_scheduler_state + ( + sched_name TEXT NOT NULL, + instance_name TEXT NOT NULL, + last_checkin_time BIGINT NOT NULL, + checkin_interval BIGINT NOT NULL, + PRIMARY KEY (sched_name,instance_name) +); + +CREATE TABLE qrtz_locks + ( + sched_name TEXT NOT NULL, + lock_name TEXT NOT NULL, + PRIMARY KEY (sched_name,lock_name) +); + +create index idx_qrtz_j_req_recovery on qrtz_job_details(requests_recovery); +create index idx_qrtz_t_next_fire_time on qrtz_triggers(next_fire_time); +create index idx_qrtz_t_state on qrtz_triggers(trigger_state); +create index idx_qrtz_t_nft_st on qrtz_triggers(next_fire_time,trigger_state); +create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(trigger_name); +create index idx_qrtz_ft_trig_group on qrtz_fired_triggers(trigger_group); +create index idx_qrtz_ft_trig_nm_gp on qrtz_fired_triggers(sched_name,trigger_name,trigger_group); +create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(instance_name); +create index idx_qrtz_ft_job_name on qrtz_fired_triggers(job_name); +create index idx_qrtz_ft_job_group on qrtz_fired_triggers(job_group); +create index idx_qrtz_ft_job_req_recovery on qrtz_fired_triggers(requests_recovery); diff --git a/sql/kingbase/ruoyi-vue-pro.sql b/sql/kingbase/ruoyi-vue-pro.sql new file mode 100644 index 0000000..4a38790 --- /dev/null +++ b/sql/kingbase/ruoyi-vue-pro.sql @@ -0,0 +1,4723 @@ +/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : Kingbase + + Date: 2024-05-31 22:42:53 +*/ + + +-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +DROP TABLE IF EXISTS dual; +CREATE TABLE dual +( + id int2 +); + +COMMENT ON TABLE dual IS '数据库连接的表'; + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +-- @formatter:off +INSERT INTO dual VALUES (1); +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_access_log; +CREATE TABLE infra_api_access_log +( + id int8 NOT NULL, + trace_id varchar(64) NULL DEFAULT '', + user_id int8 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + application_name varchar(50) NOT NULL, + request_method varchar(16) NULL DEFAULT '', + request_url varchar(255) NULL DEFAULT '', + request_params text NULL, + response_body text NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + operate_module varchar(50) NULL DEFAULT NULL, + operate_name varchar(50) NULL DEFAULT NULL, + operate_type int2 NULL DEFAULT 0, + begin_time timestamp NOT NULL, + end_time timestamp NOT NULL, + duration int4 NOT NULL, + result_code int4 NOT NULL DEFAULT 0, + result_msg varchar(512) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_api_access_log + ADD CONSTRAINT pk_infra_api_access_log PRIMARY KEY (id); + +CREATE INDEX idx_infra_api_access_log_01 ON infra_api_access_log (create_time); + +COMMENT ON COLUMN infra_api_access_log.id IS '日志主键'; +COMMENT ON COLUMN infra_api_access_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN infra_api_access_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_access_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_access_log.application_name IS '应用名'; +COMMENT ON COLUMN infra_api_access_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_access_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_access_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_access_log.response_body IS '响应结果'; +COMMENT ON COLUMN infra_api_access_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_access_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_access_log.operate_module IS '操作模块'; +COMMENT ON COLUMN infra_api_access_log.operate_name IS '操作名'; +COMMENT ON COLUMN infra_api_access_log.operate_type IS '操作分类'; +COMMENT ON COLUMN infra_api_access_log.begin_time IS '开始请求时间'; +COMMENT ON COLUMN infra_api_access_log.end_time IS '结束请求时间'; +COMMENT ON COLUMN infra_api_access_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_api_access_log.result_code IS '结果码'; +COMMENT ON COLUMN infra_api_access_log.result_msg IS '结果提示'; +COMMENT ON COLUMN infra_api_access_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_access_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_access_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_access_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_access_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_access_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_access_log IS 'API 访问日志表'; + +DROP SEQUENCE IF EXISTS infra_api_access_log_seq; +CREATE SEQUENCE infra_api_access_log_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_error_log; +CREATE TABLE infra_api_error_log +( + id int4 NOT NULL, + trace_id varchar(64) NOT NULL, + user_id int4 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + application_name varchar(50) NOT NULL, + request_method varchar(16) NOT NULL, + request_url varchar(255) NOT NULL, + request_params varchar(8000) NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + exception_time timestamp NOT NULL, + exception_name varchar(128) NULL DEFAULT '', + exception_message text NOT NULL, + exception_root_cause_message text NOT NULL, + exception_stack_trace text NOT NULL, + exception_class_name varchar(512) NOT NULL, + exception_file_name varchar(512) NOT NULL, + exception_method_name varchar(512) NOT NULL, + exception_line_number int4 NOT NULL, + process_status int2 NOT NULL, + process_time timestamp NULL DEFAULT NULL, + process_user_id int4 NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_api_error_log + ADD CONSTRAINT pk_infra_api_error_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_api_error_log.id IS '编号'; +COMMENT ON COLUMN infra_api_error_log.trace_id IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; +COMMENT ON COLUMN infra_api_error_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_error_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_error_log.application_name IS '应用名 + * + * 目前读取 spring.application.name'; +COMMENT ON COLUMN infra_api_error_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_error_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_error_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_error_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_error_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_error_log.exception_time IS '异常发生时间'; +COMMENT ON COLUMN infra_api_error_log.exception_name IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; +COMMENT ON COLUMN infra_api_error_log.exception_message IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_root_cause_message IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_stack_trace IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; +COMMENT ON COLUMN infra_api_error_log.exception_class_name IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_file_name IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_method_name IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_line_number IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; +COMMENT ON COLUMN infra_api_error_log.process_status IS '处理状态'; +COMMENT ON COLUMN infra_api_error_log.process_time IS '处理时间'; +COMMENT ON COLUMN infra_api_error_log.process_user_id IS '处理用户编号'; +COMMENT ON COLUMN infra_api_error_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_error_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_error_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_error_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_error_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_error_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_error_log IS '系统异常日志'; + +DROP SEQUENCE IF EXISTS infra_api_error_log_seq; +CREATE SEQUENCE infra_api_error_log_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_column; +CREATE TABLE infra_codegen_column +( + id int8 NOT NULL, + table_id int8 NOT NULL, + column_name varchar(200) NOT NULL, + data_type varchar(100) NOT NULL, + column_comment varchar(500) NOT NULL, + nullable bool NOT NULL, + primary_key bool NOT NULL, + ordinal_position int4 NOT NULL, + java_type varchar(32) NOT NULL, + java_field varchar(64) NOT NULL, + dict_type varchar(200) NULL DEFAULT '', + example varchar(64) NULL DEFAULT NULL, + create_operation bool NOT NULL, + update_operation bool NOT NULL, + list_operation bool NOT NULL, + list_operation_condition varchar(32) NOT NULL DEFAULT '=', + list_operation_result bool NOT NULL, + html_type varchar(32) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_codegen_column + ADD CONSTRAINT pk_infra_codegen_column PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_column.id IS '编号'; +COMMENT ON COLUMN infra_codegen_column.table_id IS '表编号'; +COMMENT ON COLUMN infra_codegen_column.column_name IS '字段名'; +COMMENT ON COLUMN infra_codegen_column.data_type IS '字段类型'; +COMMENT ON COLUMN infra_codegen_column.column_comment IS '字段描述'; +COMMENT ON COLUMN infra_codegen_column.nullable IS '是否允许为空'; +COMMENT ON COLUMN infra_codegen_column.primary_key IS '是否主键'; +COMMENT ON COLUMN infra_codegen_column.ordinal_position IS '排序'; +COMMENT ON COLUMN infra_codegen_column.java_type IS 'Java 属性类型'; +COMMENT ON COLUMN infra_codegen_column.java_field IS 'Java 属性名'; +COMMENT ON COLUMN infra_codegen_column.dict_type IS '字典类型'; +COMMENT ON COLUMN infra_codegen_column.example IS '数据示例'; +COMMENT ON COLUMN infra_codegen_column.create_operation IS '是否为 Create 创建操作的字段'; +COMMENT ON COLUMN infra_codegen_column.update_operation IS '是否为 Update 更新操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation IS '是否为 List 查询操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation_condition IS 'List 查询操作的条件类型'; +COMMENT ON COLUMN infra_codegen_column.list_operation_result IS '是否为 List 查询操作的返回字段'; +COMMENT ON COLUMN infra_codegen_column.html_type IS '显示类型'; +COMMENT ON COLUMN infra_codegen_column.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_column.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_column.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_column.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_column.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_column IS '代码生成表字段定义'; + +DROP SEQUENCE IF EXISTS infra_codegen_column_seq; +CREATE SEQUENCE infra_codegen_column_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_table; +CREATE TABLE infra_codegen_table +( + id int8 NOT NULL, + data_source_config_id int8 NOT NULL, + scene int2 NOT NULL DEFAULT 1, + table_name varchar(200) NULL DEFAULT '', + table_comment varchar(500) NULL DEFAULT '', + remark varchar(500) NULL DEFAULT NULL, + module_name varchar(30) NOT NULL, + business_name varchar(30) NOT NULL, + class_name varchar(100) NULL DEFAULT '', + class_comment varchar(50) NOT NULL, + author varchar(50) NOT NULL, + template_type int2 NOT NULL DEFAULT 1, + front_type int2 NOT NULL, + parent_menu_id int8 NULL DEFAULT NULL, + master_table_id int8 NULL DEFAULT NULL, + sub_join_column_id int8 NULL DEFAULT NULL, + sub_join_many bool NULL DEFAULT NULL, + tree_parent_column_id int8 NULL DEFAULT NULL, + tree_name_column_id int8 NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_codegen_table + ADD CONSTRAINT pk_infra_codegen_table PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_table.id IS '编号'; +COMMENT ON COLUMN infra_codegen_table.data_source_config_id IS '数据源配置的编号'; +COMMENT ON COLUMN infra_codegen_table.scene IS '生成场景'; +COMMENT ON COLUMN infra_codegen_table.table_name IS '表名称'; +COMMENT ON COLUMN infra_codegen_table.table_comment IS '表描述'; +COMMENT ON COLUMN infra_codegen_table.remark IS '备注'; +COMMENT ON COLUMN infra_codegen_table.module_name IS '模块名'; +COMMENT ON COLUMN infra_codegen_table.business_name IS '业务名'; +COMMENT ON COLUMN infra_codegen_table.class_name IS '类名称'; +COMMENT ON COLUMN infra_codegen_table.class_comment IS '类描述'; +COMMENT ON COLUMN infra_codegen_table.author IS '作者'; +COMMENT ON COLUMN infra_codegen_table.template_type IS '模板类型'; +COMMENT ON COLUMN infra_codegen_table.front_type IS '前端类型'; +COMMENT ON COLUMN infra_codegen_table.parent_menu_id IS '父菜单编号'; +COMMENT ON COLUMN infra_codegen_table.master_table_id IS '主表的编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_column_id IS '子表关联主表的字段编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_many IS '主表与子表是否一对多'; +COMMENT ON COLUMN infra_codegen_table.tree_parent_column_id IS '树表的父字段编号'; +COMMENT ON COLUMN infra_codegen_table.tree_name_column_id IS '树表的名字字段编号'; +COMMENT ON COLUMN infra_codegen_table.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_table.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_table.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_table.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_table.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_table IS '代码生成表定义'; + +DROP SEQUENCE IF EXISTS infra_codegen_table_seq; +CREATE SEQUENCE infra_codegen_table_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_config; +CREATE TABLE infra_config +( + id int4 NOT NULL, + category varchar(50) NOT NULL, + type int2 NOT NULL, + name varchar(100) NULL DEFAULT '', + config_key varchar(100) NULL DEFAULT '', + value varchar(500) NULL DEFAULT '', + visible bool NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_config + ADD CONSTRAINT pk_infra_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_config.id IS '参数主键'; +COMMENT ON COLUMN infra_config.category IS '参数分组'; +COMMENT ON COLUMN infra_config.type IS '参数类型'; +COMMENT ON COLUMN infra_config.name IS '参数名称'; +COMMENT ON COLUMN infra_config.config_key IS '参数键名'; +COMMENT ON COLUMN infra_config.value IS '参数键值'; +COMMENT ON COLUMN infra_config.visible IS '是否可见'; +COMMENT ON COLUMN infra_config.remark IS '备注'; +COMMENT ON COLUMN infra_config.creator IS '创建者'; +COMMENT ON COLUMN infra_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_config.updater IS '更新者'; +COMMENT ON COLUMN infra_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_config IS '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', '0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-04-03 17:22:28', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', '1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 'test2', 2, 'test3', 'test4', 'test5', '1', 'test6', '1', '2023-12-03 09:55:16', '1', '2023-12-03 09:55:27', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_config_seq; +CREATE SEQUENCE infra_config_seq + START 13; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_data_source_config; +CREATE TABLE infra_data_source_config +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + url varchar(1024) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_data_source_config + ADD CONSTRAINT pk_infra_data_source_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_data_source_config.id IS '主键编号'; +COMMENT ON COLUMN infra_data_source_config.name IS '参数名称'; +COMMENT ON COLUMN infra_data_source_config.url IS '数据源连接'; +COMMENT ON COLUMN infra_data_source_config.username IS '用户名'; +COMMENT ON COLUMN infra_data_source_config.password IS '密码'; +COMMENT ON COLUMN infra_data_source_config.creator IS '创建者'; +COMMENT ON COLUMN infra_data_source_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_data_source_config.updater IS '更新者'; +COMMENT ON COLUMN infra_data_source_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_data_source_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_data_source_config IS '数据源配置表'; + +DROP SEQUENCE IF EXISTS infra_data_source_config_seq; +CREATE SEQUENCE infra_data_source_config_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS infra_file; +CREATE TABLE infra_file +( + id int8 NOT NULL, + config_id int8 NULL DEFAULT NULL, + name varchar(256) NULL DEFAULT NULL, + path varchar(512) NOT NULL, + url varchar(1024) NOT NULL, + type varchar(128) NULL DEFAULT NULL, + size int4 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file + ADD CONSTRAINT pk_infra_file PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file.id IS '文件编号'; +COMMENT ON COLUMN infra_file.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file.name IS '文件名'; +COMMENT ON COLUMN infra_file.path IS '文件路径'; +COMMENT ON COLUMN infra_file.url IS '文件 URL'; +COMMENT ON COLUMN infra_file.type IS '文件类型'; +COMMENT ON COLUMN infra_file.size IS '文件大小'; +COMMENT ON COLUMN infra_file.creator IS '创建者'; +COMMENT ON COLUMN infra_file.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file.updater IS '更新者'; +COMMENT ON COLUMN infra_file.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file.deleted IS '是否删除'; +COMMENT ON TABLE infra_file IS '文件表'; + +DROP SEQUENCE IF EXISTS infra_file_seq; +CREATE SEQUENCE infra_file_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_config; +CREATE TABLE infra_file_config +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + storage int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + master bool NOT NULL, + config varchar(4096) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file_config + ADD CONSTRAINT pk_infra_file_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_config.id IS '编号'; +COMMENT ON COLUMN infra_file_config.name IS '配置名'; +COMMENT ON COLUMN infra_file_config.storage IS '存储器'; +COMMENT ON COLUMN infra_file_config.remark IS '备注'; +COMMENT ON COLUMN infra_file_config.master IS '是否为主配置'; +COMMENT ON COLUMN infra_file_config.config IS '存储配置'; +COMMENT ON COLUMN infra_file_config.creator IS '创建者'; +COMMENT ON COLUMN infra_file_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_config.updater IS '更新者'; +COMMENT ON COLUMN infra_file_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_config IS '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (4, '数据库', 1, '我是数据库', '0', '{"@class":"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', '0'); +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (22, '七牛存储器', 20, '', '1', '{"@class":"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3.cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS","accessSecret":"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY"}', '1', '2024-01-13 22:11:12', '1', '2024-04-03 19:38:34', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_file_config_seq; +CREATE SEQUENCE infra_file_config_seq + START 23; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_content; +CREATE TABLE infra_file_content +( + id int8 NOT NULL, + config_id int8 NOT NULL, + path varchar(512) NOT NULL, + content bytea NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file_content + ADD CONSTRAINT pk_infra_file_content PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_content.id IS '编号'; +COMMENT ON COLUMN infra_file_content.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file_content.path IS '文件路径'; +COMMENT ON COLUMN infra_file_content.content IS '文件内容'; +COMMENT ON COLUMN infra_file_content.creator IS '创建者'; +COMMENT ON COLUMN infra_file_content.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_content.updater IS '更新者'; +COMMENT ON COLUMN infra_file_content.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_content.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_content IS '文件表'; + +DROP SEQUENCE IF EXISTS infra_file_content_seq; +CREATE SEQUENCE infra_file_content_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS infra_job; +CREATE TABLE infra_job +( + id int8 NOT NULL, + name varchar(32) NOT NULL, + status int2 NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) NULL DEFAULT NULL, + cron_expression varchar(32) NOT NULL, + retry_count int4 NOT NULL DEFAULT 0, + retry_interval int4 NOT NULL DEFAULT 0, + monitor_timeout int4 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_job + ADD CONSTRAINT pk_infra_job PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job.id IS '任务编号'; +COMMENT ON COLUMN infra_job.name IS '任务名称'; +COMMENT ON COLUMN infra_job.status IS '任务状态'; +COMMENT ON COLUMN infra_job.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job.cron_expression IS 'CRON 表达式'; +COMMENT ON COLUMN infra_job.retry_count IS '重试次数'; +COMMENT ON COLUMN infra_job.retry_interval IS '重试间隔'; +COMMENT ON COLUMN infra_job.monitor_timeout IS '监控超时时间'; +COMMENT ON COLUMN infra_job.creator IS '创建者'; +COMMENT ON COLUMN infra_job.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job.updater IS '更新者'; +COMMENT ON COLUMN infra_job.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job.deleted IS '是否删除'; +COMMENT ON TABLE infra_job IS '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2023-07-09 20:51:41', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 14:36:26', '1', '2023-07-22 15:39:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 15:36:23', '1', '2023-07-22 15:39:54', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-23 21:03:44', '1', '2023-07-23 21:09:00', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (21, '交易订单的自动过期 Job', 2, 'tradeOrderAutoCancelJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-25 23:43:26', '1', '2023-09-26 19:23:30', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (22, '交易订单的自动收货 Job', 2, 'tradeOrderAutoReceiveJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 19:23:53', '1', '2023-09-26 23:38:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (23, '交易订单的自动评论 Job', 2, 'tradeOrderAutoCommentJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 23:38:29', '1', '2023-09-27 11:03:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (24, '佣金解冻 Job', 2, 'brokerageRecordUnfreezeJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-28 22:01:46', '1', '2023-09-28 22:01:56', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (25, '访问日志清理 Job', 2, 'accessLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 10:59:41', '1', '2023-10-03 11:01:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (26, '错误日志清理 Job', 2, 'errorLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:00:43', '1', '2023-10-03 11:01:12', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (27, '任务日志清理 Job', 2, 'jobLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:01:33', '1', '2023-10-03 11:01:42', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_job_seq; +CREATE SEQUENCE infra_job_seq + START 28; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_job_log; +CREATE TABLE infra_job_log +( + id int8 NOT NULL, + job_id int8 NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) NULL DEFAULT NULL, + execute_index int2 NOT NULL DEFAULT 1, + begin_time timestamp NOT NULL, + end_time timestamp NULL DEFAULT NULL, + duration int4 NULL DEFAULT NULL, + status int2 NOT NULL, + result varchar(4000) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_job_log + ADD CONSTRAINT pk_infra_job_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job_log.id IS '日志编号'; +COMMENT ON COLUMN infra_job_log.job_id IS '任务编号'; +COMMENT ON COLUMN infra_job_log.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job_log.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job_log.execute_index IS '第几次执行'; +COMMENT ON COLUMN infra_job_log.begin_time IS '开始执行时间'; +COMMENT ON COLUMN infra_job_log.end_time IS '结束执行时间'; +COMMENT ON COLUMN infra_job_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_job_log.status IS '任务状态'; +COMMENT ON COLUMN infra_job_log.result IS '结果数据'; +COMMENT ON COLUMN infra_job_log.creator IS '创建者'; +COMMENT ON COLUMN infra_job_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job_log.updater IS '更新者'; +COMMENT ON COLUMN infra_job_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job_log.deleted IS '是否删除'; +COMMENT ON TABLE infra_job_log IS '定时任务日志表'; + +DROP SEQUENCE IF EXISTS infra_job_log_seq; +CREATE SEQUENCE infra_job_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS system_dept; +CREATE TABLE system_dept +( + id int8 NOT NULL, + name varchar(30) NULL DEFAULT '', + parent_id int8 NOT NULL DEFAULT 0, + sort int4 NOT NULL DEFAULT 0, + leader_user_id int8 NULL DEFAULT NULL, + phone varchar(11) NULL DEFAULT NULL, + email varchar(50) NULL DEFAULT NULL, + status int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_dept + ADD CONSTRAINT pk_system_dept PRIMARY KEY (id); + +COMMENT ON COLUMN system_dept.id IS '部门id'; +COMMENT ON COLUMN system_dept.name IS '部门名称'; +COMMENT ON COLUMN system_dept.parent_id IS '父部门id'; +COMMENT ON COLUMN system_dept.sort IS '显示顺序'; +COMMENT ON COLUMN system_dept.leader_user_id IS '负责人'; +COMMENT ON COLUMN system_dept.phone IS '联系电话'; +COMMENT ON COLUMN system_dept.email IS '邮箱'; +COMMENT ON COLUMN system_dept.status IS '部门状态(0正常 1停用)'; +COMMENT ON COLUMN system_dept.creator IS '创建者'; +COMMENT ON COLUMN system_dept.create_time IS '创建时间'; +COMMENT ON COLUMN system_dept.updater IS '更新者'; +COMMENT ON COLUMN system_dept.update_time IS '更新时间'; +COMMENT ON COLUMN system_dept.deleted IS '是否删除'; +COMMENT ON COLUMN system_dept.tenant_id IS '租户编号'; +COMMENT ON TABLE system_dept IS '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-11-14 23:30:36', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:53:35', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2024-03-24 20:56:04', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:15', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, '运维部门', 101, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:28:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-02-16 08:35:45', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', '0', 121); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', '0', 122); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, '产品部门', 101, 100, 1, NULL, NULL, 1, '1', '2023-12-02 09:45:13', '1', '2023-12-02 09:45:31', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, '支持部门', 102, 3, 104, NULL, NULL, 1, '1', '2023-12-02 09:47:38', '1', '2023-12-02 09:47:38', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dept_seq; +CREATE SEQUENCE system_dept_seq + START 114; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_data; +CREATE TABLE system_dict_data +( + id int8 NOT NULL, + sort int4 NOT NULL DEFAULT 0, + label varchar(100) NULL DEFAULT '', + value varchar(100) NULL DEFAULT '', + dict_type varchar(100) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + color_type varchar(100) NULL DEFAULT '', + css_class varchar(100) NULL DEFAULT '', + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_dict_data + ADD CONSTRAINT pk_system_dict_data PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_data.id IS '字典编码'; +COMMENT ON COLUMN system_dict_data.sort IS '字典排序'; +COMMENT ON COLUMN system_dict_data.label IS '字典标签'; +COMMENT ON COLUMN system_dict_data.value IS '字典键值'; +COMMENT ON COLUMN system_dict_data.dict_type IS '字典类型'; +COMMENT ON COLUMN system_dict_data.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_data.color_type IS '颜色类型'; +COMMENT ON COLUMN system_dict_data.css_class IS 'css 样式'; +COMMENT ON COLUMN system_dict_data.remark IS '备注'; +COMMENT ON COLUMN system_dict_data.creator IS '创建者'; +COMMENT ON COLUMN system_dict_data.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_data.updater IS '更新者'; +COMMENT ON COLUMN system_dict_data.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_data.deleted IS '是否删除'; +COMMENT ON TABLE system_dict_data IS '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', '2022-03-29 00:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 2, '女', '2', 'system_user_sex', 0, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 23:30:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:05:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:06:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (16, 0, '其它', '0', 'infra_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (17, 1, '查询', '1', 'infra_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (18, 2, '新增', '2', 'infra_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (19, 3, '修改', '3', 'infra_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (20, 4, '删除', '4', 'infra_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (22, 5, '导出', '5', 'infra_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (23, 6, '导入', '6', 'infra_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', '2022-02-16 13:23:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:09:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', '2022-03-10 16:33:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', '2022-03-10 16:33:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', '2022-02-16 19:33:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', '2022-02-16 19:07:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', '2022-02-16 19:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', '2022-02-16 19:07:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', '2021-02-26 00:16:27', '1', '2022-02-16 10:22:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', '2021-02-26 00:16:34', '1', '2022-02-16 10:22:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2022-02-16 10:09:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-16 10:26:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-16 10:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-16 10:26:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-16 10:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-16 10:28:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-16 10:28:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-16 10:28:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-16 13:11:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-16 13:11:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-16 13:11:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-16 13:11:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', '2022-02-16 10:00:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', '2022-02-16 10:00:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', '2022-02-16 10:00:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', '2021-12-03 10:40:24', '1', '2023-07-19 20:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2023-07-19 20:08:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2023-07-19 20:08:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2023-07-19 20:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2023-07-19 20:09:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', '2021-12-03 10:42:55', '1', '2023-07-19 20:09:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2023-07-19 20:09:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', '1', '2023-07-19 10:08:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', '1', '2023-07-19 10:08:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', '2023-07-19 10:08:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', '2023-07-19 18:04:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', '2023-07-19 18:05:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', '2023-07-19 18:04:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (600, 5, '首页', '1', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (601, 4, '秒杀活动页', '2', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (602, 3, '砍价活动页', '3', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (603, 2, '限时折扣页', '4', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (604, 1, '满减送页', '5', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', '2021-12-10 16:44:59', '1', '2023-07-19 10:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', '1', '2023-07-19 10:15:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:46:26', '1', '2023-07-19 10:15:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1127, 1, '审批中', '1', 'bpm_process_instance_status', 0, 'default', '', '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2024-03-16 16:11:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1128, 2, '审批通过', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2024-03-16 16:11:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1129, 1, '审批中', '1', 'bpm_task_status', 0, 'primary', '', '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2024-03-08 22:41:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1130, 2, '审批通过', '2', 'bpm_task_status', 0, 'success', '', '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1131, 3, '审批不通过', '3', 'bpm_task_status', 0, 'danger', '', '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1132, 4, '已取消', '4', 'bpm_task_status', 0, 'info', '', '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2024-03-08 22:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1135, 10, '角色', '10', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '1', '2024-03-06 02:53:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '1', '2024-03-06 02:53:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2024-03-06 02:53:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1138, 30, '用户', '30', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '1', '2024-03-06 02:53:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1139, 40, '用户组', '40', 'bpm_task_candidate_strategy', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1140, 60, '流程表达式', '60', 'bpm_task_candidate_strategy', 0, 'danger', '', '任务分配规则的类型 - 流程表达式', '103', '2022-01-12 23:34:43', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1141, 22, '岗位', '22', 'bpm_task_candidate_strategy', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '1', '2024-03-06 02:53:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', '2022-03-15 00:25:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', '2022-03-15 00:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', '2022-03-15 00:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', '2022-03-15 00:26:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', '2022-03-15 00:26:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', '2022-05-09 23:58:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', '2022-10-24 21:19:47', '1', '2022-10-24 21:20:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', '2022-10-24 21:20:54', '1', '2022-10-24 21:21:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', '2022-10-24 21:21:11', '1', '2022-10-24 21:21:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', '2022-11-01 12:46:41', '1', '2022-11-01 12:50:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', '2022-11-01 12:46:51', '1', '2022-11-01 12:50:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', '2022-11-02 00:07:34', '1', '2022-11-04 00:07:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', '2022-11-02 00:07:54', '1', '2022-11-04 00:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1169, 1, '通用劵', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', '2022-11-02 00:28:22', '1', '2023-09-28 00:27:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1170, 2, '商品劵', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', '2022-11-02 00:28:34', '1', '2023-09-28 00:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1171, 1, '未使用', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', '2022-11-04 00:15:08', '1', '2023-10-03 12:54:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', '2022-11-04 00:15:21', '1', '2022-11-04 19:16:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', '2022-11-04 00:15:43', '1', '2022-11-04 19:16:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', '2022-11-04 19:13:00', '1', '2022-11-04 19:13:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', '2022-11-04 19:13:13', '1', '2022-11-04 19:14:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', '2022-11-04 22:54:49', '1', '2022-11-04 22:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', '2022-11-04 22:55:06', '1', '2022-11-04 22:55:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', '2022-11-04 22:55:41', '1', '2022-11-04 22:55:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', '2022-11-04 22:56:10', '1', '2022-11-04 22:56:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', '2022-11-04 22:59:45', '1', '2022-11-04 22:59:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', '2022-11-04 23:00:02', '1', '2022-11-04 23:00:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', '2022-11-19 20:53:33', '1', '2022-11-19 20:54:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', '2022-11-19 20:54:36', '1', '2022-11-19 20:58:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', '2022-11-19 20:56:56', '1', '2022-11-19 20:59:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', '2022-11-19 20:59:54', '1', '2022-11-19 21:00:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', '2022-11-19 21:00:33', '1', '2022-11-19 21:00:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', '2022-11-19 21:01:29', '1', '2022-11-19 21:01:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', '2022-11-19 21:02:17', '1', '2022-11-19 21:02:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', '2022-11-19 21:02:37', '1', '2022-11-19 21:03:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', '2022-11-19 21:05:05', '1', '2022-11-19 21:38:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', '2022-11-19 21:05:32', '1', '2022-11-19 21:38:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', '2022-11-19 21:39:19', '1', '2022-11-19 21:39:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', '2022-11-19 21:39:38', '1', '2022-11-19 21:39:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', '2022-12-10 10:51:11', '1', '2022-12-10 10:51:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', '2022-12-10 10:51:30', '1', '2022-12-10 10:51:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', '2022-12-10 10:54:16', '1', '2022-12-10 10:52:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', '2022-12-10 10:54:42', '1', '2022-12-10 10:52:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', '2022-12-10 10:55:02', '1', '2022-12-10 10:59:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', '2022-12-10 16:34:14', '1', '2022-12-10 16:34:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', '2022-12-10 16:34:26', '1', '2022-12-10 16:34:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1201, 2, '拼团订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', '2022-12-10 16:34:36', '1', '2022-12-10 16:34:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1202, 3, '砍价订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', '2022-12-10 16:34:48', '1', '2022-12-10 16:34:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', '2022-12-10 16:49:29', '1', '2022-12-10 16:49:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', '2022-12-10 16:49:53', '1', '2022-12-10 16:51:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', '2022-12-10 16:50:13', '1', '2022-12-10 16:51:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1209, 1, '售后中', '1', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2022-12-10 20:59:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1210, 2, '已退款', '2', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2022-12-10 20:59:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:20:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:21:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:23:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', '2023-01-26 09:53:49', '1', '2023-01-26 16:36:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', '2023-01-26 09:54:28', '1', '2023-01-26 16:36:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', '2023-01-26 09:54:50', '1', '2023-01-26 16:36:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', '2023-01-26 09:55:06', '1', '2023-01-26 16:36:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', '2023-01-28 10:35:59', '1', '2023-01-28 10:35:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', '2023-01-28 10:36:20', '1', '2023-01-28 10:36:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', '2023-02-18 23:32:24', '1', '2023-07-19 20:09:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:03:55', '1', '2023-04-13 00:03:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1335, 11, '订单积分抵扣', '11', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-10-11 07:41:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-08-20 11:59:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', '2023-07-19 18:05:37', '1', '2023-07-19 18:05:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', '2023-07-19 18:10:47', '1', '2023-07-19 18:11:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', '2023-07-19 18:11:05', '1', '2023-07-19 18:11:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', '2023-07-19 20:07:47', '1', '2023-07-19 20:09:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', '2023-07-19 20:08:06', '1', '2023-07-19 20:09:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', '2023-07-20 12:23:17', '1', '2023-07-20 12:23:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', '2023-07-20 12:23:26', '1', '2023-07-20 12:23:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', '2023-07-29 11:10:51', '1', '2023-07-29 03:14:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1349, 12, '订单积分抵扣(整单取消)', '12', 'member_point_biz_type', 0, '', '', '', '1', '2023-08-20 12:00:03', '1', '2023-10-11 07:42:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1352, 11, '下单奖励', '11', 'member_experience_biz_type', 0, 'success', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1353, 12, '下单奖励(整单取消)', '12', 'member_experience_biz_type', 0, 'warning', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:04:55', '1', '2023-08-23 00:04:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:05:05', '1', '2023-08-23 00:05:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1358, 3, '品类劵', '3', 'promotion_product_scope', 0, 'default', '', '', '1', '2023-09-01 23:43:07', '1', '2023-09-28 00:27:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1359, 1, '人人分销', '1', 'brokerage_enabled_condition', 0, '', '', '所有用户都可以分销', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1360, 2, '指定分销', '2', 'brokerage_enabled_condition', 0, '', '', '仅可后台手动设置推广员', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1361, 1, '首次绑定', '1', 'brokerage_bind_mode', 0, '', '', '只要用户没有推广人,随时都可以绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1362, 2, '注册绑定', '2', 'brokerage_bind_mode', 0, '', '', '仅新用户注册时才能绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1363, 3, '覆盖绑定', '3', 'brokerage_bind_mode', 0, '', '', '如果用户已经有推广人,推广人会被变更', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1364, 1, '钱包', '1', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1365, 2, '银行卡', '2', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1366, 3, '微信', '3', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1367, 4, '支付宝', '4', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1368, 1, '订单返佣', '1', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1369, 2, '申请提现', '2', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1370, 3, '申请提现驳回', '3', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1371, 0, '待结算', '0', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1372, 1, '已结算', '1', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1373, 2, '已取消', '2', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1374, 0, '审核中', '0', 'brokerage_withdraw_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1375, 10, '审核通过', '10', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1376, 11, '提现成功', '11', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1377, 20, '审核不通过', '20', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1378, 21, '提现失败', '21', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1379, 0, '工商银行', '0', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1380, 1, '建设银行', '1', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1381, 2, '农业银行', '2', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1382, 3, '中国银行', '3', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1383, 4, '交通银行', '4', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1384, 5, '招商银行', '5', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1385, 21, '钱包', 'wallet', 'pay_channel_code', 0, 'primary', '', '', '1', '2023-10-01 21:46:19', '1', '2023-10-01 21:48:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1386, 1, '砍价中', '1', 'promotion_bargain_record_status', 0, 'default', '', '', '1', '2023-10-05 10:41:26', '1', '2023-10-05 10:41:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1387, 2, '砍价成功', '2', 'promotion_bargain_record_status', 0, 'success', '', '', '1', '2023-10-05 10:41:39', '1', '2023-10-05 10:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1388, 3, '砍价失败', '3', 'promotion_bargain_record_status', 0, 'warning', '', '', '1', '2023-10-05 10:41:57', '1', '2023-10-05 10:41:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1389, 1, '拼团中', '1', 'promotion_combination_record_status', 0, '', '', '', '1', '2023-10-08 07:24:44', '1', '2023-10-08 07:24:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1390, 2, '拼团成功', '2', 'promotion_combination_record_status', 0, 'success', '', '', '1', '2023-10-08 07:24:56', '1', '2023-10-08 07:24:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1391, 3, '拼团失败', '3', 'promotion_combination_record_status', 0, 'warning', '', '', '1', '2023-10-08 07:25:11', '1', '2023-10-08 07:25:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1392, 2, '管理员修改', '2', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:41:34', '1', '2023-10-11 07:41:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1393, 13, '订单积分抵扣(单个退款)', '13', 'member_point_biz_type', 0, '', '', '', '1', '2023-10-11 07:42:29', '1', '2023-10-11 07:42:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1394, 21, '订单积分奖励', '21', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:44', '1', '2023-10-11 07:42:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1395, 22, '订单积分奖励(整单取消)', '22', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:55', '1', '2023-10-11 07:43:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1396, 23, '订单积分奖励(单个退款)', '23', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:43:16', '1', '2023-10-11 07:43:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1397, 13, '下单奖励(单个退款)', '13', 'member_experience_biz_type', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1398, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1399, 6, '支付宝', '6', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:38', '1', '2023-10-18 21:55:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1400, 7, '微信支付', '7', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:53', '1', '2023-10-18 21:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1401, 8, '其他', '8', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1402, 1, 'IT', '1', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:15', '1', '2024-02-18 23:30:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1403, 2, '金融业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:29', '1', '2024-02-18 23:30:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1404, 3, '房地产', '3', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:41', '1', '2024-02-18 23:30:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1405, 4, '商业服务', '4', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:54', '1', '2024-02-18 23:30:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1406, 5, '运输/物流', '5', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:03', '1', '2024-02-18 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1407, 6, '生产', '6', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:13', '1', '2024-02-18 23:31:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1408, 7, '政府', '7', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:27', '1', '2024-02-18 23:31:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1409, 8, '文化传媒', '8', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:37', '1', '2024-02-18 23:31:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', '2023-10-28 23:07:13', '1', '2023-10-28 23:07:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', '2023-10-28 23:07:35', '1', '2023-10-28 23:07:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', '2023-10-28 23:07:53', '1', '2023-10-28 23:07:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:29', '1', '2023-10-28 23:08:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:39', '1', '2023-10-28 23:08:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:47', '1', '2023-10-28 23:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:58', '1', '2023-10-28 23:08:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:12', '1', '2023-10-28 23:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:22', '1', '2023-10-28 23:09:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:39', '1', '2023-10-28 23:09:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:04', '1', '2023-10-28 23:10:04', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:18', '1', '2023-10-28 23:10:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:33', '1', '2023-10-28 23:10:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1435, 10, 'Gitee', '10', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:42', '1', '2023-11-04 13:04:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1436, 20, '钉钉', '20', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:54', '1', '2023-11-04 13:04:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1437, 30, '企业微信', '30', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:09', '1', '2023-11-04 13:05:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1438, 31, '微信公众平台', '31', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:18', '1', '2023-11-04 13:05:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1439, 32, '微信开放平台', '32', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:30', '1', '2023-11-04 13:05:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1440, 34, '微信小程序', '34', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:38', '1', '2023-11-04 13:07:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1441, 1, '上架', '1', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:34', '1', '2023-10-30 21:49:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1442, 0, '下架', '0', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:13', '1', '2023-10-30 21:49:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1443, 15, '子表', '15', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-13 23:06:16', '1', '2023-11-13 23:06:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1444, 10, '主表(标准模式)', '10', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:32:49', '1', '2023-11-14 12:32:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1445, 11, '主表(ERP 模式)', '11', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:33:05', '1', '2023-11-14 12:33:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1446, 12, '主表(内嵌模式)', '12', 'infra_codegen_template_type', 0, '', '', '', '1', '2023-11-14 12:33:31', '1', '2023-11-14 12:33:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1447, 1, '负责人', '1', 'crm_permission_level', 0, 'default', '', '', '1', '2023-11-30 09:53:12', '1', '2023-11-30 09:53:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1448, 2, '只读', '2', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:29', '1', '2023-11-30 09:53:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1449, 3, '读写', '3', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:36', '1', '2023-11-30 09:53:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1450, 0, '未提交', '0', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:56:59', '1', '2023-11-30 18:56:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1451, 10, '审批中', '10', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:10', '1', '2023-11-30 18:57:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1452, 20, '审核通过', '20', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:24', '1', '2023-11-30 18:57:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1453, 30, '审核不通过', '30', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:32', '1', '2023-11-30 18:57:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1454, 40, '已取消', '40', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:42', '1', '2023-11-30 18:57:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1456, 1, '支票', '1', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:29', '1', '2023-10-18 21:54:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1460, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1464, 4, '把', '4', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:05', '1', '2023-12-05 23:03:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1465, 5, '枚', '5', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:14', '1', '2023-12-05 23:03:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1466, 6, '瓶', '6', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:20', '1', '2023-12-05 23:03:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1467, 7, '盒', '7', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:30', '1', '2023-12-05 23:03:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1468, 8, '台', '8', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:41', '1', '2023-12-05 23:03:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1469, 9, '吨', '9', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:48', '1', '2023-12-05 23:03:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1470, 10, '千克', '10', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:03', '1', '2023-12-05 23:04:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1471, 11, '米', '11', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:12', '1', '2023-12-05 23:04:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1472, 12, '箱', '12', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:25', '1', '2023-12-05 23:04:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1473, 13, '套', '13', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:34', '1', '2023-12-05 23:04:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1474, 1, '打电话', '1', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:20', '1', '2024-01-15 20:48:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1475, 2, '发短信', '2', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:31', '1', '2024-01-15 20:48:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1476, 3, '上门拜访', '3', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:07', '1', '2024-01-15 20:49:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1477, 4, '微信沟通', '4', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:15', '1', '2024-01-15 20:49:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1478, 4, '钱包余额', '4', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:37', '1', '2023-10-28 16:28:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1479, 3, '银行卡', '3', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:28:21', '1', '2023-10-28 16:28:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1480, 2, '微信余额', '2', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:07', '1', '2023-10-28 16:28:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1481, 1, '支付宝余额', '1', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:27:44', '1', '2023-10-28 16:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1482, 4, '转账失败', '30', 'pay_transfer_status', 0, 'warning', '', '', '1', '2023-10-28 16:24:16', '1', '2023-10-28 16:24:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1483, 3, '转账成功', '20', 'pay_transfer_status', 0, 'success', '', '', '1', '2023-10-28 16:23:50', '1', '2023-10-28 16:23:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1484, 2, '转账进行中', '10', 'pay_transfer_status', 0, 'info', '', '', '1', '2023-10-28 16:23:12', '1', '2023-10-28 16:23:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1485, 1, '等待转账', '0', 'pay_transfer_status', 0, 'default', '', '', '1', '2023-10-28 16:21:43', '1', '2023-10-28 16:23:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1486, 10, '其它入库', '10', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:07:25', '1', '2024-02-05 18:07:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1487, 11, '其它入库(作废)', '11', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:08:07', '1', '2024-02-05 19:20:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1488, 20, '其它出库', '20', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:08:51', '1', '2024-02-05 18:08:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1489, 21, '其它出库(作废)', '21', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:09:00', '1', '2024-02-05 19:20:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1490, 10, '未审核', '10', 'erp_audit_status', 0, 'default', '', '', '1', '2024-02-06 00:00:21', '1', '2024-02-06 00:00:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1491, 20, '已审核', '20', 'erp_audit_status', 0, 'success', '', '', '1', '2024-02-06 00:00:35', '1', '2024-02-06 00:00:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1492, 30, '调拨入库', '30', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:19', '1', '2024-02-07 12:36:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1493, 31, '调拨入库(作废)', '31', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:29', '1', '2024-02-07 20:37:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1494, 32, '调拨出库', '32', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:38', '1', '2024-02-07 12:36:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1495, 33, '调拨出库(作废)', '33', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:49', '1', '2024-02-07 20:37:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1496, 40, '盘盈入库', '40', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:53:00', '1', '2024-02-08 08:53:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1497, 41, '盘盈入库(作废)', '41', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:53:39', '1', '2024-02-16 19:40:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1498, 42, '盘亏出库', '42', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:54:16', '1', '2024-02-08 08:54:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1499, 43, '盘亏出库(作废)', '43', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:54:31', '1', '2024-02-16 19:40:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1500, 50, '销售出库', '50', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-11 21:47:25', '1', '2024-02-11 21:50:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1501, 51, '销售出库(作废)', '51', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-11 21:47:37', '1', '2024-02-11 21:51:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1502, 60, '销售退货入库', '60', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-12 06:51:05', '1', '2024-02-12 06:51:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1503, 61, '销售退货入库(作废)', '61', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-12 06:51:18', '1', '2024-02-12 06:51:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1504, 70, '采购入库', '70', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:02', '1', '2024-02-16 13:10:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1505, 71, '采购入库(作废)', '71', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:10', '1', '2024-02-16 19:40:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1506, 80, '采购退货出库', '80', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:17', '1', '2024-02-16 13:10:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1507, 81, '采购退货出库(作废)', '81', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:26', '1', '2024-02-16 19:40:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1509, 3, '审批不通过', '3', 'bpm_process_instance_status', 0, 'danger', '', '', '1', '2024-03-16 16:12:06', '1', '2024-03-16 16:12:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1510, 4, '已取消', '4', 'bpm_process_instance_status', 0, 'warning', '', '', '1', '2024-03-16 16:12:22', '1', '2024-03-16 16:12:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1511, 5, '已退回', '5', 'bpm_task_status', 0, 'warning', '', '', '1', '2024-03-16 19:10:46', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1512, 6, '委派中', '6', 'bpm_task_status', 0, 'primary', '', '', '1', '2024-03-17 10:06:22', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1513, 7, '审批通过中', '7', 'bpm_task_status', 0, 'success', '', '', '1', '2024-03-17 10:06:47', '1', '2024-03-08 22:41:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1514, 0, '待审批', '0', 'bpm_task_status', 0, 'info', '', '', '1', '2024-03-17 10:07:11', '1', '2024-03-08 22:41:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1515, 35, '发起人自选', '35', 'bpm_task_candidate_strategy', 0, '', '', '', '1', '2024-03-22 19:45:16', '1', '2024-03-22 19:45:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1516, 1, '执行监听器', 'execution', 'bpm_process_listener_type', 0, 'primary', '', '', '1', '2024-03-23 12:54:03', '1', '2024-03-23 19:14:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1517, 1, '任务监听器', 'task', 'bpm_process_listener_type', 0, 'success', '', '', '1', '2024-03-23 12:54:13', '1', '2024-03-23 19:14:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1526, 1, 'Java 类', 'class', 'bpm_process_listener_value_type', 0, 'primary', '', '', '1', '2024-03-23 15:08:45', '1', '2024-03-23 19:14:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1527, 2, '表达式', 'expression', 'bpm_process_listener_value_type', 0, 'success', '', '', '1', '2024-03-23 15:09:06', '1', '2024-03-23 19:14:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1528, 3, '代理表达式', 'delegateExpression', 'bpm_process_listener_value_type', 0, 'info', '', '', '1', '2024-03-23 15:11:23', '1', '2024-03-23 19:14:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1529, 1, '天', '1', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:26', '1', '2024-03-29 22:50:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1530, 2, '周', '2', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:36', '1', '2024-03-29 22:50:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1531, 3, '月', '3', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:46', '1', '2024-03-29 22:50:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1532, 4, '季度', '4', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:01', '1', '2024-03-29 22:51:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1533, 5, '年', '5', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:07', '1', '2024-03-29 22:51:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1534, 1, '赢单', '1', 'crm_business_end_status_type', 0, 'success', '', '', '1', '2024-04-13 23:26:57', '1', '2024-04-13 23:26:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1535, 2, '输单', '2', 'crm_business_end_status_type', 0, 'primary', '', '', '1', '2024-04-13 23:27:31', '1', '2024-04-13 23:27:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1536, 3, '无效', '3', 'crm_business_end_status_type', 0, 'info', '', '', '1', '2024-04-13 23:27:59', '1', '2024-04-13 23:27:59', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dict_data_seq; +CREATE SEQUENCE system_dict_data_seq + START 1537; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_type; +CREATE TABLE system_dict_type +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + type varchar(100) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + deleted_time timestamp NULL DEFAULT NULL +); + +ALTER TABLE system_dict_type + ADD CONSTRAINT pk_system_dict_type PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_type.id IS '字典主键'; +COMMENT ON COLUMN system_dict_type.name IS '字典名称'; +COMMENT ON COLUMN system_dict_type.type IS '字典类型'; +COMMENT ON COLUMN system_dict_type.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_type.remark IS '备注'; +COMMENT ON COLUMN system_dict_type.creator IS '创建者'; +COMMENT ON COLUMN system_dict_type.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_type.updater IS '更新者'; +COMMENT ON COLUMN system_dict_type.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_type.deleted IS '是否删除'; +COMMENT ON COLUMN system_dict_type.deleted_time IS '删除时间'; +COMMENT ON TABLE system_dict_type IS '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-05-16 20:29:32', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (9, '操作类型', 'infra_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '1', '2022-05-16 20:26:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2023-07-10 10:11:39', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', '2021-12-03 10:53:29', '1', '2023-07-19 18:09:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2023-07-19 10:13:17', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (140, '流程实例的结果', 'bpm_task_status', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2024-03-08 22:42:03', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (142, '任务分配规则的类型', 'bpm_task_candidate_strategy', 0, 'BPM 任务的候选人的策略', '103', '2022-01-12 23:21:04', '103', '2024-03-06 02:53:59', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', '2022-03-10 16:33:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', '2022-03-15 00:24:38', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', '2022-10-24 21:19:04', '1', '2022-10-24 21:19:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', '2022-11-01 12:46:06', '1', '2022-11-01 12:46:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', '2022-11-02 00:06:20', '1', '2022-11-04 00:08:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', '2022-11-02 00:28:01', '1', '2022-11-02 00:28:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', '2022-11-04 00:14:49', '1', '2022-11-04 00:14:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', '2022-11-04 19:12:27', '1', '2022-11-04 19:12:27', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', '2022-11-04 22:54:23', '1', '2022-11-04 22:54:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', '2022-11-04 22:59:23', '1', '2022-11-04 22:59:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', '2022-11-19 20:52:56', '1', '2022-11-19 20:52:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', '2022-11-19 21:04:09', '1', '2022-11-19 21:04:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', '2022-11-19 21:39:04', '1', '2022-11-19 21:39:04', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (160, '终端', 'terminal', 0, '终端', '1', '2022-12-10 10:50:50', '1', '2022-12-10 10:53:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', '2022-12-10 16:33:54', '1', '2022-12-10 16:33:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', '2022-12-10 16:48:44', '1', '2022-12-10 16:48:44', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', '2022-12-10 20:58:08', '1', '2022-12-10 20:58:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', '2023-01-16 23:29:56', '1', '2023-01-16 23:29:56', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', '2023-01-17 22:17:09', '1', '2023-01-17 22:17:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', '2023-07-20 12:23:03', '1', '2023-07-20 12:23:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', '2023-08-23 00:03:14', '1', '2023-08-23 00:03:14', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (176, '分佣模式', 'brokerage_enabled_condition', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (177, '分销关系绑定模式', 'brokerage_bind_mode', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (178, '佣金提现类型', 'brokerage_withdraw_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (179, '佣金记录业务类型', 'brokerage_record_biz_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (180, '佣金记录状态', 'brokerage_record_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (181, '佣金提现状态', 'brokerage_withdraw_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (182, '佣金提现银行', 'brokerage_bank_name', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (183, '砍价记录的状态', 'promotion_bargain_record_status', 0, '', '1', '2023-10-05 10:41:08', '1', '2023-10-05 10:41:08', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (184, '拼团记录的状态', 'promotion_combination_record_status', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-10-08 07:24:25', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (185, '回款-回款方式', 'crm_receivable_return_type', 0, '回款-回款方式', '1', '2023-10-18 21:54:10', '1', '2023-10-18 21:54:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (186, 'CRM 客户行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', '2023-10-28 22:57:07', '1', '2024-02-18 23:30:22', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', '2023-10-28 22:59:12', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', '2023-10-28 23:00:34', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (600, 'Banner 位置', 'promotion_banner_position', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-11-04 13:04:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (601, '社交类型', 'system_social_type', 0, '', '1', '2023-11-04 13:03:54', '1', '2023-11-04 13:03:54', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (604, '产品状态', 'crm_product_status', 0, '', '1', '2023-10-30 21:47:59', '1', '2023-10-30 21:48:45', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (605, 'CRM 数据权限的级别', 'crm_permission_level', 0, '', '1', '2023-11-30 09:51:59', '1', '2023-11-30 09:51:59', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (606, 'CRM 审批状态', 'crm_audit_status', 0, '', '1', '2023-11-30 18:56:23', '1', '2023-11-30 18:56:23', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (607, 'CRM 产品单位', 'crm_product_unit', 0, '', '1', '2023-12-05 23:01:51', '1', '2023-12-05 23:01:51', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (608, 'CRM 跟进方式', 'crm_follow_up_type', 0, '', '1', '2024-01-15 20:48:05', '1', '2024-01-15 20:48:05', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (609, '支付转账类型', 'pay_transfer_type', 0, '', '1', '2023-10-28 16:27:18', '1', '2023-10-28 16:27:18', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (610, '转账订单状态', 'pay_transfer_status', 0, '', '1', '2023-10-28 16:18:32', '1', '2023-10-28 16:18:32', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (611, 'ERP 库存明细的业务类型', 'erp_stock_record_biz_type', 0, 'ERP 库存明细的业务类型', '1', '2024-02-05 18:07:02', '1', '2024-02-05 18:07:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (612, 'ERP 审批状态', 'erp_audit_status', 0, '', '1', '2024-02-06 00:00:07', '1', '2024-02-06 00:00:07', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (613, 'BPM 监听器类型', 'bpm_process_listener_type', 0, '', '1', '2024-03-23 12:52:24', '1', '2024-03-09 15:54:28', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (615, 'BPM 监听器值类型', 'bpm_process_listener_value_type', 0, '', '1', '2024-03-23 13:00:31', '1', '2024-03-23 13:00:31', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (616, '时间间隔', 'date_interval', 0, '', '1', '2024-03-29 22:50:09', '1', '2024-03-29 22:50:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (619, 'CRM 商机结束状态类型', 'crm_business_end_status_type', 0, '', '1', '2024-04-13 23:23:00', '1', '2024-04-13 23:23:00', '0', '1970-01-01 00:00:00'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dict_type_seq; +CREATE SEQUENCE system_dict_type_seq + START 620; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS system_login_log; +CREATE TABLE system_login_log +( + id int8 NOT NULL, + log_type int8 NOT NULL, + trace_id varchar(64) NULL DEFAULT '', + user_id int8 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + username varchar(50) NULL DEFAULT '', + result int2 NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_login_log + ADD CONSTRAINT pk_system_login_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_login_log.id IS '访问ID'; +COMMENT ON COLUMN system_login_log.log_type IS '日志类型'; +COMMENT ON COLUMN system_login_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_login_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_login_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_login_log.username IS '用户账号'; +COMMENT ON COLUMN system_login_log.result IS '登陆结果'; +COMMENT ON COLUMN system_login_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_login_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_login_log.creator IS '创建者'; +COMMENT ON COLUMN system_login_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_login_log.updater IS '更新者'; +COMMENT ON COLUMN system_login_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_login_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_login_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_login_log IS '系统访问记录'; + +DROP SEQUENCE IF EXISTS system_login_log_seq; +CREATE SEQUENCE system_login_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_account; +CREATE TABLE system_mail_account +( + id int8 NOT NULL, + mail varchar(255) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NOT NULL, + host varchar(255) NOT NULL, + port int4 NOT NULL, + ssl_enable bool NOT NULL DEFAULT '0', + starttls_enable bool NOT NULL DEFAULT '0', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_account + ADD CONSTRAINT pk_system_mail_account PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_account.id IS '主键'; +COMMENT ON COLUMN system_mail_account.mail IS '邮箱'; +COMMENT ON COLUMN system_mail_account.username IS '用户名'; +COMMENT ON COLUMN system_mail_account.password IS '密码'; +COMMENT ON COLUMN system_mail_account.host IS 'SMTP 服务器域名'; +COMMENT ON COLUMN system_mail_account.port IS 'SMTP 服务器端口'; +COMMENT ON COLUMN system_mail_account.ssl_enable IS '是否开启 SSL'; +COMMENT ON COLUMN system_mail_account.starttls_enable IS '是否开启 STARTTLS'; +COMMENT ON COLUMN system_mail_account.creator IS '创建者'; +COMMENT ON COLUMN system_mail_account.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_account.updater IS '更新者'; +COMMENT ON COLUMN system_mail_account.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_account.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_account IS '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, '0', '0', '1', '2023-01-25 17:39:52', '1', '2024-04-24 09:13:56', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, '1', '0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, '0', '0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', '1'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, '1', '0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', '1'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_mail_account_seq; +CREATE SEQUENCE system_mail_account_seq + START 5; + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_log; +CREATE TABLE system_mail_log +( + id int8 NOT NULL, + user_id int8 NULL DEFAULT NULL, + user_type int2 NULL DEFAULT NULL, + to_mail varchar(255) NOT NULL, + account_id int8 NOT NULL, + from_mail varchar(255) NOT NULL, + template_id int8 NOT NULL, + template_code varchar(63) NOT NULL, + template_nickname varchar(255) NULL DEFAULT NULL, + template_title varchar(255) NOT NULL, + template_content varchar(10240) NOT NULL, + template_params varchar(255) NOT NULL, + send_status int2 NOT NULL DEFAULT 0, + send_time timestamp NULL DEFAULT NULL, + send_message_id varchar(255) NULL DEFAULT NULL, + send_exception varchar(4096) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_log + ADD CONSTRAINT pk_system_mail_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_log.id IS '编号'; +COMMENT ON COLUMN system_mail_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_mail_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_mail_log.to_mail IS '接收邮箱地址'; +COMMENT ON COLUMN system_mail_log.account_id IS '邮箱账号编号'; +COMMENT ON COLUMN system_mail_log.from_mail IS '发送邮箱地址'; +COMMENT ON COLUMN system_mail_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_mail_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_mail_log.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_mail_log.template_title IS '邮件标题'; +COMMENT ON COLUMN system_mail_log.template_content IS '邮件内容'; +COMMENT ON COLUMN system_mail_log.template_params IS '邮件参数'; +COMMENT ON COLUMN system_mail_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_mail_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_mail_log.send_message_id IS '发送返回的消息 ID'; +COMMENT ON COLUMN system_mail_log.send_exception IS '发送异常'; +COMMENT ON COLUMN system_mail_log.creator IS '创建者'; +COMMENT ON COLUMN system_mail_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_log.updater IS '更新者'; +COMMENT ON COLUMN system_mail_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_log.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_log IS '邮件日志表'; + +DROP SEQUENCE IF EXISTS system_mail_log_seq; +CREATE SEQUENCE system_mail_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_template; +CREATE TABLE system_mail_template +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + code varchar(63) NOT NULL, + account_id int8 NOT NULL, + nickname varchar(255) NULL DEFAULT NULL, + title varchar(255) NOT NULL, + content varchar(10240) NOT NULL, + params varchar(255) NOT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_template + ADD CONSTRAINT pk_system_mail_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_template.id IS '编号'; +COMMENT ON COLUMN system_mail_template.name IS '模板名称'; +COMMENT ON COLUMN system_mail_template.code IS '模板编码'; +COMMENT ON COLUMN system_mail_template.account_id IS '发送的邮箱账号编号'; +COMMENT ON COLUMN system_mail_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_mail_template.title IS '模板标题'; +COMMENT ON COLUMN system_mail_template.content IS '模板内容'; +COMMENT ON COLUMN system_mail_template.params IS '参数数组'; +COMMENT ON COLUMN system_mail_template.status IS '开启状态'; +COMMENT ON COLUMN system_mail_template.remark IS '备注'; +COMMENT ON COLUMN system_mail_template.creator IS '创建者'; +COMMENT ON COLUMN system_mail_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_template.updater IS '更新者'; +COMMENT ON COLUMN system_mail_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_template.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_template IS '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '["code","name"]', 0, '3', '1', '2021-10-11 08:10:00', '1', '2023-12-02 19:51:14', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '["key01","key02"]', 0, NULL, '1', '2023-01-26 01:27:40', '1', '2023-01-27 10:32:16', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', '2023-01-27 15:50:35', '1', '2023-01-27 16:34:49', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_mail_template_seq; +CREATE SEQUENCE system_mail_template_seq + START 16; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_menu; +CREATE TABLE system_menu +( + id int8 NOT NULL, + name varchar(50) NOT NULL, + permission varchar(100) NULL DEFAULT '', + type int2 NOT NULL, + sort int4 NOT NULL DEFAULT 0, + parent_id int8 NOT NULL DEFAULT 0, + path varchar(200) NULL DEFAULT '', + icon varchar(100) NULL DEFAULT '#', + component varchar(255) NULL DEFAULT NULL, + component_name varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL DEFAULT 0, + visible bool NOT NULL DEFAULT '1', + keep_alive bool NOT NULL DEFAULT '1', + always_show bool NOT NULL DEFAULT '1', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_menu + ADD CONSTRAINT pk_system_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_menu.id IS '菜单ID'; +COMMENT ON COLUMN system_menu.name IS '菜单名称'; +COMMENT ON COLUMN system_menu.permission IS '权限标识'; +COMMENT ON COLUMN system_menu.type IS '菜单类型'; +COMMENT ON COLUMN system_menu.sort IS '显示顺序'; +COMMENT ON COLUMN system_menu.parent_id IS '父菜单ID'; +COMMENT ON COLUMN system_menu.path IS '路由地址'; +COMMENT ON COLUMN system_menu.icon IS '菜单图标'; +COMMENT ON COLUMN system_menu.component IS '组件路径'; +COMMENT ON COLUMN system_menu.component_name IS '组件名'; +COMMENT ON COLUMN system_menu.status IS '菜单状态'; +COMMENT ON COLUMN system_menu.visible IS '是否可见'; +COMMENT ON COLUMN system_menu.keep_alive IS '是否缓存'; +COMMENT ON COLUMN system_menu.always_show IS '是否总是显示'; +COMMENT ON COLUMN system_menu.creator IS '创建者'; +COMMENT ON COLUMN system_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_menu.updater IS '更新者'; +COMMENT ON COLUMN system_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_menu.deleted IS '是否删除'; +COMMENT ON TABLE system_menu IS '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:04:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-03-01 08:28:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-09-20 16:26:19', '1', '2024-02-29 12:38:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:02:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:07:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:02:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (107, '通知公告', '', 2, 4, 2739, 'notice', 'ep:takeaway-box', 'system/notice/index', 'SystemNotice', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-22 23:56:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:08:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:13:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (110, '定时任务', '', 2, 7, 2, 'job', 'fa-solid:tasks', 'infra/job/index', 'InfraJob', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:57:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:05:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:document-copy', 'infra/codegen/index', 'InfraCodegen', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:01:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:09:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:10:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, '1', '1', '1', '', '2021-02-06 12:42:49', '1', '2023-11-15 23:45:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, '1', '1', '1', '', '2021-02-08 20:41:31', '1', '2024-04-23 00:07:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2024-02-29 08:54:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '', '2021-02-26 02:18:24', '1', '2024-04-22 23:58:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2024-02-29 08:55:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, '1', '1', '1', '', '2021-03-12 20:16:20', '1', '2024-02-29 08:53:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1093, '短信管理', '', 1, 1, 2739, 'sms', 'ep:message', NULL, NULL, 0, '1', '1', '1', '1', '2021-04-05 01:10:16', '1', '2024-04-22 23:56:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'fa:stack-exchange', 'system/sms/channel/index', 'SystemSmsChannel', 0, '1', '1', '1', '', '2021-04-01 11:07:15', '1', '2024-02-29 01:15:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'ep:connection', 'system/sms/template/index', 'SystemSmsTemplate', 0, '1', '1', '1', '', '2021-04-01 17:35:17', '1', '2024-02-29 01:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'fa:edit', 'system/sms/log/index', 'SystemSmsLog', 0, '1', '1', '1', '', '2021-04-11 08:37:05', '1', '2024-02-29 08:49:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1117, '支付管理', '', 1, 30, 0, '/pay', 'ep:money', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-25 16:43:41', '1', '2024-02-29 08:58:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2024-02-29 12:38:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'fa:apple', 'pay/app/index', 'PayApp', 0, '1', '1', '1', '', '2021-11-10 01:13:30', '1', '2024-02-29 08:59:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'ep:house', 'system/tenant/index', 'SystemTenant', 0, '1', '1', '1', '', '2021-12-14 12:31:43', '1', '2024-02-29 01:01:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'fa:registered', 'pay/refund/index', 'PayRefund', 0, '1', '1', '1', '', '2021-12-25 08:29:07', '1', '2024-02-29 08:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'fa:cc-paypal', 'pay/order/index', 'PayOrder', 0, '1', '1', '1', '', '2021-12-25 08:49:43', '1', '2024-02-29 08:59:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:26:36', '1', '2024-02-29 12:43:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:28:30', '1', '2024-02-29 12:36:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2024-03-19 12:25:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, '1', '1', '1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:35', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '1', '2022-01-07 23:51:48', '1', '2024-03-21 00:33:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2024-03-21 23:52:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, '1', '1', '1', '1', '2022-01-08 10:33:37', '1', '2024-02-29 12:37:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, '1', '1', '1', '1', '2022-01-08 10:34:13', '1', '2024-02-29 12:37:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, '1', '1', '1', '', '2022-01-14 02:14:20', '1', '2024-03-21 23:55:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'fa-solid:house-user', NULL, NULL, 0, '1', '1', '1', '1', '2022-02-20 01:41:13', '1', '2024-02-29 00:59:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'fa:bars', 'system/tenantPackage/index', 'SystemTenantPackage', 0, '1', '1', '1', '', '2022-02-19 17:44:06', '1', '2024-02-29 01:01:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, '1', '1', '1', '', '2022-03-15 14:35:28', '1', '2024-02-29 08:52:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, '1', '1', '1', '1', '2022-03-16 23:47:40', '1', '2024-04-23 00:02:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:avatar', NULL, NULL, 0, '1', '1', '1', '1', '2022-04-23 01:03:15', '1', '2023-12-08 23:40:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:data-analysis', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, '1', '1', '1', '', '2022-04-27 14:37:32', '1', '2024-02-29 08:51:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, '1', '1', '1', '1', '2022-05-09 23:38:17', '1', '2024-02-29 01:12:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2024-02-29 01:13:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1281, '报表管理', '', 2, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, '1', '1', '1', '1', '2022-07-10 20:22:15', '1', '2024-02-29 12:33:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'GoView', 0, '1', '1', '1', '1', '2022-07-10 20:26:36', '1', '2024-02-29 12:33:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2000, '商品中心', '', 1, 60, 2362, 'product', 'fa:product-hunt', NULL, NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-09-30 11:52:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2002, '商品分类', '', 2, 2, 2000, 'category', 'ep:cellphone', 'mall/product/category/index', 'ProductCategory', 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-08-21 10:27:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2003, '分类查询', 'product:category:query', 3, 1, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2004, '分类创建', 'product:category:create', 3, 2, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2005, '分类更新', 'product:category:update', 3, 3, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2006, '分类删除', 'product:category:delete', 3, 4, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2008, '商品品牌', '', 2, 3, 2000, 'brand', 'ep:chicken', 'mall/product/brand/index', 'ProductBrand', 0, '1', '1', '1', '', '2022-07-30 13:52:44', '1', '2023-08-21 10:27:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2009, '品牌查询', 'product:brand:query', 3, 1, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2010, '品牌创建', 'product:brand:create', 3, 2, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2011, '品牌更新', 'product:brand:update', 3, 3, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2012, '品牌删除', 'product:brand:delete', 3, 4, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2014, '商品列表', '', 2, 1, 2000, 'spu', 'ep:apple', 'mall/product/spu/index', 'ProductSpu', 0, '1', '1', '1', '', '2022-07-30 14:22:58', '1', '2023-08-21 10:27:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2015, '商品查询', 'product:spu:query', 3, 1, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2016, '商品创建', 'product:spu:create', 3, 2, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2017, '商品更新', 'product:spu:update', 3, 3, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2018, '商品删除', 'product:spu:delete', 3, 4, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2019, '商品属性', '', 2, 4, 2000, 'property', 'ep:cold-drink', 'mall/product/property/index', 'ProductProperty', 0, '1', '1', '1', '', '2022-08-01 14:55:35', '1', '2023-08-26 11:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2020, '规格查询', 'product:property:query', 3, 1, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2021, '规格创建', 'product:property:create', 3, 2, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2022, '规格更新', 'product:property:update', 3, 3, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2023, '规格删除', 'product:property:delete', 3, 4, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2025, 'Banner', '', 2, 100, 2387, 'banner', 'fa:bandcamp', 'mall/promotion/banner/index', NULL, 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2026, 'Banner查询', 'promotion:banner:query', 3, 1, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2027, 'Banner创建', 'promotion:banner:create', 3, 2, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2028, 'Banner更新', 'promotion:banner:update', 3, 3, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2029, 'Banner删除', 'promotion:banner:delete', 3, 4, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2030, '营销中心', '', 1, 70, 2362, 'promotion', 'ep:present', NULL, NULL, 0, '1', '1', '1', '1', '2022-10-31 21:25:09', '1', '2023-09-30 11:54:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2032, '优惠劵列表', '', 2, 1, 2365, 'template', 'ep:discount', 'mall/promotion/coupon/template/index', 'PromotionCouponTemplate', 0, '1', '1', '1', '', '2022-10-31 22:27:14', '1', '2023-10-03 12:40:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2033, '优惠劵模板查询', 'promotion:coupon-template:query', 3, 1, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2034, '优惠劵模板创建', 'promotion:coupon-template:create', 3, 2, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2035, '优惠劵模板更新', 'promotion:coupon-template:update', 3, 3, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2036, '优惠劵模板删除', 'promotion:coupon-template:delete', 3, 4, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2038, '领取记录', '', 2, 2, 2365, 'list', 'ep:collection-tag', 'mall/promotion/coupon/index', 'PromotionCoupon', 0, '1', '1', '1', '', '2022-11-03 23:21:31', '1', '2023-10-03 12:55:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2039, '优惠劵查询', 'promotion:coupon:query', 3, 1, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2040, '优惠劵删除', 'promotion:coupon:delete', 3, 4, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2041, '满减送', '', 2, 10, 2390, 'reward-activity', 'ep:goblet-square-full', 'mall/promotion/rewardActivity/index', 'PromotionRewardActivity', 0, '1', '1', '1', '', '2022-11-04 23:47:49', '1', '2023-10-21 19:24:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2042, '满减送活动查询', 'promotion:reward-activity:query', 3, 1, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2043, '满减送活动创建', 'promotion:reward-activity:create', 3, 2, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2044, '满减送活动更新', 'promotion:reward-activity:update', 3, 3, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2045, '满减送活动删除', 'promotion:reward-activity:delete', 3, 4, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2047, '限时折扣', '', 2, 7, 2390, 'discount-activity', 'ep:timer', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, '1', '1', '1', '', '2022-11-05 17:12:15', '1', '2023-10-21 19:24:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, '1', '1', '1', '', '2022-11-06 22:24:49', '1', '2023-06-24 18:57:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, '1', '1', '1', '', '2022-11-15 19:46:50', '1', '2023-06-24 18:57:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:48:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2072, '订单中心', '', 1, 65, 2362, 'trade', 'ep:eleme', NULL, NULL, 0, '1', '1', '1', '1', '2022-11-19 18:57:19', '1', '2023-09-30 11:54:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2073, '售后退款', '', 2, 2, 2072, 'after-sale', 'ep:refrigerator', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, '1', '1', '1', '', '2022-11-19 20:15:32', '1', '2023-10-01 21:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2075, '秒杀活动关闭', 'promotion:seckill-activity:close', 3, 5, 2059, '', '', '', '', 0, '1', '1', '1', '1', '2022-11-28 20:20:15', '1', '2023-10-03 18:34:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2076, '订单列表', '', 2, 1, 2072, 'order', 'ep:list', 'mall/trade/order/index', 'TradeOrder', 0, '1', '1', '1', '1', '2022-12-10 21:05:44', '1', '2023-10-01 21:42:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, '1', '1', '1', '1', '2022-12-23 17:35:05', '1', '2024-02-29 08:50:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'ep:compass', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-01 20:11:04', '1', '2024-02-29 12:39:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'fa:user', 'mp/account/index', 'MpAccount', 0, '1', '1', '1', '1', '2023-01-01 20:13:31', '1', '2024-02-29 12:42:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2086, '新增账号', 'mp:account:create', 3, 1, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-01 20:21:40', '1', '2023-01-07 17:32:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2087, '修改账号', 'mp:account:update', 3, 2, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:32:46', '1', '2023-01-07 17:32:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2088, '查询账号', 'mp:account:query', 3, 0, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:07', '1', '2023-01-07 17:33:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2089, '删除账号', 'mp:account:delete', 3, 3, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:21', '1', '2023-01-07 17:33:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2090, '生成二维码', 'mp:account:qr-code', 3, 4, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:58', '1', '2023-01-07 17:33:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2091, '清空 API 配额', 'mp:account:clear-quota', 3, 5, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 18:20:32', '1', '2023-01-07 18:20:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2092, '数据统计', 'mp:statistics:query', 2, 2, 2084, 'statistics', 'ep:trend-charts', 'mp/statistics/index', 'MpStatistics', 0, '1', '1', '1', '1', '2023-01-07 20:17:36', '1', '2024-02-29 12:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2093, '标签管理', '', 2, 3, 2084, 'tag', 'ep:collection-tag', 'mp/tag/index', 'MpTag', 0, '1', '1', '1', '1', '2023-01-08 11:37:32', '1', '2024-02-29 12:42:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2094, '查询标签', 'mp:tag:query', 3, 0, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:03', '1', '2023-01-08 11:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2095, '新增标签', 'mp:tag:create', 3, 1, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:23', '1', '2023-01-08 11:59:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2096, '修改标签', 'mp:tag:update', 3, 2, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:41', '1', '2023-01-08 11:59:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2097, '删除标签', 'mp:tag:delete', 3, 3, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:04', '1', '2023-01-08 12:00:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2098, '同步标签', 'mp:tag:sync', 3, 4, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:29', '1', '2023-01-08 12:00:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2099, '粉丝管理', '', 2, 4, 2084, 'user', 'fa:user-secret', 'mp/user/index', 'MpUser', 0, '1', '1', '1', '1', '2023-01-08 16:51:20', '1', '2024-02-29 12:42:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2100, '查询粉丝', 'mp:user:query', 3, 0, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:16:59', '1', '2023-01-08 17:17:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2101, '修改粉丝', 'mp:user:update', 3, 1, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:11', '1', '2023-01-08 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2102, '同步粉丝', 'mp:user:sync', 3, 2, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:40', '1', '2023-01-08 17:17:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2103, '消息管理', '', 2, 5, 2084, 'message', 'ep:message', 'mp/message/index', 'MpMessage', 0, '1', '1', '1', '1', '2023-01-08 18:44:19', '1', '2024-02-29 12:42:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2104, '图文发表记录', '', 2, 10, 2084, 'free-publish', 'ep:edit-pen', 'mp/freePublish/index', 'MpFreePublish', 0, '1', '1', '1', '1', '2023-01-13 00:30:50', '1', '2024-02-29 12:43:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2105, '查询发布列表', 'mp:free-publish:query', 3, 1, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:17', '1', '2023-01-13 07:19:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2106, '发布草稿', 'mp:free-publish:submit', 3, 2, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:46', '1', '2023-01-13 07:19:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2107, '删除发布记录', 'mp:free-publish:delete', 3, 3, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:20:01', '1', '2023-01-13 07:20:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2108, '图文草稿箱', '', 2, 9, 2084, 'draft', 'ep:edit', 'mp/draft/index', 'MpDraft', 0, '1', '1', '1', '1', '2023-01-13 07:40:21', '1', '2024-02-29 12:43:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2109, '新建草稿', 'mp:draft:create', 3, 1, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 23:15:30', '1', '2023-01-13 23:15:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2110, '修改草稿', 'mp:draft:update', 3, 2, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:08:47', '1', '2023-01-14 10:08:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2111, '查询草稿', 'mp:draft:query', 3, 0, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:01', '1', '2023-01-14 10:09:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2112, '删除草稿', 'mp:draft:delete', 3, 3, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:19', '1', '2023-01-14 10:09:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2113, '素材管理', '', 2, 8, 2084, 'material', 'ep:basketball', 'mp/material/index', 'MpMaterial', 0, '1', '1', '1', '1', '2023-01-14 14:12:07', '1', '2024-02-29 12:43:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2114, '上传临时素材', 'mp:material:upload-temporary', 3, 1, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:33:55', '1', '2023-01-14 15:33:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2115, '上传永久素材', 'mp:material:upload-permanent', 3, 2, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:34:14', '1', '2023-01-14 15:34:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2116, '删除素材', 'mp:material:delete', 3, 3, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:35:37', '1', '2023-01-14 15:35:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2117, '上传图文图片', 'mp:material:upload-news-image', 3, 4, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:36:31', '1', '2023-01-14 15:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2118, '查询素材', 'mp:material:query', 3, 5, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:39:22', '1', '2023-01-14 15:39:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2119, '菜单管理', '', 2, 6, 2084, 'menu', 'ep:menu', 'mp/menu/index', 'MpMenu', 0, '1', '1', '1', '1', '2023-01-14 17:43:54', '1', '2024-02-29 12:42:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2120, '自动回复', '', 2, 7, 2084, 'auto-reply', 'fa-solid:republican', 'mp/autoReply/index', 'MpAutoReply', 0, '1', '1', '1', '1', '2023-01-15 22:13:09', '1', '2024-02-29 12:43:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2121, '查询回复', 'mp:auto-reply:query', 3, 0, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:41', '1', '2023-01-16 22:28:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2122, '新增回复', 'mp:auto-reply:create', 3, 1, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:54', '1', '2023-01-16 22:28:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2123, '修改回复', 'mp:auto-reply:update', 3, 2, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:05', '1', '2023-01-16 22:29:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2124, '删除回复', 'mp:auto-reply:delete', 3, 3, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:34', '1', '2023-01-16 22:29:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2125, '查询菜单', 'mp:menu:query', 3, 0, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:05:41', '1', '2023-01-17 23:05:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2126, '保存菜单', 'mp:menu:save', 3, 1, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:01', '1', '2023-01-17 23:06:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2127, '删除菜单', 'mp:menu:delete', 3, 2, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:16', '1', '2023-01-17 23:06:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2128, '查询消息', 'mp:message:query', 3, 0, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:14', '1', '2023-01-17 23:07:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2129, '发送消息', 'mp:message:send', 3, 1, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:26', '1', '2023-01-17 23:07:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2130, '邮箱管理', '', 2, 2, 2739, 'mail', 'fa-solid:mail-bulk', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-25 17:27:44', '1', '2024-04-22 23:56:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'fa:universal-access', 'system/mail/account/index', 'SystemMailAccount', 0, '1', '1', '1', '', '2023-01-25 09:33:48', '1', '2024-02-29 08:48:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'fa:tag', 'system/mail/template/index', 'SystemMailTemplate', 0, '1', '1', '1', '', '2023-01-25 12:05:31', '1', '2024-02-29 08:48:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'fa:edit', 'system/mail/log/index', 'SystemMailLog', 0, '1', '1', '1', '', '2023-01-26 02:16:50', '1', '2024-02-29 08:48:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-26 02:16:50', '', '2023-01-26 02:16:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-26 23:29:15', '1', '2023-01-26 23:29:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2144, '站内信管理', '', 1, 3, 2739, 'notify', 'ep:message-box', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-28 10:25:18', '1', '2024-04-22 23:56:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'fa:archive', 'system/notify/template/index', 'SystemNotifyTemplate', 0, '1', '1', '1', '', '2023-01-28 02:26:42', '1', '2024-02-29 08:49:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-28 10:54:43', '1', '2023-01-28 10:54:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'fa:edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, '1', '1', '1', '', '2023-01-28 04:28:22', '1', '2024-02-29 08:49:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 04:28:22', '', '2023-01-28 04:28:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'JimuReport', 0, '1', '1', '1', '1', '2023-02-07 00:03:19', '1', '2024-02-29 12:34:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:14', '1', '2023-02-07 19:25:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2155, '更新项目', 'report:go-view-project:update', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2023-02-07 19:25:34', '1', '2024-04-24 20:01:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:46:28', '1', '2023-12-02 21:32:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, '1', '1', '1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2164, '配送管理', '', 1, 3, 2072, 'delivery', 'ep:shopping-cart', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:18:02', '1', '2023-09-28 10:58:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', 'ep:bicycle', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:22:06', '1', '2023-08-30 21:02:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', 'ep:add-location', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:23:14', '1', '2023-08-30 21:03:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', 'ep:compass', 'mall/trade/delivery/express/index', 'Express', 0, '1', '1', '1', '1', '2023-05-18 09:27:21', '1', '2023-08-30 21:02:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', 'ep:coordinate', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, '1', '1', '1', '1', '2023-05-20 06:48:10', '1', '2023-08-30 21:03:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', 'ep:basketball', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, '1', '1', '1', '1', '2023-05-25 10:50:00', '1', '2023-08-30 21:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, '1', '1', '1', '1', '2023-06-24 17:39:13', '1', '2023-06-24 18:55:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'ep:bicycle', NULL, NULL, 0, '1', '1', '1', '1', '2023-06-10 00:42:03', '1', '2023-08-20 09:23:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2275, '会员配置', '', 2, 0, 2262, 'config', 'fa:archive', 'member/config/index', 'MemberConfig', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2023-10-01 23:41:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2276, '会员配置查询', 'member:config:query', 3, 1, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:48:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2277, '会员配置保存', 'member:config:save', 3, 2, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:49:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2281, '签到配置', '', 2, 2, 2300, 'config', 'ep:calendar', 'member/signin/config/index', 'SignInConfig', 0, '1', '1', '1', '', '2023-06-10 03:26:12', '1', '2023-08-20 19:25:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2287, '会员积分', '', 2, 10, 2262, 'record', 'fa:asterisk', 'member/point/record/index', 'PointRecord', 0, '1', '1', '1', '', '2023-06-10 04:18:50', '1', '2023-10-01 23:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:18:50', '', '2023-06-10 04:18:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2293, '签到记录', '', 2, 3, 2300, 'record', 'ep:chicken', 'member/signin/record/index', 'SignInRecord', 0, '1', '1', '1', '', '2023-06-10 04:48:22', '1', '2023-08-20 19:26:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2300, '会员签到', '', 1, 11, 2262, 'signin', 'ep:alarm-clock', '', '', 0, '1', '1', '1', '1', '2023-06-27 22:49:53', '1', '2023-08-20 09:23:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2301, '回调通知', '', 2, 5, 1117, 'notify', 'ep:mute-notification', 'pay/notify/index', 'PayNotify', 0, '1', '1', '1', '', '2023-07-20 04:41:32', '1', '2024-01-18 23:56:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2302, '支付通知查询', 'pay:notify:query', 3, 1, 2301, '', '', '', NULL, 0, '1', '1', '1', '', '2023-07-20 04:41:32', '', '2023-07-20 04:41:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2303, '拼团活动', '', 2, 3, 2030, 'combination', 'fa:group', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:19:54', '1', '2023-08-12 17:20:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2304, '拼团商品', '', 2, 1, 2303, 'acitivity', 'ep:apple', 'mall/promotion/combination/activity/index', 'PromotionCombinationActivity', 0, '1', '1', '1', '1', '2023-08-12 17:22:03', '1', '2023-08-12 17:22:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2305, '拼团活动查询', 'promotion:combination-activity:query', 3, 1, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:32', '1', '2023-11-24 11:57:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2306, '拼团活动创建', 'promotion:combination-activity:create', 3, 2, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:49', '1', '2023-08-12 17:54:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2307, '拼团活动更新', 'promotion:combination-activity:update', 3, 3, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:04', '1', '2023-08-12 17:55:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2308, '拼团活动删除', 'promotion:combination-activity:delete', 3, 4, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:23', '1', '2023-08-12 17:55:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2309, '拼团活动关闭', 'promotion:combination-activity:close', 3, 5, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:37', '1', '2023-10-06 10:51:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2310, '砍价活动', '', 2, 4, 2030, 'bargain', 'ep:box', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:27:25', '1', '2023-08-13 00:27:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2311, '砍价商品', '', 2, 1, 2310, 'activity', 'ep:burger', 'mall/promotion/bargain/activity/index', 'PromotionBargainActivity', 0, '1', '1', '1', '1', '2023-08-13 00:28:49', '1', '2023-10-05 01:16:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2312, '砍价活动查询', 'promotion:bargain-activity:query', 3, 1, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:30', '1', '2023-08-13 00:32:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2313, '砍价活动创建', 'promotion:bargain-activity:create', 3, 2, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:44', '1', '2023-08-13 00:32:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2314, '砍价活动更新', 'promotion:bargain-activity:update', 3, 3, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:55', '1', '2023-08-13 00:32:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2315, '砍价活动删除', 'promotion:bargain-activity:delete', 3, 4, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:34:50', '1', '2023-08-13 00:34:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2316, '砍价活动关闭', 'promotion:bargain-activity:close', 3, 5, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:35:02', '1', '2023-08-13 00:35:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2317, '会员管理', '', 2, 0, 2262, 'user', 'ep:avatar', 'member/user/index', 'MemberUser', 0, '1', '1', '1', '', '2023-08-19 04:12:15', '1', '2023-08-24 00:50:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2318, '会员用户查询', 'member:user:query', 3, 1, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2319, '会员用户更新', 'member:user:update', 3, 3, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2320, '会员标签', '', 2, 1, 2262, 'tag', 'ep:collection-tag', 'member/tag/index', 'MemberTag', 0, '1', '1', '1', '', '2023-08-20 01:03:08', '1', '2023-08-20 09:23:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2321, '会员标签查询', 'member:tag:query', 3, 1, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2322, '会员标签创建', 'member:tag:create', 3, 2, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2323, '会员标签更新', 'member:tag:update', 3, 3, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2324, '会员标签删除', 'member:tag:delete', 3, 4, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2325, '会员等级', '', 2, 2, 2262, 'level', 'fa:level-up', 'member/level/index', 'MemberLevel', 0, '1', '1', '1', '', '2023-08-22 12:41:01', '1', '2023-08-22 21:47:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2326, '会员等级查询', 'member:level:query', 3, 1, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2327, '会员等级创建', 'member:level:create', 3, 2, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2328, '会员等级更新', 'member:level:update', 3, 3, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2329, '会员等级删除', 'member:level:delete', 3, 4, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2330, '会员分组', '', 2, 3, 2262, 'group', 'fa:group', 'member/group/index', 'MemberGroup', 0, '1', '1', '1', '', '2023-08-22 13:50:06', '1', '2023-10-01 23:42:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2331, '用户分组查询', 'member:group:query', 3, 1, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2332, '用户分组创建', 'member:group:create', 3, 2, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2333, '用户分组更新', 'member:group:update', 3, 3, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2334, '用户分组删除', 'member:group:delete', 3, 4, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2335, '用户等级修改', 'member:user:update-level', 3, 5, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-23 16:49:05', '', '2023-08-23 16:50:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2336, '商品评论', '', 2, 5, 2000, 'comment', 'ep:comment', 'mall/product/comment/index', 'ProductComment', 0, '1', '1', '1', '1', '2023-08-26 11:03:00', '1', '2023-08-26 11:03:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2337, '评论查询', 'product:comment:query', 3, 1, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:01', '1', '2023-08-26 11:04:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2338, '添加自评', 'product:comment:create', 3, 2, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:23', '1', '2023-08-26 11:08:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2339, '商家回复', 'product:comment:update', 3, 3, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:37', '1', '2023-08-26 11:04:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2340, '显隐评论', 'product:comment:update', 3, 4, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:55', '1', '2023-08-26 11:04:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2341, '优惠劵发送', 'promotion:coupon:send', 3, 2, 2038, '', '', '', '', 0, '1', '1', '1', '1', '2023-09-02 00:03:14', '1', '2023-09-02 00:03:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2342, '交易配置', '', 2, 0, 2072, 'config', 'ep:setting', 'mall/trade/config/index', 'TradeConfig', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:30:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2343, '交易中心配置查询', 'trade:config:query', 3, 1, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2344, '交易中心配置保存', 'trade:config:save', 3, 2, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2345, '分销管理', '', 1, 4, 2072, 'brokerage', 'fa-solid:project-diagram', '', '', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2023-09-28 10:58:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2346, '分销用户', '', 2, 0, 2345, 'brokerage-user', 'fa-solid:user-tie', 'mall/trade/brokerage/user/index', 'TradeBrokerageUser', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2347, '分销用户查询', 'trade:brokerage-user:query', 3, 1, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2348, '分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2349, '分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2350, '分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2351, '分销用户修改推广员', 'trade:brokerage-user:update-bind-user', 3, 5, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2352, '分销用户清除推广员', 'trade:brokerage-user:clear-bind-user', 3, 6, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2353, '佣金记录', '', 2, 1, 2345, 'brokerage-record', 'fa:money', 'mall/trade/brokerage/record/index', 'TradeBrokerageRecord', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2354, '佣金记录查询', 'trade:brokerage-record:query', 3, 1, 2353, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2355, '佣金提现', '', 2, 2, 2345, 'brokerage-withdraw', 'fa:credit-card', 'mall/trade/brokerage/withdraw/index', 'TradeBrokerageWithdraw', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2356, '佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2357, '佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2358, '统计中心', '', 1, 75, 2362, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2023-09-30 11:54:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2359, '交易统计', '', 2, 4, 2358, 'trade', 'fa-solid:credit-card', 'mall/statistics/trade/index', 'TradeStatistics', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2024-02-26 20:42:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2360, '交易统计查询', 'statistics:trade:query', 3, 1, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2361, '交易统计导出', 'statistics:trade:export', 3, 2, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2362, '商城系统', '', 1, 59, 0, '/mall', 'ep:shop', '', '', 0, '1', '1', '1', '1', '2023-09-30 11:52:02', '1', '2023-09-30 11:52:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2363, '用户积分修改', 'member:user:update-point', 3, 6, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-01 14:39:43', '', '2023-10-01 14:39:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2364, '用户余额修改', 'member:user:update-balance', 3, 7, 2317, '', '', '', '', 0, '1', '1', '1', '', '2023-10-01 14:39:43', '1', '2023-10-01 22:42:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2365, '优惠劵', '', 1, 2, 2030, 'coupon', 'fa-solid:disease', '', '', 0, '1', '1', '1', '1', '2023-10-03 12:39:15', '1', '2023-10-05 00:16:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2366, '砍价记录', '', 2, 2, 2310, 'record', 'ep:list', 'mall/promotion/bargain/record/index', 'PromotionBargainRecord', 0, '1', '1', '1', '', '2023-10-05 02:49:06', '1', '2023-10-05 10:50:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2367, '砍价记录查询', 'promotion:bargain-record:query', 3, 1, 2366, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-05 02:49:06', '', '2023-10-05 02:49:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2368, '助力记录查询', 'promotion:bargain-help:query', 3, 2, 2366, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-05 12:27:49', '1', '2023-10-05 12:27:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2369, '拼团记录', 'promotion:combination-record:query', 2, 2, 2303, 'record', 'ep:avatar', 'mall/promotion/combination/record/index.vue', 'PromotionCombinationRecord', 0, '1', '1', '1', '1', '2023-10-08 07:10:22', '1', '2023-10-08 07:34:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2374, '会员统计', '', 2, 2, 2358, 'member', 'ep:avatar', 'mall/statistics/member/index', 'MemberStatistics', 0, '1', '1', '1', '', '2023-10-11 04:39:24', '1', '2024-02-26 20:41:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2375, '会员统计查询', 'statistics:member:query', 3, 1, 2374, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-11 04:39:24', '', '2023-10-11 04:39:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2376, '订单核销', 'trade:order:pick-up', 3, 10, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-14 17:11:58', '1', '2023-10-14 17:11:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2377, '文章分类', '', 2, 0, 2387, 'article/category', 'fa:certificate', 'mall/promotion/article/category/index', 'ArticleCategory', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:38:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2378, '分类查询', 'promotion:article-category:query', 3, 1, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2379, '分类创建', 'promotion:article-category:create', 3, 2, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2380, '分类更新', 'promotion:article-category:update', 3, 3, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2381, '分类删除', 'promotion:article-category:delete', 3, 4, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2382, '文章列表', '', 2, 2, 2387, 'article', 'ep:connection', 'mall/promotion/article/index', 'Article', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:41:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2383, '文章管理查询', 'promotion:article:query', 3, 1, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2384, '文章管理创建', 'promotion:article:create', 3, 2, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2385, '文章管理更新', 'promotion:article:update', 3, 3, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2386, '文章管理删除', 'promotion:article:delete', 3, 4, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2387, '内容管理', '', 1, 1, 2030, 'content', 'ep:collection', '', '', 0, '1', '1', '1', '1', '2023-10-16 09:37:31', '1', '2023-10-16 09:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2388, '商城首页', '', 2, 1, 2362, 'home', 'ep:home-filled', 'mall/home/index', 'MallHome', 0, '1', '1', '1', '', '2023-10-16 12:10:33', '', '2023-10-16 12:10:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2389, '核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder', 0, '1', '1', '1', '', '2023-10-19 16:09:51', '', '2023-10-19 16:09:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2390, '优惠活动', '', 1, 99, 2030, 'youhui', 'ep:aim', '', '', 0, '1', '1', '1', '1', '2023-10-21 19:23:49', '1', '2023-10-21 19:23:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2391, '客户管理', '', 2, 10, 2397, 'customer', 'fa:address-book-o', 'crm/customer/index', 'CrmCustomer', 0, '1', '1', '1', '', '2023-10-29 09:04:21', '1', '2024-02-17 17:13:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2392, '客户查询', 'crm:customer:query', 3, 1, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2393, '客户创建', 'crm:customer:create', 3, 2, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2394, '客户更新', 'crm:customer:update', 3, 3, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2395, '客户删除', 'crm:customer:delete', 3, 4, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2396, '客户导出', 'crm:customer:export', 3, 5, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2397, 'CRM 系统', '', 1, 200, 0, '/crm', 'ep:avatar', '', '', 0, '1', '1', '1', '1', '2023-10-29 17:08:30', '1', '2024-02-04 15:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2398, '合同管理', '', 2, 50, 2397, 'contract', 'ep:notebook', 'crm/contract/index', 'CrmContract', 0, '1', '1', '1', '', '2023-10-29 10:50:41', '1', '2024-02-17 17:15:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2399, '合同查询', 'crm:contract:query', 3, 1, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2400, '合同创建', 'crm:contract:create', 3, 2, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2401, '合同更新', 'crm:contract:update', 3, 3, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2402, '合同删除', 'crm:contract:delete', 3, 4, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2403, '合同导出', 'crm:contract:export', 3, 5, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2404, '线索管理', '', 2, 8, 2397, 'clue', 'fa:pagelines', 'crm/clue/index', 'CrmClue', 0, '1', '1', '1', '', '2023-10-29 11:06:29', '1', '2024-02-17 17:15:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2405, '线索查询', 'crm:clue:query', 3, 1, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2406, '线索创建', 'crm:clue:create', 3, 2, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2407, '线索更新', 'crm:clue:update', 3, 3, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2408, '线索删除', 'crm:clue:delete', 3, 4, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2409, '线索导出', 'crm:clue:export', 3, 5, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2410, '商机管理', '', 2, 40, 2397, 'business', 'fa:bus', 'crm/business/index', 'CrmBusiness', 0, '1', '1', '1', '', '2023-10-29 11:12:35', '1', '2024-02-17 17:14:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2411, '商机查询', 'crm:business:query', 3, 1, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2412, '商机创建', 'crm:business:create', 3, 2, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2413, '商机更新', 'crm:business:update', 3, 3, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2414, '商机删除', 'crm:business:delete', 3, 4, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2415, '商机导出', 'crm:business:export', 3, 5, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2416, '联系人管理', '', 2, 20, 2397, 'contact', 'fa:address-book-o', 'crm/contact/index', 'CrmContact', 0, '1', '1', '1', '', '2023-10-29 11:14:56', '1', '2024-02-17 17:13:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2417, '联系人查询', 'crm:contact:query', 3, 1, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2418, '联系人创建', 'crm:contact:create', 3, 2, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2419, '联系人更新', 'crm:contact:update', 3, 3, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2420, '联系人删除', 'crm:contact:delete', 3, 4, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2421, '联系人导出', 'crm:contact:export', 3, 5, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2422, '回款管理', '', 2, 60, 2397, 'receivable', 'ep:money', 'crm/receivable/index', 'CrmReceivable', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2423, '回款管理查询', 'crm:receivable:query', 3, 1, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2424, '回款管理创建', 'crm:receivable:create', 3, 2, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2425, '回款管理更新', 'crm:receivable:update', 3, 3, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2426, '回款管理删除', 'crm:receivable:delete', 3, 4, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2427, '回款管理导出', 'crm:receivable:export', 3, 5, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2428, '回款计划', '', 2, 61, 2397, 'receivable-plan', 'fa:money', 'crm/receivable/plan/index', 'CrmReceivablePlan', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2429, '回款计划查询', 'crm:receivable-plan:query', 3, 1, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2430, '回款计划创建', 'crm:receivable-plan:create', 3, 2, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2431, '回款计划更新', 'crm:receivable-plan:update', 3, 3, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2432, '回款计划删除', 'crm:receivable-plan:delete', 3, 4, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2433, '回款计划导出', 'crm:receivable-plan:export', 3, 5, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2435, '商城装修', '', 2, 20, 2030, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2436, '装修模板', '', 2, 1, 2435, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2437, '装修模板查询', 'promotion:diy-template:query', 3, 1, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2438, '装修模板创建', 'promotion:diy-template:create', 3, 2, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2439, '装修模板更新', 'promotion:diy-template:update', 3, 3, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2440, '装修模板删除', 'promotion:diy-template:delete', 3, 4, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2441, '装修模板使用', 'promotion:diy-template:use', 3, 5, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2442, '装修页面', '', 2, 2, 2435, 'diy-page', 'foundation:page-edit', 'mall/promotion/diy/page/index', 'DiyPage', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2443, '装修页面查询', 'promotion:diy-page:query', 3, 1, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2444, '装修页面创建', 'promotion:diy-page:create', 3, 2, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2445, '装修页面更新', 'promotion:diy-page:update', 3, 3, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2446, '装修页面删除', 'promotion:diy-page:delete', 3, 4, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2447, '三方登录', '', 1, 10, 1, 'social', 'fa:rocket', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:12:01', '1', '2024-02-29 01:14:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2448, '三方应用', '', 2, 1, 2447, 'client', 'ep:set-up', 'views/system/social/client/index.vue', 'SocialClient', 0, '1', '1', '1', '1', '2023-11-04 12:17:19', '1', '2023-11-04 12:17:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2449, '三方应用查询', 'system:social-client:query', 3, 1, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:12', '1', '2023-11-04 12:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2450, '三方应用创建', 'system:social-client:create', 3, 2, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:58', '1', '2023-11-04 12:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2451, '三方应用更新', 'system:social-client:update', 3, 3, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:27', '1', '2023-11-04 12:44:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2452, '三方应用删除', 'system:social-client:delete', 3, 4, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:43', '1', '2023-11-04 12:44:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2453, '三方用户', 'system:social-user:query', 2, 2, 2447, 'user', 'ep:avatar', 'system/social/user/index.vue', 'SocialUser', 0, '1', '1', '1', '1', '2023-11-04 14:01:05', '1', '2023-11-04 14:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, '1', '1', '1', '', '2023-11-13 04:39:51', '1', '2023-11-16 23:53:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, '1', '1', '1', '', '2023-11-15 14:42:30', '1', '2023-11-16 20:34:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, '1', '1', '1', '', '2023-11-16 12:18:27', '1', '2023-11-16 20:35:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, '1', '1', '1', '', '2023-11-16 12:53:37', '1', '2023-11-16 23:10:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2497, '主子表(ERP)', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, '1', '1', '1', '', '2023-11-16 15:50:59', '1', '2023-11-17 13:19:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2516, '客户公海配置', '', 2, 0, 2524, 'customer-pool-config', 'ep:data-analysis', 'crm/customer/poolConfig/index', 'CrmCustomerPoolConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:31', '1', '2024-01-03 19:52:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2517, '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, 2516, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:31', '', '2023-11-18 13:33:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2518, '客户限制配置', '', 2, 1, 2524, 'customer-limit-config', 'ep:avatar', 'crm/customer/limitConfig/index', 'CrmCustomerLimitConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:53', '1', '2024-02-24 16:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2519, '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2520, '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2521, '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2522, '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2523, '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2524, '系统配置', '', 1, 999, 2397, 'config', 'ep:connection', '', '', 0, '1', '1', '1', '1', '2023-11-18 21:58:00', '1', '2024-02-17 17:14:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, '1', '1', '1', '1', '2023-11-23 19:41:55', '1', '2024-04-23 00:02:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2526, '产品管理', '', 2, 80, 2397, 'product', 'fa:product-hunt', 'crm/product/index', 'CrmProduct', 0, '1', '1', '1', '1', '2023-12-05 22:45:26', '1', '2024-02-20 20:36:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2527, '产品查询', 'crm:product:query', 3, 1, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:16', '1', '2023-12-05 22:47:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2528, '产品创建', 'crm:product:create', 3, 2, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:41', '1', '2023-12-05 22:47:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2529, '产品更新', 'crm:product:update', 3, 3, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:03', '1', '2023-12-05 22:48:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2530, '产品删除', 'crm:product:delete', 3, 4, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:17', '1', '2023-12-05 22:48:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2531, '产品导出', 'crm:product:export', 3, 5, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:29', '1', '2023-12-05 22:48:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2532, '产品分类配置', '', 2, 3, 2524, 'product/category', 'fa-solid:window-restore', 'crm/product/category/index', 'CrmProductCategory', 0, '1', '1', '1', '1', '2023-12-06 12:52:36', '1', '2023-12-06 12:52:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2533, '产品分类查询', 'crm:product-category:query', 3, 1, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:23', '1', '2023-12-06 12:53:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2534, '产品分类创建', 'crm:product-category:create', 3, 2, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:41', '1', '2023-12-06 12:53:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2535, '产品分类更新', 'crm:product-category:update', 3, 3, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:59', '1', '2023-12-06 12:53:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2536, '产品分类删除', 'crm:product-category:delete', 3, 4, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:54:14', '1', '2023-12-06 12:54:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2543, '关联商机', 'crm:contact:create-business', 3, 10, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:25', '1', '2024-01-02 17:28:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2544, '取关商机', 'crm:contact:delete-business', 3, 11, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:43', '1', '2024-01-02 17:28:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2545, '商品统计', '', 2, 3, 2358, 'product', 'fa:product-hunt', 'mall/statistics/product/index', 'ProductStatistics', 0, '1', '1', '1', '', '2023-12-15 18:54:28', '1', '2024-02-26 20:41:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2546, '客户公海', '', 2, 30, 2397, 'customer/pool', 'fa-solid:swimming-pool', 'crm/customer/pool/index', 'CrmCustomerPool', 0, '1', '1', '1', '1', '2024-01-15 21:29:34', '1', '2024-02-17 17:14:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2547, '订单查询', 'trade:order:query', 3, 1, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:00', '1', '2024-01-16 08:52:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2548, '订单更新', 'trade:order:update', 3, 2, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:21', '1', '2024-01-16 08:52:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2549, '支付&退款案例', '', 2, 1, 2161, 'order', 'fa:paypal', 'pay/demo/order/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:45:00', '1', '2024-01-18 23:47:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2550, '转账案例', '', 2, 2, 2161, 'transfer', 'fa:transgender-alt', 'pay/demo/transfer/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:51:16', '1', '2024-01-18 23:51:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2551, '钱包管理', '', 1, 4, 1117, 'wallet', 'ep:wallet', '', '', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '1', '2024-02-29 08:58:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2552, '充值套餐', '', 2, 2, 2551, 'wallet-recharge-package', 'fa:leaf', 'pay/wallet/rechargePackage/index', 'WalletRechargePackage', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2553, '钱包充值套餐查询', 'pay:wallet-recharge-package:query', 3, 1, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2554, '钱包充值套餐创建', 'pay:wallet-recharge-package:create', 3, 2, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2555, '钱包充值套餐更新', 'pay:wallet-recharge-package:update', 3, 3, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2556, '钱包充值套餐删除', 'pay:wallet-recharge-package:delete', 3, 4, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2557, '钱包余额', '', 2, 1, 2551, 'wallet-balance', 'fa:leaf', 'pay/wallet/balance/index', 'WalletBalance', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2558, '钱包余额查询', 'pay:wallet:query', 3, 1, 2557, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2559, '转账订单', '', 2, 3, 1117, 'transfer', 'ep:credit-card', 'pay/transfer/index', 'PayTransfer', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2560, '数据统计', '', 1, 200, 2397, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '1', '2024-01-26 22:50:35', '1', '2024-02-24 20:10:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2561, '排行榜', 'crm:statistics-rank:query', 2, 1, 2560, 'ranking', 'fa:area-chart', 'crm/statistics/rank/index', 'CrmStatisticsRank', 0, '1', '1', '1', '1', '2024-01-26 22:52:09', '1', '2024-04-24 19:39:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2562, '客户导入', 'crm:customer:import', 3, 6, 2391, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-01 13:09:00', '1', '2024-02-01 13:09:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2563, 'ERP 系统', '', 1, 300, 0, '/erp', 'fa-solid:store', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:37:25', '1', '2024-02-04 15:37:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2564, '产品管理', '', 1, 40, 2563, 'product', 'fa:product-hunt', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:38:43', '1', '2024-02-04 15:38:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2565, '产品信息', '', 2, 0, 2564, 'product', 'fa-solid:apple-alt', 'erp/product/product/index', 'ErpProduct', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-05 14:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2566, '产品查询', 'erp:product:query', 3, 1, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:21:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2567, '产品创建', 'erp:product:create', 3, 2, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2568, '产品更新', 'erp:product:update', 3, 3, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2569, '产品删除', 'erp:product:delete', 3, 4, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2570, '产品导出', 'erp:product:export', 3, 5, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2571, '产品分类', '', 2, 1, 2564, 'product-category', 'fa:certificate', 'erp/product/category/index', 'ErpProductCategory', 0, '1', '1', '1', '', '2024-02-04 09:21:04', '1', '2024-02-04 17:24:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2572, '分类查询', 'erp:product-category:query', 3, 1, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2573, '分类创建', 'erp:product-category:create', 3, 2, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2574, '分类更新', 'erp:product-category:update', 3, 3, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2575, '分类删除', 'erp:product-category:delete', 3, 4, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2576, '分类导出', 'erp:product-category:export', 3, 5, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2577, '产品单位', '', 2, 2, 2564, 'unit', 'ep:opportunity', 'erp/product/unit/index', 'ErpProductUnit', 0, '1', '1', '1', '', '2024-02-04 11:54:08', '1', '2024-02-04 19:54:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2578, '单位查询', 'erp:product-unit:query', 3, 1, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2579, '单位创建', 'erp:product-unit:create', 3, 2, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2580, '单位更新', 'erp:product-unit:update', 3, 3, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2581, '单位删除', 'erp:product-unit:delete', 3, 4, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2582, '单位导出', 'erp:product-unit:export', 3, 5, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2583, '库存管理', '', 1, 30, 2563, 'stock', 'fa:window-restore', '', '', 0, '1', '1', '1', '1', '2024-02-05 00:29:37', '1', '2024-02-05 00:29:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2584, '仓库信息', '', 2, 0, 2583, 'warehouse', 'ep:house', 'erp/stock/warehouse/index', 'ErpWarehouse', 0, '1', '1', '1', '', '2024-02-04 17:12:09', '1', '2024-02-05 01:12:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2585, '仓库查询', 'erp:warehouse:query', 3, 1, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2586, '仓库创建', 'erp:warehouse:create', 3, 2, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2587, '仓库更新', 'erp:warehouse:update', 3, 3, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2588, '仓库删除', 'erp:warehouse:delete', 3, 4, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2589, '仓库导出', 'erp:warehouse:export', 3, 5, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2590, '产品库存', '', 2, 1, 2583, 'stock', 'ep:coffee', 'erp/stock/stock/index', 'ErpStock', 0, '1', '1', '1', '', '2024-02-05 06:40:50', '1', '2024-02-05 14:42:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2591, '库存查询', 'erp:stock:query', 3, 1, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2592, '库存导出', 'erp:stock:export', 3, 5, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2593, '出入库明细', '', 2, 2, 2583, 'record', 'fa-solid:blog', 'erp/stock/record/index', 'ErpStockRecord', 0, '1', '1', '1', '', '2024-02-05 10:27:21', '1', '2024-02-06 17:26:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2594, '库存明细查询', 'erp:stock-record:query', 3, 1, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2595, '库存明细导出', 'erp:stock-record:export', 3, 5, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2596, '其它入库', '', 2, 3, 2583, 'in', 'ep:zoom-in', 'erp/stock/in/index', 'ErpStockIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2597, '其它入库单查询', 'erp:stock-in:query', 3, 1, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2598, '其它入库单创建', 'erp:stock-in:create', 3, 2, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2599, '其它入库单更新', 'erp:stock-in:update', 3, 3, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2600, '其它入库单删除', 'erp:stock-in:delete', 3, 4, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2601, '其它入库单导出', 'erp:stock-in:export', 3, 5, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2602, '采购管理', '', 1, 10, 2563, 'purchase', 'fa:buysellads', '', '', 0, '1', '1', '1', '1', '2024-02-06 16:01:01', '1', '2024-02-06 16:01:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2603, '供应商信息', '', 2, 4, 2602, 'supplier', 'fa:superpowers', 'erp/purchase/supplier/index', 'ErpSupplier', 0, '1', '1', '1', '', '2024-02-06 08:21:55', '1', '2024-02-06 16:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2604, '供应商查询', 'erp:supplier:query', 3, 1, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2605, '供应商创建', 'erp:supplier:create', 3, 2, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2606, '供应商更新', 'erp:supplier:update', 3, 3, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2607, '供应商删除', 'erp:supplier:delete', 3, 4, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2608, '供应商导出', 'erp:supplier:export', 3, 5, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2609, '其它入库单审批', 'erp:stock-in:update-status', 3, 6, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2610, '其它出库', '', 2, 4, 2583, 'out', 'ep:zoom-out', 'erp/stock/out/index', 'ErpStockOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2611, '其它出库单查询', 'erp:stock-out:query', 3, 1, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2612, '其它出库单创建', 'erp:stock-out:create', 3, 2, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2613, '其它出库单更新', 'erp:stock-out:update', 3, 3, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2614, '其它出库单删除', 'erp:stock-out:delete', 3, 4, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2615, '其它出库单导出', 'erp:stock-out:export', 3, 5, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2616, '其它出库单审批', 'erp:stock-out:update-status', 3, 6, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2617, '销售管理', '', 1, 20, 2563, 'sale', 'fa:sellsy', '', '', 0, '1', '1', '1', '1', '2024-02-07 15:12:32', '1', '2024-02-07 15:12:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2618, '客户信息', '', 2, 4, 2617, 'customer', 'ep:avatar', 'erp/sale/customer/index', 'ErpCustomer', 0, '1', '1', '1', '', '2024-02-07 07:21:45', '1', '2024-02-07 15:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2619, '客户查询', 'erp:customer:query', 3, 1, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2620, '客户创建', 'erp:customer:create', 3, 2, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2621, '客户更新', 'erp:customer:update', 3, 3, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2622, '客户删除', 'erp:customer:delete', 3, 4, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2623, '客户导出', 'erp:customer:export', 3, 5, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2624, '库存调拨', '', 2, 5, 2583, 'move', 'ep:folder-remove', 'erp/stock/move/index', 'ErpStockMove', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-16 18:53:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2625, '库存调度单查询', 'erp:stock-move:query', 3, 1, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2626, '库存调度单创建', 'erp:stock-move:create', 3, 2, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2627, '库存调度单更新', 'erp:stock-move:update', 3, 3, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2628, '库存调度单删除', 'erp:stock-move:delete', 3, 4, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2629, '库存调度单导出', 'erp:stock-move:export', 3, 5, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2630, '库存调度单审批', 'erp:stock-move:update-status', 3, 6, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2631, '库存盘点', '', 2, 6, 2583, 'check', 'ep:circle-check-filled', 'erp/stock/check/index', 'ErpStockCheck', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-08 08:31:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2632, '库存盘点单查询', 'erp:stock-check:query', 3, 1, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2633, '库存盘点单创建', 'erp:stock-check:create', 3, 2, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2634, '库存盘点单更新', 'erp:stock-check:update', 3, 3, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2635, '库存盘点单删除', 'erp:stock-check:delete', 3, 4, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2636, '库存盘点单导出', 'erp:stock-check:export', 3, 5, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2637, '库存盘点单审批', 'erp:stock-check:update-status', 3, 6, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2638, '销售订单', '', 2, 1, 2617, 'order', 'fa:first-order', 'erp/sale/order/index', 'ErpSaleOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 21:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2639, '销售订单查询', 'erp:sale-order:query', 3, 1, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2640, '销售订单创建', 'erp:sale-order:create', 3, 2, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2641, '销售订单更新', 'erp:sale-order:update', 3, 3, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2642, '销售订单删除', 'erp:sale-order:delete', 3, 4, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2643, '销售订单导出', 'erp:sale-order:export', 3, 5, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2644, '销售订单审批', 'erp:sale-order:update-status', 3, 6, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2645, '财务管理', '', 1, 50, 2563, 'finance', 'ep:money', '', '', 0, '1', '1', '1', '1', '2024-02-10 08:05:58', '1', '2024-02-10 08:06:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2646, '结算账户', '', 2, 10, 2645, 'account', 'fa:universal-access', 'erp/finance/account/index', 'ErpAccount', 0, '1', '1', '1', '', '2024-02-10 00:15:07', '1', '2024-02-14 08:24:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2647, '结算账户查询', 'erp:account:query', 3, 1, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2648, '结算账户创建', 'erp:account:create', 3, 2, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2649, '结算账户更新', 'erp:account:update', 3, 3, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2650, '结算账户删除', 'erp:account:delete', 3, 4, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2651, '结算账户导出', 'erp:account:export', 3, 5, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2652, '销售出库', '', 2, 2, 2617, 'out', 'ep:sold-out', 'erp/sale/out/index', 'ErpSaleOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 22:02:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2653, '销售出库查询', 'erp:sale-out:query', 3, 1, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2654, '销售出库创建', 'erp:sale-out:create', 3, 2, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2655, '销售出库更新', 'erp:sale-out:update', 3, 3, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2656, '销售出库删除', 'erp:sale-out:delete', 3, 4, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2657, '销售出库导出', 'erp:sale-out:export', 3, 5, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2658, '销售出库审批', 'erp:sale-out:update-status', 3, 6, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2659, '销售退货', '', 2, 3, 2617, 'return', 'fa-solid:bone', 'erp/sale/return/index', 'ErpSaleReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 06:12:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2660, '销售退货查询', 'erp:sale-return:query', 3, 1, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2661, '销售退货创建', 'erp:sale-return:create', 3, 2, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2662, '销售退货更新', 'erp:sale-return:update', 3, 3, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2663, '销售退货删除', 'erp:sale-return:delete', 3, 4, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2664, '销售退货导出', 'erp:sale-return:export', 3, 5, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2665, '销售退货审批', 'erp:sale-return:update-status', 3, 6, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2666, '采购订单', '', 2, 1, 2602, 'order', 'fa-solid:border-all', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 08:51:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2667, '采购订单查询', 'erp:purchase-order:query', 3, 1, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2668, '采购订单创建', 'erp:purchase-order:create', 3, 2, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2669, '采购订单更新', 'erp:purchase-order:update', 3, 3, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2670, '采购订单删除', 'erp:purchase-order:delete', 3, 4, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2671, '采购订单导出', 'erp:purchase-order:export', 3, 5, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2672, '采购订单审批', 'erp:purchase-order:update-status', 3, 6, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2673, '采购入库', '', 2, 2, 2602, 'in', 'fa-solid:gopuram', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 11:19:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2674, '采购入库查询', 'erp:purchase-in:query', 3, 1, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2675, '采购入库创建', 'erp:purchase-in:create', 3, 2, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2676, '采购入库更新', 'erp:purchase-in:update', 3, 3, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2677, '采购入库删除', 'erp:purchase-in:delete', 3, 4, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2678, '采购入库导出', 'erp:purchase-in:export', 3, 5, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2679, '采购入库审批', 'erp:purchase-in:update-status', 3, 6, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2680, '采购退货', '', 2, 3, 2602, 'return', 'ep:minus', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 20:51:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2681, '采购退货查询', 'erp:purchase-return:query', 3, 1, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2682, '采购退货创建', 'erp:purchase-return:create', 3, 2, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2683, '采购退货更新', 'erp:purchase-return:update', 3, 3, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2684, '采购退货删除', 'erp:purchase-return:delete', 3, 4, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2685, '采购退货导出', 'erp:purchase-return:export', 3, 5, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2686, '采购退货审批', 'erp:purchase-return:update-status', 3, 6, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2687, '付款单', '', 2, 1, 2645, 'payment', 'ep:caret-right', 'erp/finance/payment/index', 'ErpFinancePayment', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-14 08:24:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2688, '付款单查询', 'erp:finance-payment:query', 3, 1, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2689, '付款单创建', 'erp:finance-payment:create', 3, 2, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2690, '付款单更新', 'erp:finance-payment:update', 3, 3, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2691, '付款单删除', 'erp:finance-payment:delete', 3, 4, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2692, '付款单导出', 'erp:finance-payment:export', 3, 5, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2693, '付款单审批', 'erp:finance-payment:update-status', 3, 6, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2694, '收款单', '', 2, 2, 2645, 'receipt', 'ep:expand', 'erp/finance/receipt/index', 'ErpFinanceReceipt', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-15 19:35:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2695, '收款单查询', 'erp:finance-receipt:query', 3, 1, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2696, '收款单创建', 'erp:finance-receipt:create', 3, 2, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2697, '收款单更新', 'erp:finance-receipt:update', 3, 3, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2698, '收款单删除', 'erp:finance-receipt:delete', 3, 4, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2699, '收款单导出', 'erp:finance-receipt:export', 3, 5, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2700, '收款单审批', 'erp:finance-receipt:update-status', 3, 6, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2701, '待办事项', '', 2, 0, 2397, 'backlog', 'fa-solid:tasks', 'crm/backlog/index', 'CrmBacklog', 0, '1', '1', '1', '1', '2024-02-17 17:17:11', '1', '2024-02-17 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2702, 'ERP 首页', 'erp:statistics:query', 2, 0, 2563, 'home', 'ep:home-filled', 'erp/home/index.vue', 'ErpHome', 0, '1', '1', '1', '1', '2024-02-18 16:49:40', '1', '2024-02-26 21:12:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2703, '商机状态配置', '', 2, 4, 2524, 'business-status', 'fa-solid:charging-station', 'crm/business/status/index', 'CrmBusinessStatus', 0, '1', '1', '1', '1', '2024-02-21 20:15:17', '1', '2024-02-21 20:15:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2704, '商机状态查询', 'crm:business-status:query', 3, 1, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:36', '1', '2024-02-21 20:36:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2705, '商机状态创建', 'crm:business-status:create', 3, 2, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:57', '1', '2024-02-21 20:35:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2706, '商机状态更新', 'crm:business-status:update', 3, 3, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:21', '1', '2024-02-21 20:36:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2707, '商机状态删除', 'crm:business-status:delete', 3, 4, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:36', '1', '2024-02-21 20:36:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2708, '合同配置', '', 2, 5, 2524, 'contract-config', 'ep:connection', 'crm/contract/config/index', 'CrmContractConfig', 0, '1', '1', '1', '1', '2024-02-24 16:44:40', '1', '2024-02-24 16:44:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2709, '客户公海配置查询', 'crm:customer-pool-config:query', 3, 2, 2516, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:19', '1', '2024-02-24 16:45:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2710, '合同配置更新', 'crm:contract-config:update', 3, 1, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:56', '1', '2024-02-24 16:45:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2711, '合同配置查询', 'crm:contract-config:query', 3, 2, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:46:16', '1', '2024-02-24 16:46:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2712, '客户分析', 'crm:statistics-customer:query', 2, 0, 2560, 'customer', 'ep:avatar', 'views/crm/statistics/customer/index.vue', 'CrmStatisticsCustomer', 0, '1', '1', '1', '1', '2024-03-09 16:43:56', '1', '2024-04-24 19:42:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, '1', '1', '1', '1', '2024-03-17 21:50:23', '1', '2024-04-24 19:55:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-21 23:51:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, '1', '0', '1', '1', '2024-03-19 19:46:05', '1', '2024-03-23 19:03:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, '1', '1', '1', '1', '2024-03-21 23:57:30', '1', '2024-03-21 23:57:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:18:27', '1', '2024-03-22 08:19:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:19:25', '1', '2024-03-22 08:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, '1', '1', '1', '1', '2024-03-22 08:43:22', '1', '2024-03-22 08:43:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:43:49', '1', '2024-03-22 08:43:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, '1', '1', '1', '', '2024-03-09 16:05:34', '1', '2024-03-23 13:13:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, '1', '1', '1', '', '2024-03-09 22:35:08', '1', '2024-03-23 19:43:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2736, '员工业绩', 'crm:statistics-performance:query', 2, 3, 2560, 'performance', 'ep:dish-dot', 'crm/statistics/performance/index', 'CrmStatisticsPerformance', 0, '1', '1', '1', '1', '2024-04-05 13:49:20', '1', '2024-04-24 19:42:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2737, '客户画像', 'crm:statistics-portrait:query', 2, 4, 2560, 'portrait', 'ep:picture', 'crm/statistics/portrait/index', 'CrmStatisticsPortrait', 0, '1', '1', '1', '1', '2024-04-05 13:57:40', '1', '2024-04-24 19:42:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2738, '销售漏斗', 'crm:statistics-funnel:query', 2, 5, 2560, 'funnel', 'ep:grape', 'crm/statistics/funnel/index', 'CrmStatisticsFunnel', 0, '1', '1', '1', '1', '2024-04-13 10:53:26', '1', '2024-04-24 19:39:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2739, '消息中心', '', 1, 7, 1, 'messages', 'ep:chat-dot-round', '', '', 0, '1', '1', '1', '1', '2024-04-22 23:54:30', '1', '2024-04-23 09:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, '1', '1', '1', '1', '2024-04-23 00:04:44', '1', '2024-04-23 00:04:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2741, '领取公海客户', 'crm:customer:receive', 3, 1, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:47:45', '1', '2024-04-24 19:47:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2742, '分配公海客户', 'crm:customer:distribute', 3, 2, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:48:05', '1', '2024-04-24 19:48:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2743, '商品统计查询', 'statistics:product:query', 3, 1, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:05', '1', '2024-04-24 19:50:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2744, '商品统计导出', 'statistics:product:export', 3, 2, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:26', '1', '2024-04-24 19:50:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2745, '支付渠道查询', 'pay:channel:query', 3, 10, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:01', '1', '2024-04-24 19:53:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2746, '支付渠道创建', 'pay:channel:create', 3, 11, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:18', '1', '2024-04-24 19:53:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2747, '支付渠道更新', 'pay:channel:update', 3, 12, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:32', '1', '2024-04-24 19:53:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2748, '支付渠道删除', 'pay:channel:delete', 3, 13, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:54:34', '1', '2024-04-24 19:54:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2749, '商品收藏查询', 'product:favorite:query', 3, 10, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:55:47', '1', '2024-04-24 19:55:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2750, '商品浏览查询', 'product:browse-history:query', 3, 20, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:57:43', '1', '2024-04-24 19:57:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2751, '售后同意', 'trade:after-sale:agree', 3, 2, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:58:40', '1', '2024-04-24 19:58:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2752, '售后不同意', 'trade:after-sale:disagree', 3, 3, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:59:03', '1', '2024-04-24 19:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2753, '售后确认退货', 'trade:after-sale:receive', 3, 4, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:07', '1', '2024-04-24 20:00:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2754, '售后确认退款', 'trade:after-sale:refund', 3, 5, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:24', '1', '2024-04-24 20:00:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2755, '删除项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:01:37', '1', '2024-04-24 20:01:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2756, '会员等级记录查询', 'member:level-record:query', 3, 10, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:32', '1', '2024-04-24 20:02:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2757, '会员经验记录查询', 'member:experience-record:query', 3, 11, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:51', '1', '2024-04-24 20:02:51', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_menu_seq; +CREATE SEQUENCE system_menu_seq + START 2758; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS system_notice; +CREATE TABLE system_notice +( + id int8 NOT NULL, + title varchar(50) NOT NULL, + content text NOT NULL, + type int2 NOT NULL, + status int2 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notice + ADD CONSTRAINT pk_system_notice PRIMARY KEY (id); + +COMMENT ON COLUMN system_notice.id IS '公告ID'; +COMMENT ON COLUMN system_notice.title IS '公告标题'; +COMMENT ON COLUMN system_notice.content IS '公告内容'; +COMMENT ON COLUMN system_notice.type IS '公告类型(1通知 2公告)'; +COMMENT ON COLUMN system_notice.status IS '公告状态(0正常 1关闭)'; +COMMENT ON COLUMN system_notice.creator IS '创建者'; +COMMENT ON COLUMN system_notice.create_time IS '创建时间'; +COMMENT ON COLUMN system_notice.updater IS '更新者'; +COMMENT ON COLUMN system_notice.update_time IS '更新时间'; +COMMENT ON COLUMN system_notice.deleted IS '是否删除'; +COMMENT ON COLUMN system_notice.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notice IS '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '芋道的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '维护通知:2018-07-01 系统凌晨维护', '

11112222

', 2, 1, 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 20:07:26', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', '0', 121); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_notice_seq; +CREATE SEQUENCE system_notice_seq + START 5; + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_message; +CREATE TABLE system_notify_message +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + template_id int8 NOT NULL, + template_code varchar(64) NOT NULL, + template_nickname varchar(63) NOT NULL, + template_content varchar(1024) NOT NULL, + template_type int4 NOT NULL, + template_params varchar(255) NOT NULL, + read_status bool NOT NULL, + read_time timestamp NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notify_message + ADD CONSTRAINT pk_system_notify_message PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_message.id IS '用户ID'; +COMMENT ON COLUMN system_notify_message.user_id IS '用户id'; +COMMENT ON COLUMN system_notify_message.user_type IS '用户类型'; +COMMENT ON COLUMN system_notify_message.template_id IS '模版编号'; +COMMENT ON COLUMN system_notify_message.template_code IS '模板编码'; +COMMENT ON COLUMN system_notify_message.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_notify_message.template_content IS '模版内容'; +COMMENT ON COLUMN system_notify_message.template_type IS '模版类型'; +COMMENT ON COLUMN system_notify_message.template_params IS '模版参数'; +COMMENT ON COLUMN system_notify_message.read_status IS '是否已读'; +COMMENT ON COLUMN system_notify_message.read_time IS '阅读时间'; +COMMENT ON COLUMN system_notify_message.creator IS '创建者'; +COMMENT ON COLUMN system_notify_message.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_message.updater IS '更新者'; +COMMENT ON COLUMN system_notify_message.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_message.deleted IS '是否删除'; +COMMENT ON COLUMN system_notify_message.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notify_message IS '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:44:08', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:45:04', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 103, 2, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{"name":"哈哈"}', '0', NULL, '1', '2023-01-28 21:02:20', '1', '2023-01-28 21:02:20', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 22:21:42', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 22:22:07', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 1, 2, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{"name":"2","what":"3"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:45:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 1, 2, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{"name":"123"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:50:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-28 08:35:46","price":"0.09"}', '0', NULL, '1', '2023-09-28 16:36:22', '1', '2023-09-28 16:36:22', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-30 20:59:40","price":"1.00"}', '0', NULL, '1', '2023-10-03 12:11:34', '1', '2023-10-03 12:11:34', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_notify_message_seq; +CREATE SEQUENCE system_notify_message_seq + START 11; + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_template; +CREATE TABLE system_notify_template +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + code varchar(64) NOT NULL, + nickname varchar(255) NOT NULL, + content varchar(1024) NOT NULL, + type int2 NOT NULL, + params varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notify_template + ADD CONSTRAINT pk_system_notify_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_template.id IS '主键'; +COMMENT ON COLUMN system_notify_template.name IS '模板名称'; +COMMENT ON COLUMN system_notify_template.code IS '模版编码'; +COMMENT ON COLUMN system_notify_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_notify_template.content IS '模版内容'; +COMMENT ON COLUMN system_notify_template.type IS '类型'; +COMMENT ON COLUMN system_notify_template.params IS '参数数组'; +COMMENT ON COLUMN system_notify_template.status IS '状态'; +COMMENT ON COLUMN system_notify_template.remark IS '备注'; +COMMENT ON COLUMN system_notify_template.creator IS '创建者'; +COMMENT ON COLUMN system_notify_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_template.updater IS '更新者'; +COMMENT ON COLUMN system_notify_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_template.deleted IS '是否删除'; +COMMENT ON TABLE system_notify_template IS '站内信模板表'; + +DROP SEQUENCE IF EXISTS system_notify_template_seq; +CREATE SEQUENCE system_notify_template_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_access_token; +CREATE TABLE system_oauth2_access_token +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + user_info varchar(512) NOT NULL, + access_token varchar(255) NOT NULL, + refresh_token varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_access_token + ADD CONSTRAINT pk_system_oauth2_access_token PRIMARY KEY (id); + +CREATE INDEX idx_system_oauth2_access_token_01 ON system_oauth2_access_token (access_token); +CREATE INDEX idx_system_oauth2_access_token_02 ON system_oauth2_access_token (refresh_token); + +COMMENT ON COLUMN system_oauth2_access_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_access_token.user_info IS '用户信息'; +COMMENT ON COLUMN system_oauth2_access_token.access_token IS '访问令牌'; +COMMENT ON COLUMN system_oauth2_access_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_access_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_access_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_access_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_access_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_access_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_access_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_access_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_access_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_access_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_access_token IS 'OAuth2 访问令牌'; + +DROP SEQUENCE IF EXISTS system_oauth2_access_token_seq; +CREATE SEQUENCE system_oauth2_access_token_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_approve; +CREATE TABLE system_oauth2_approve +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + scope varchar(255) NULL DEFAULT '', + approved bool NOT NULL DEFAULT '0', + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_approve + ADD CONSTRAINT pk_system_oauth2_approve PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_approve.id IS '编号'; +COMMENT ON COLUMN system_oauth2_approve.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_approve.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_approve.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_approve.scope IS '授权范围'; +COMMENT ON COLUMN system_oauth2_approve.approved IS '是否接受'; +COMMENT ON COLUMN system_oauth2_approve.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_approve.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_approve.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_approve.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_approve.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_approve.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_approve.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_approve IS 'OAuth2 批准表'; + +DROP SEQUENCE IF EXISTS system_oauth2_approve_seq; +CREATE SEQUENCE system_oauth2_approve_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_client; +CREATE TABLE system_oauth2_client +( + id int8 NOT NULL, + client_id varchar(255) NOT NULL, + secret varchar(255) NOT NULL, + name varchar(255) NOT NULL, + logo varchar(255) NOT NULL, + description varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + access_token_validity_seconds int4 NOT NULL, + refresh_token_validity_seconds int4 NOT NULL, + redirect_uris varchar(255) NOT NULL, + authorized_grant_types varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + auto_approve_scopes varchar(255) NULL DEFAULT NULL, + authorities varchar(255) NULL DEFAULT NULL, + resource_ids varchar(255) NULL DEFAULT NULL, + additional_information varchar(4096) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_client + ADD CONSTRAINT pk_system_oauth2_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_client.id IS '编号'; +COMMENT ON COLUMN system_oauth2_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_client.secret IS '客户端密钥'; +COMMENT ON COLUMN system_oauth2_client.name IS '应用名'; +COMMENT ON COLUMN system_oauth2_client.logo IS '应用图标'; +COMMENT ON COLUMN system_oauth2_client.description IS '应用描述'; +COMMENT ON COLUMN system_oauth2_client.status IS '状态'; +COMMENT ON COLUMN system_oauth2_client.access_token_validity_seconds IS '访问令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.refresh_token_validity_seconds IS '刷新令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.redirect_uris IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_client.authorized_grant_types IS '授权类型'; +COMMENT ON COLUMN system_oauth2_client.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_client.auto_approve_scopes IS '自动通过的授权范围'; +COMMENT ON COLUMN system_oauth2_client.authorities IS '权限'; +COMMENT ON COLUMN system_oauth2_client.resource_ids IS '资源'; +COMMENT ON COLUMN system_oauth2_client.additional_information IS '附加信息'; +COMMENT ON COLUMN system_oauth2_client.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_client.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_client.deleted IS '是否删除'; +COMMENT ON TABLE system_oauth2_client IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 2592000, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', '[]', '["user.read","user.write"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2024-02-22 16:31:52', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', '啦啦啦啦', 0, 1800, 43200, '["https://www.iocoder.cn"]', '["password","authorization_code","implicit"]', '["user_info","projects"]', '["user_info"]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2023-12-02 21:01:01', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["authorization_code","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-09-29 13:28:31', '1', '2022-09-29 13:28:31', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["password","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-10-04 17:40:16', '1', '2022-10-04 20:31:21', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_oauth2_client_seq; +CREATE SEQUENCE system_oauth2_client_seq + START 43; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_code; +CREATE TABLE system_oauth2_code +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + code varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT '', + expires_time timestamp NOT NULL, + redirect_uri varchar(255) NULL DEFAULT NULL, + state varchar(255) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_code + ADD CONSTRAINT pk_system_oauth2_code PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_code.id IS '编号'; +COMMENT ON COLUMN system_oauth2_code.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_code.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_code.code IS '授权码'; +COMMENT ON COLUMN system_oauth2_code.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_code.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_code.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_code.redirect_uri IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_code.state IS '状态'; +COMMENT ON COLUMN system_oauth2_code.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_code.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_code IS 'OAuth2 授权码表'; + +DROP SEQUENCE IF EXISTS system_oauth2_code_seq; +CREATE SEQUENCE system_oauth2_code_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_refresh_token; +CREATE TABLE system_oauth2_refresh_token +( + id int8 NOT NULL, + user_id int8 NOT NULL, + refresh_token varchar(32) NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_refresh_token + ADD CONSTRAINT pk_system_oauth2_refresh_token PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_refresh_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_refresh_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_refresh_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_refresh_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_refresh_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_refresh_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_refresh_token IS 'OAuth2 刷新令牌'; + +DROP SEQUENCE IF EXISTS system_oauth2_refresh_token_seq; +CREATE SEQUENCE system_oauth2_refresh_token_seq + START 1; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS system_operate_log; +CREATE TABLE system_operate_log +( + id int8 NOT NULL, + trace_id varchar(64) NULL DEFAULT '', + user_id int8 NOT NULL, + user_type int2 NOT NULL DEFAULT 0, + type varchar(50) NOT NULL, + sub_type varchar(50) NOT NULL, + biz_id int8 NOT NULL, + action varchar(2000) NULL DEFAULT '', + extra varchar(2000) NULL DEFAULT '', + request_method varchar(16) NULL DEFAULT '', + request_url varchar(255) NULL DEFAULT '', + user_ip varchar(50) NULL DEFAULT NULL, + user_agent varchar(200) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_operate_log + ADD CONSTRAINT pk_system_operate_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_operate_log.id IS '日志主键'; +COMMENT ON COLUMN system_operate_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_operate_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_operate_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_operate_log.type IS '操作模块类型'; +COMMENT ON COLUMN system_operate_log.sub_type IS '操作名'; +COMMENT ON COLUMN system_operate_log.biz_id IS '操作数据模块编号'; +COMMENT ON COLUMN system_operate_log.action IS '操作内容'; +COMMENT ON COLUMN system_operate_log.extra IS '拓展字段'; +COMMENT ON COLUMN system_operate_log.request_method IS '请求方法名'; +COMMENT ON COLUMN system_operate_log.request_url IS '请求地址'; +COMMENT ON COLUMN system_operate_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_operate_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_operate_log.creator IS '创建者'; +COMMENT ON COLUMN system_operate_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_operate_log.updater IS '更新者'; +COMMENT ON COLUMN system_operate_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_operate_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_operate_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_operate_log IS '操作日志记录 V2 版本'; + +DROP SEQUENCE IF EXISTS system_operate_log_seq; +CREATE SEQUENCE system_operate_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS system_post; +CREATE TABLE system_post +( + id int8 NOT NULL, + code varchar(64) NOT NULL, + name varchar(50) NOT NULL, + sort int4 NOT NULL, + status int2 NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_post + ADD CONSTRAINT pk_system_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_post.id IS '岗位ID'; +COMMENT ON COLUMN system_post.code IS '岗位编码'; +COMMENT ON COLUMN system_post.name IS '岗位名称'; +COMMENT ON COLUMN system_post.sort IS '显示顺序'; +COMMENT ON COLUMN system_post.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_post.remark IS '备注'; +COMMENT ON COLUMN system_post.creator IS '创建者'; +COMMENT ON COLUMN system_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_post.updater IS '更新者'; +COMMENT ON COLUMN system_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_post IS '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2023-02-11 15:19:04', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 09:18:20', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 10:04:37', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 'HR', '人力资源', 5, 0, '', '1', '2024-03-24 20:45:40', '1', '2024-03-24 20:45:40', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_post_seq; +CREATE SEQUENCE system_post_seq + START 6; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS system_role; +CREATE TABLE system_role +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + code varchar(100) NOT NULL, + sort int4 NOT NULL, + data_scope int2 NOT NULL DEFAULT 1, + data_scope_dept_ids varchar(500) NULL DEFAULT '', + status int2 NOT NULL, + type int2 NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_role + ADD CONSTRAINT pk_system_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_role.id IS '角色ID'; +COMMENT ON COLUMN system_role.name IS '角色名称'; +COMMENT ON COLUMN system_role.code IS '角色权限字符串'; +COMMENT ON COLUMN system_role.sort IS '显示顺序'; +COMMENT ON COLUMN system_role.data_scope IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT ON COLUMN system_role.data_scope_dept_ids IS '数据范围(指定部门数组)'; +COMMENT ON COLUMN system_role.status IS '角色状态(0正常 1停用)'; +COMMENT ON COLUMN system_role.type IS '角色类型'; +COMMENT ON COLUMN system_role.remark IS '备注'; +COMMENT ON COLUMN system_role.creator IS '创建者'; +COMMENT ON COLUMN system_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_role.updater IS '更新者'; +COMMENT ON COLUMN system_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role IS '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '我想测试', '', '2021-01-06 13:49:35', '1', '2024-03-24 22:22:45', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_role_seq; +CREATE SEQUENCE system_role_seq + START 112; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_role_menu; +CREATE TABLE system_role_menu +( + id int8 NOT NULL, + role_id int8 NOT NULL, + menu_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_role_menu + ADD CONSTRAINT pk_system_role_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_role_menu.id IS '自增编号'; +COMMENT ON COLUMN system_role_menu.role_id IS '角色ID'; +COMMENT ON COLUMN system_role_menu.menu_id IS '菜单ID'; +COMMENT ON COLUMN system_role_menu.creator IS '创建者'; +COMMENT ON COLUMN system_role_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_role_menu.updater IS '更新者'; +COMMENT ON COLUMN system_role_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_role_menu.deleted IS '是否删除'; +COMMENT ON COLUMN system_role_menu.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role_menu IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1626, 101, 1196, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1729, 109, 100, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1730, 109, 101, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1731, 109, 1063, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1732, 109, 1064, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1733, 109, 1001, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1734, 109, 1065, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1735, 109, 1002, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1736, 109, 1003, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1737, 109, 1004, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1738, 109, 1005, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1739, 109, 1006, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1740, 109, 1007, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1741, 109, 1008, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1742, 109, 1009, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1743, 109, 1010, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1744, 109, 1011, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1745, 109, 1012, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1746, 111, 100, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1747, 111, 101, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1748, 111, 1063, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1749, 111, 1064, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1750, 111, 1001, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1751, 111, 1065, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1752, 111, 1002, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1753, 111, 1003, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1754, 111, 1004, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1755, 111, 1005, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1756, 111, 1006, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1757, 111, 1007, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1758, 111, 1008, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1759, 111, 1009, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1760, 111, 1010, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1761, 111, 1011, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1762, 111, 1012, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1763, 109, 100, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1764, 109, 101, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1765, 109, 1063, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1766, 109, 1064, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1767, 109, 1001, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1768, 109, 1065, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1769, 109, 1002, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1770, 109, 1003, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1771, 109, 1004, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1772, 109, 1005, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1773, 109, 1006, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1774, 109, 1007, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1775, 109, 1008, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1776, 109, 1009, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1777, 109, 1010, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1778, 109, 1011, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1779, 109, 1012, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1780, 111, 100, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1781, 111, 101, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1782, 111, 1063, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1783, 111, 1064, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1784, 111, 1001, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1785, 111, 1065, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1786, 111, 1002, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1787, 111, 1003, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1788, 111, 1004, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1789, 111, 1005, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1790, 111, 1006, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1791, 111, 1007, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1792, 111, 1008, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1793, 111, 1009, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1794, 111, 1010, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1795, 111, 1011, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1796, 111, 1012, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1797, 109, 100, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1798, 109, 101, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1799, 109, 1063, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1800, 109, 1064, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1801, 109, 1001, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1802, 109, 1065, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1803, 109, 1002, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1804, 109, 1003, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1805, 109, 1004, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1806, 109, 1005, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1807, 109, 1006, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1808, 109, 1007, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1809, 109, 1008, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1810, 109, 1009, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1811, 109, 1010, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1812, 109, 1011, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1813, 109, 1012, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1814, 111, 100, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1815, 111, 101, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1816, 111, 1063, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1817, 111, 1064, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1818, 111, 1001, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1819, 111, 1065, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1820, 111, 1002, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1821, 111, 1003, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1822, 111, 1004, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1823, 111, 1005, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1824, 111, 1006, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1825, 111, 1007, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1826, 111, 1008, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1827, 111, 1009, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1828, 111, 1010, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1829, 111, 1011, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1830, 111, 1012, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1831, 109, 103, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1832, 109, 1017, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1833, 109, 1018, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1834, 109, 1019, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1835, 109, 1020, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1836, 111, 103, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1837, 111, 1017, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1838, 111, 1018, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1839, 111, 1019, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1840, 111, 1020, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1841, 109, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1842, 109, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1843, 109, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1844, 109, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1845, 109, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1846, 111, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1847, 111, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1848, 111, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1849, 111, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1850, 111, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2003, 2, 1036, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2004, 2, 1037, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2005, 2, 1038, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2006, 2, 1039, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2013, 2, 1050, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2014, 2, 1051, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2015, 2, 1052, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2016, 2, 1053, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2017, 2, 1054, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2018, 2, 1056, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2019, 2, 1057, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2020, 2, 1058, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2022, 2, 1059, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2023, 2, 1060, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2034, 2, 1075, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2039, 2, 1087, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2044, 2, 1095, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2045, 2, 1096, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2046, 2, 1097, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2047, 2, 1098, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2048, 2, 1101, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2049, 2, 1102, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2050, 2, 1103, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2051, 2, 1104, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2052, 2, 1105, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2053, 2, 1106, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2054, 2, 1108, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2055, 2, 1109, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2061, 2, 1127, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2069, 2, 1135, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2070, 2, 1136, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2071, 2, 1137, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2073, 2, 1139, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2074, 2, 115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2075, 2, 1140, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2077, 2, 1141, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2078, 2, 1142, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2079, 2, 1143, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2080, 2, 1150, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2081, 2, 1161, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2082, 2, 1162, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2083, 2, 1163, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2084, 2, 1164, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2085, 2, 1165, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2086, 2, 1166, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2087, 2, 1173, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2088, 2, 1174, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2089, 2, 1175, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2102, 2, 1229, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2116, 2, 1254, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2117, 2, 1255, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2118, 2, 1256, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2119, 2, 1257, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2120, 2, 1258, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2121, 2, 1259, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2122, 2, 1260, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2142, 2, 1014, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2144, 2, 1016, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2152, 2, 1281, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2153, 2, 1282, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2154, 2, 2000, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2155, 2, 2002, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2156, 2, 2003, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2157, 2, 2004, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2158, 2, 2005, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2159, 2, 2006, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2160, 2, 2008, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2161, 2, 2009, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2162, 2, 2010, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2163, 2, 2011, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2164, 2, 2012, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2170, 2, 2019, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2171, 2, 2020, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2172, 2, 2021, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2173, 2, 2022, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2174, 2, 2023, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2175, 2, 2025, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2177, 2, 2027, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2178, 2, 2028, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2179, 2, 2029, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2180, 2, 2014, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2181, 2, 2015, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2182, 2, 2016, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2183, 2, 2017, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2184, 2, 2018, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2188, 101, 1024, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2189, 101, 1, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2190, 101, 1025, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2191, 101, 1026, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2192, 101, 1027, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2193, 101, 1028, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2194, 101, 1029, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2195, 101, 1030, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2196, 101, 1036, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2197, 101, 1037, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2198, 101, 1038, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2199, 101, 1039, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2200, 101, 1040, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2201, 101, 1042, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2202, 101, 1043, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2203, 101, 1045, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2204, 101, 1046, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2205, 101, 1048, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2206, 101, 2083, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2207, 101, 1063, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2208, 101, 1064, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2209, 101, 1065, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2210, 101, 1093, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2211, 101, 1094, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2212, 101, 1095, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2213, 101, 1096, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2214, 101, 1097, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2215, 101, 1098, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2216, 101, 1100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2217, 101, 1101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2218, 101, 1102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2219, 101, 1103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2220, 101, 1104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2221, 101, 1105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2222, 101, 1106, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2223, 101, 2130, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2224, 101, 1107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2225, 101, 2131, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2226, 101, 1108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2227, 101, 2132, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2228, 101, 1109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2229, 101, 2133, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2230, 101, 2134, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2232, 101, 2135, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2234, 101, 2136, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2236, 101, 2137, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2238, 101, 2138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2240, 101, 2139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2242, 101, 2140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2243, 101, 2141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2244, 101, 2142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2245, 101, 2143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2246, 101, 2144, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2247, 101, 2145, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2248, 101, 2146, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2249, 101, 2147, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2250, 101, 100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2251, 101, 2148, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2252, 101, 101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2253, 101, 2149, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2254, 101, 102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2255, 101, 2150, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2256, 101, 103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2257, 101, 2151, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2258, 101, 104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2259, 101, 2152, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2260, 101, 105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2261, 101, 107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2262, 101, 108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2263, 101, 109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2264, 101, 1138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2265, 101, 1139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2266, 101, 1140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2267, 101, 1141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2268, 101, 1142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2269, 101, 1143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2270, 101, 1224, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2271, 101, 1225, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2272, 101, 1226, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2273, 101, 1227, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2274, 101, 1228, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2275, 101, 1229, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2282, 101, 1261, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2283, 101, 1263, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2284, 101, 1264, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2285, 101, 1265, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2286, 101, 1266, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2287, 101, 1267, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2288, 101, 1001, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2289, 101, 1002, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2290, 101, 1003, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2291, 101, 1004, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2292, 101, 1005, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2293, 101, 1006, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2294, 101, 1007, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2295, 101, 1008, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2296, 101, 1009, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2297, 101, 1010, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2298, 101, 1011, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2299, 101, 1012, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2300, 101, 500, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2301, 101, 1013, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2302, 101, 501, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2303, 101, 1014, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2304, 101, 1015, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2305, 101, 1016, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2306, 101, 1017, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2307, 101, 1018, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2308, 101, 1019, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2309, 101, 1020, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2310, 101, 1021, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2311, 101, 1022, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2312, 101, 1023, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2929, 109, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2930, 109, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2931, 109, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2932, 109, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2933, 109, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2934, 109, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2935, 109, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2936, 109, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2937, 109, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2938, 109, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2939, 109, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2940, 109, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2941, 111, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2942, 111, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2943, 111, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2944, 111, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2945, 111, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2946, 111, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2947, 111, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2948, 111, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2949, 111, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2950, 111, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2951, 111, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2952, 111, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2993, 109, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2994, 109, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2995, 109, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2996, 109, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2997, 109, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2998, 109, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2999, 109, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3000, 109, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3001, 109, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3002, 109, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3003, 109, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3004, 109, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3005, 109, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3006, 109, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3007, 109, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3008, 109, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3009, 109, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3013, 109, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3017, 109, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3018, 109, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3019, 109, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3020, 109, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3021, 109, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3022, 109, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3023, 109, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3024, 109, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3025, 109, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3026, 109, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3027, 109, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3028, 109, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3029, 109, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3030, 109, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3031, 109, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3032, 109, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3033, 109, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3034, 109, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3035, 109, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3036, 109, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3037, 109, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3038, 109, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3039, 109, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3040, 109, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3041, 109, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3042, 109, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3043, 109, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3044, 109, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3045, 109, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3046, 109, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3047, 109, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3048, 109, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3049, 109, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3050, 109, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3051, 109, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3052, 109, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3053, 109, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3054, 109, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3055, 109, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3056, 109, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3057, 109, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3058, 109, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3059, 109, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3060, 109, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3061, 109, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3062, 109, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3063, 109, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3064, 109, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3065, 109, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3066, 109, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3067, 109, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3068, 109, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3069, 111, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3070, 111, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3071, 111, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3072, 111, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3073, 111, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3074, 111, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3075, 111, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3076, 111, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3077, 111, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3078, 111, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3079, 111, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3080, 111, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3081, 111, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3082, 111, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3083, 111, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3084, 111, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3085, 111, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3089, 111, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3093, 111, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3094, 111, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3095, 111, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3096, 111, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3097, 111, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3098, 111, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3099, 111, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3100, 111, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3101, 111, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3102, 111, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3103, 111, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3104, 111, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3105, 111, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3106, 111, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3107, 111, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3108, 111, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3109, 111, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3110, 111, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3111, 111, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3112, 111, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3113, 111, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3114, 111, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3115, 111, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3116, 111, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3117, 111, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3118, 111, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3119, 111, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3120, 111, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3121, 111, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3122, 111, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3123, 111, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3124, 111, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3125, 111, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3126, 111, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3127, 111, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3128, 111, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3129, 111, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3130, 111, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3131, 111, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3132, 111, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3133, 111, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3134, 111, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3135, 111, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3136, 111, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3137, 111, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3138, 111, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3139, 111, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3140, 111, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3141, 111, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3142, 111, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3143, 111, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3144, 111, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3221, 109, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3222, 109, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3223, 109, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3224, 109, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3225, 109, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3226, 111, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3227, 111, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3228, 111, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3229, 111, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3230, 111, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4163, 109, 5, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4164, 109, 1118, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4165, 109, 1119, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4166, 109, 1120, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4167, 109, 2713, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4168, 109, 2714, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4169, 109, 2715, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4170, 109, 2716, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4171, 109, 2717, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4172, 109, 2718, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4173, 109, 2720, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4174, 109, 1185, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4175, 109, 2721, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4176, 109, 1186, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4177, 109, 2722, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4178, 109, 1187, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4179, 109, 2723, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4180, 109, 1188, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4181, 109, 2724, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4182, 109, 1189, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4183, 109, 2725, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4184, 109, 1190, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4185, 109, 2726, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4186, 109, 1191, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4187, 109, 2727, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4188, 109, 1192, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4189, 109, 2728, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4190, 109, 1193, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4191, 109, 2729, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4192, 109, 1194, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4193, 109, 2730, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4194, 109, 1195, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4195, 109, 2731, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4196, 109, 1196, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4197, 109, 2732, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4198, 109, 1197, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4199, 109, 2733, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4200, 109, 1198, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4201, 109, 2734, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4202, 109, 1199, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4203, 109, 2735, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4204, 109, 1200, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4205, 109, 1201, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4206, 109, 1202, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4207, 109, 1207, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4208, 109, 1208, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4209, 109, 1209, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4210, 109, 1210, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4211, 109, 1211, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4212, 109, 1212, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4213, 109, 1213, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4214, 109, 1215, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4215, 109, 1216, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4216, 109, 1217, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4217, 109, 1218, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4218, 109, 1219, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4219, 109, 1220, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4220, 109, 1221, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4221, 109, 1222, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4222, 111, 5, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4223, 111, 1118, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4224, 111, 1119, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4225, 111, 1120, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4226, 111, 2713, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4227, 111, 2714, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4228, 111, 2715, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4229, 111, 2716, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4230, 111, 2717, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4231, 111, 2718, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4232, 111, 2720, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4233, 111, 1185, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4234, 111, 2721, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4235, 111, 1186, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4236, 111, 2722, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4237, 111, 1187, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4238, 111, 2723, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4239, 111, 1188, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4240, 111, 2724, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4241, 111, 1189, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4242, 111, 2725, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4243, 111, 1190, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4244, 111, 2726, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4245, 111, 1191, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4246, 111, 2727, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4247, 111, 1192, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4248, 111, 2728, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4249, 111, 1193, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4250, 111, 2729, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4251, 111, 1194, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4252, 111, 2730, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4253, 111, 1195, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4254, 111, 2731, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4255, 111, 1196, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4256, 111, 2732, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4257, 111, 1197, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4258, 111, 2733, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4259, 111, 1198, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4260, 111, 2734, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4261, 111, 1199, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4262, 111, 2735, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4263, 111, 1200, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4264, 111, 1201, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4265, 111, 1202, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4266, 111, 1207, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4267, 111, 1208, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4268, 111, 1209, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4269, 111, 1210, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4270, 111, 1211, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4271, 111, 1212, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4272, 111, 1213, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4273, 111, 1215, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4274, 111, 1216, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4275, 111, 1217, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4276, 111, 1218, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4277, 111, 1219, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4278, 111, 1220, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4279, 111, 1221, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_role_menu_seq; +CREATE SEQUENCE system_role_menu_seq + START 5779; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_channel; +CREATE TABLE system_sms_channel +( + id int8 NOT NULL, + signature varchar(12) NOT NULL, + code varchar(63) NOT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + api_key varchar(128) NOT NULL, + api_secret varchar(128) NULL DEFAULT NULL, + callback_url varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_channel + ADD CONSTRAINT pk_system_sms_channel PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_channel.id IS '编号'; +COMMENT ON COLUMN system_sms_channel.signature IS '短信签名'; +COMMENT ON COLUMN system_sms_channel.code IS '渠道编码'; +COMMENT ON COLUMN system_sms_channel.status IS '开启状态'; +COMMENT ON COLUMN system_sms_channel.remark IS '备注'; +COMMENT ON COLUMN system_sms_channel.api_key IS '短信 API 的账号'; +COMMENT ON COLUMN system_sms_channel.api_secret IS '短信 API 的秘钥'; +COMMENT ON COLUMN system_sms_channel.callback_url IS '短信发送回调 URL'; +COMMENT ON COLUMN system_sms_channel.creator IS '创建者'; +COMMENT ON COLUMN system_sms_channel.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_channel.updater IS '更新者'; +COMMENT ON COLUMN system_sms_channel.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_channel.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_channel IS '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2023-12-02 22:10:17', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, '仅测试', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2022-04-10 23:07:59', '1', '2023-12-02 22:10:08', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_sms_channel_seq; +CREATE SEQUENCE system_sms_channel_seq + START 7; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_code; +CREATE TABLE system_sms_code +( + id int8 NOT NULL, + mobile varchar(11) NOT NULL, + code varchar(6) NOT NULL, + create_ip varchar(15) NOT NULL, + scene int2 NOT NULL, + today_index int2 NOT NULL, + used int2 NOT NULL, + used_time timestamp NULL DEFAULT NULL, + used_ip varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_code + ADD CONSTRAINT pk_system_sms_code PRIMARY KEY (id); + +CREATE INDEX idx_system_sms_code_01 ON system_sms_code (mobile); + +COMMENT ON COLUMN system_sms_code.id IS '编号'; +COMMENT ON COLUMN system_sms_code.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_code.code IS '验证码'; +COMMENT ON COLUMN system_sms_code.create_ip IS '创建 IP'; +COMMENT ON COLUMN system_sms_code.scene IS '发送场景'; +COMMENT ON COLUMN system_sms_code.today_index IS '今日发送的第几条'; +COMMENT ON COLUMN system_sms_code.used IS '是否使用'; +COMMENT ON COLUMN system_sms_code.used_time IS '使用时间'; +COMMENT ON COLUMN system_sms_code.used_ip IS '使用 IP'; +COMMENT ON COLUMN system_sms_code.creator IS '创建者'; +COMMENT ON COLUMN system_sms_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_code.updater IS '更新者'; +COMMENT ON COLUMN system_sms_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_sms_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_sms_code IS '手机验证码'; + +DROP SEQUENCE IF EXISTS system_sms_code_seq; +CREATE SEQUENCE system_sms_code_seq + START 1; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_log; +CREATE TABLE system_sms_log +( + id int8 NOT NULL, + channel_id int8 NOT NULL, + channel_code varchar(63) NOT NULL, + template_id int8 NOT NULL, + template_code varchar(63) NOT NULL, + template_type int2 NOT NULL, + template_content varchar(255) NOT NULL, + template_params varchar(255) NOT NULL, + api_template_id varchar(63) NOT NULL, + mobile varchar(11) NOT NULL, + user_id int8 NULL DEFAULT NULL, + user_type int2 NULL DEFAULT NULL, + send_status int2 NOT NULL DEFAULT 0, + send_time timestamp NULL DEFAULT NULL, + api_send_code varchar(63) NULL DEFAULT NULL, + api_send_msg varchar(255) NULL DEFAULT NULL, + api_request_id varchar(255) NULL DEFAULT NULL, + api_serial_no varchar(255) NULL DEFAULT NULL, + receive_status int2 NOT NULL DEFAULT 0, + receive_time timestamp NULL DEFAULT NULL, + api_receive_code varchar(63) NULL DEFAULT NULL, + api_receive_msg varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_log + ADD CONSTRAINT pk_system_sms_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_log.id IS '编号'; +COMMENT ON COLUMN system_sms_log.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_log.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_sms_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_sms_log.template_type IS '短信类型'; +COMMENT ON COLUMN system_sms_log.template_content IS '短信内容'; +COMMENT ON COLUMN system_sms_log.template_params IS '短信参数'; +COMMENT ON COLUMN system_sms_log.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_log.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_sms_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_sms_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_sms_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_sms_log.api_send_code IS '短信 API 发送结果的编码'; +COMMENT ON COLUMN system_sms_log.api_send_msg IS '短信 API 发送失败的提示'; +COMMENT ON COLUMN system_sms_log.api_request_id IS '短信 API 发送返回的唯一请求 ID'; +COMMENT ON COLUMN system_sms_log.api_serial_no IS '短信 API 发送返回的序号'; +COMMENT ON COLUMN system_sms_log.receive_status IS '接收状态'; +COMMENT ON COLUMN system_sms_log.receive_time IS '接收时间'; +COMMENT ON COLUMN system_sms_log.api_receive_code IS 'API 接收结果的编码'; +COMMENT ON COLUMN system_sms_log.api_receive_msg IS 'API 接收结果的说明'; +COMMENT ON COLUMN system_sms_log.creator IS '创建者'; +COMMENT ON COLUMN system_sms_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_log.updater IS '更新者'; +COMMENT ON COLUMN system_sms_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_log.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_log IS '短信日志'; + +DROP SEQUENCE IF EXISTS system_sms_log_seq; +CREATE SEQUENCE system_sms_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_template; +CREATE TABLE system_sms_template +( + id int8 NOT NULL, + type int2 NOT NULL, + status int2 NOT NULL, + code varchar(63) NOT NULL, + name varchar(63) NOT NULL, + content varchar(255) NOT NULL, + params varchar(255) NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + api_template_id varchar(63) NOT NULL, + channel_id int8 NOT NULL, + channel_code varchar(63) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_template + ADD CONSTRAINT pk_system_sms_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_template.id IS '编号'; +COMMENT ON COLUMN system_sms_template.type IS '模板类型'; +COMMENT ON COLUMN system_sms_template.status IS '开启状态'; +COMMENT ON COLUMN system_sms_template.code IS '模板编码'; +COMMENT ON COLUMN system_sms_template.name IS '模板名称'; +COMMENT ON COLUMN system_sms_template.content IS '模板内容'; +COMMENT ON COLUMN system_sms_template.params IS '参数数组'; +COMMENT ON COLUMN system_sms_template.remark IS '备注'; +COMMENT ON COLUMN system_sms_template.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_template.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_template.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_template.creator IS '创建者'; +COMMENT ON COLUMN system_sms_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_template.updater IS '更新者'; +COMMENT ON COLUMN system_sms_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_template.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_template IS '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', '测试备注', '4383920', 6, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2023-12-02 22:32:47', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', 6, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2022-12-10 21:26:09', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2023-12-02 22:35:34', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', 6, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2022-12-10 21:25:59', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2023-03-24 23:45:07', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_sms_template_seq; +CREATE SEQUENCE system_sms_template_seq + START 17; + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +DROP TABLE IF EXISTS system_social_client; +CREATE TABLE system_social_client +( + id int8 NOT NULL, + name varchar(255) NOT NULL, + social_type int2 NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + client_secret varchar(255) NOT NULL, + agent_id varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_client + ADD CONSTRAINT pk_system_social_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_client.id IS '编号'; +COMMENT ON COLUMN system_social_client.name IS '应用名'; +COMMENT ON COLUMN system_social_client.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_client.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_social_client.client_secret IS '客户端密钥'; +COMMENT ON COLUMN system_social_client.agent_id IS '代理编号'; +COMMENT ON COLUMN system_social_client.status IS '状态'; +COMMENT ON COLUMN system_social_client.creator IS '创建者'; +COMMENT ON COLUMN system_social_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_client.updater IS '更新者'; +COMMENT ON COLUMN system_social_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_client.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_client.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_client IS '社交客户端表'; + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '钉钉', 20, 2, 'dingvrnreaje3yqvzhxg', 'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, '', '2023-10-18 11:21:18', '1', '2023-12-20 21:28:26', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '钉钉(王土豆)', 20, 2, 'dingtsu9hpepjkbmthhw', 'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, '', '2023-10-18 11:21:18', '', '2023-12-20 21:28:26', '1', 121); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '微信公众号', 31, 1, 'wx5b23ba7a5589ecbb', '2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, '', '2023-10-18 16:07:46', '1', '2023-12-20 21:28:23', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (43, '微信小程序', 34, 1, 'wx63c280fe3248a3e7', '6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, '', '2023-10-19 13:37:41', '1', '2023-12-20 21:28:25', '1', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_social_client_seq; +CREATE SEQUENCE system_social_client_seq + START 44; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user; +CREATE TABLE system_social_user +( + id int8 NOT NULL, + type int2 NOT NULL, + openid varchar(32) NOT NULL, + token varchar(256) NULL DEFAULT NULL, + raw_token_info varchar(1024) NOT NULL, + nickname varchar(32) NOT NULL, + avatar varchar(255) NULL DEFAULT NULL, + raw_user_info varchar(1024) NOT NULL, + code varchar(256) NOT NULL, + state varchar(256) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_user + ADD CONSTRAINT pk_system_social_user PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user.type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user.openid IS '社交 openid'; +COMMENT ON COLUMN system_social_user.token IS '社交 token'; +COMMENT ON COLUMN system_social_user.raw_token_info IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.nickname IS '用户昵称'; +COMMENT ON COLUMN system_social_user.avatar IS '用户头像'; +COMMENT ON COLUMN system_social_user.raw_user_info IS '原始用户数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.code IS '最后一次的认证 code'; +COMMENT ON COLUMN system_social_user.state IS '最后一次的认证 state'; +COMMENT ON COLUMN system_social_user.creator IS '创建者'; +COMMENT ON COLUMN system_social_user.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user.updater IS '更新者'; +COMMENT ON COLUMN system_social_user.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user IS '社交用户表'; + +DROP SEQUENCE IF EXISTS system_social_user_seq; +CREATE SEQUENCE system_social_user_seq + START 1; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user_bind; +CREATE TABLE system_social_user_bind +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + social_type int2 NOT NULL, + social_user_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_user_bind + ADD CONSTRAINT pk_system_social_user_bind PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user_bind.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user_bind.user_id IS '用户编号'; +COMMENT ON COLUMN system_social_user_bind.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_user_bind.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user_bind.social_user_id IS '社交用户的编号'; +COMMENT ON COLUMN system_social_user_bind.creator IS '创建者'; +COMMENT ON COLUMN system_social_user_bind.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user_bind.updater IS '更新者'; +COMMENT ON COLUMN system_social_user_bind.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user_bind.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user_bind.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user_bind IS '社交绑定表'; + +DROP SEQUENCE IF EXISTS system_social_user_bind_seq; +CREATE SEQUENCE system_social_user_bind_seq + START 1; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant; +CREATE TABLE system_tenant +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + contact_user_id int8 NULL DEFAULT NULL, + contact_name varchar(30) NOT NULL, + contact_mobile varchar(500) NULL DEFAULT NULL, + status int2 NOT NULL DEFAULT 0, + website varchar(256) NULL DEFAULT '', + package_id int8 NOT NULL, + expire_time timestamp NOT NULL, + account_count int4 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_tenant + ADD CONSTRAINT pk_system_tenant PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant.id IS '租户编号'; +COMMENT ON COLUMN system_tenant.name IS '租户名'; +COMMENT ON COLUMN system_tenant.contact_user_id IS '联系人的用户编号'; +COMMENT ON COLUMN system_tenant.contact_name IS '联系人'; +COMMENT ON COLUMN system_tenant.contact_mobile IS '联系手机'; +COMMENT ON COLUMN system_tenant.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant.website IS '绑定域名'; +COMMENT ON COLUMN system_tenant.package_id IS '租户套餐编号'; +COMMENT ON COLUMN system_tenant.expire_time IS '过期时间'; +COMMENT ON COLUMN system_tenant.account_count IS '账号数量'; +COMMENT ON COLUMN system_tenant.creator IS '创建者'; +COMMENT ON COLUMN system_tenant.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant.updater IS '更新者'; +COMMENT ON COLUMN system_tenant.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant IS '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2023-11-06 11:41:47', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2023-11-06 11:41:53', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_tenant_seq; +CREATE SEQUENCE system_tenant_seq + START 123; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant_package; +CREATE TABLE system_tenant_package +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + status int2 NOT NULL DEFAULT 0, + remark varchar(256) NULL DEFAULT '', + menu_ids varchar(4096) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_tenant_package + ADD CONSTRAINT pk_system_tenant_package PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant_package.id IS '套餐编号'; +COMMENT ON COLUMN system_tenant_package.name IS '套餐名'; +COMMENT ON COLUMN system_tenant_package.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant_package.remark IS '备注'; +COMMENT ON COLUMN system_tenant_package.menu_ids IS '关联的菜单编号'; +COMMENT ON COLUMN system_tenant_package.creator IS '创建者'; +COMMENT ON COLUMN system_tenant_package.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant_package.updater IS '更新者'; +COMMENT ON COLUMN system_tenant_package.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant_package.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant_package IS '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_tenant_package (id, name, status, remark, menu_ids, creator, create_time, updater, update_time, deleted) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1076,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2484,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-03-30 17:53:17', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_tenant_package_seq; +CREATE SEQUENCE system_tenant_package_seq + START 112; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS system_user_post; +CREATE TABLE system_user_post +( + id int8 NOT NULL, + user_id int8 NOT NULL DEFAULT 0, + post_id int8 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_user_post + ADD CONSTRAINT pk_system_user_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_post.id IS 'id'; +COMMENT ON COLUMN system_user_post.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_post.post_id IS '岗位ID'; +COMMENT ON COLUMN system_user_post.creator IS '创建者'; +COMMENT ON COLUMN system_user_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_post.updater IS '更新者'; +COMMENT ON COLUMN system_user_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_post IS '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 104, 1, '1', '2022-05-16 19:36:28', '1', '2022-05-16 19:36:28', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (116, 117, 2, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 118, 1, '1', '2022-07-09 17:44:44', '1', '2022-07-09 17:44:44', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_user_post_seq; +CREATE SEQUENCE system_user_post_seq + START 125; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS system_user_role; +CREATE TABLE system_user_role +( + id int8 NOT NULL, + user_id int8 NOT NULL, + role_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_user_role + ADD CONSTRAINT pk_system_user_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_role.id IS '自增编号'; +COMMENT ON COLUMN system_user_role.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN system_user_role.creator IS '创建者'; +COMMENT ON COLUMN system_user_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_role.updater IS '更新者'; +COMMENT ON COLUMN system_user_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_role IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (20, 104, 101, '1', '2022-05-28 15:43:57', '1', '2022-05-28 15:43:57', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (22, 115, 2, '1', '2022-07-21 22:08:30', '1', '2022-07-21 22:08:30', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (35, 112, 1, '1', '2024-03-15 20:00:24', '1', '2024-03-15 20:00:24', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (36, 118, 1, '1', '2024-03-17 09:12:08', '1', '2024-03-17 09:12:08', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (38, 114, 101, '1', '2024-03-24 22:23:03', '1', '2024-03-24 22:23:03', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_user_role_seq; +CREATE SEQUENCE system_user_role_seq + START 39; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS system_users; +CREATE TABLE system_users +( + id int8 NOT NULL, + username varchar(30) NOT NULL, + password varchar(100) NULL DEFAULT '', + nickname varchar(30) NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + dept_id int8 NULL DEFAULT NULL, + post_ids varchar(255) NULL DEFAULT NULL, + email varchar(50) NULL DEFAULT '', + mobile varchar(11) NULL DEFAULT '', + sex int2 NULL DEFAULT 0, + avatar varchar(512) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + login_ip varchar(50) NULL DEFAULT '', + login_date timestamp NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_users + ADD CONSTRAINT pk_system_users PRIMARY KEY (id); + +COMMENT ON COLUMN system_users.id IS '用户ID'; +COMMENT ON COLUMN system_users.username IS '用户账号'; +COMMENT ON COLUMN system_users.password IS '密码'; +COMMENT ON COLUMN system_users.nickname IS '用户昵称'; +COMMENT ON COLUMN system_users.remark IS '备注'; +COMMENT ON COLUMN system_users.dept_id IS '部门ID'; +COMMENT ON COLUMN system_users.post_ids IS '岗位编号数组'; +COMMENT ON COLUMN system_users.email IS '用户邮箱'; +COMMENT ON COLUMN system_users.mobile IS '手机号码'; +COMMENT ON COLUMN system_users.sex IS '用户性别'; +COMMENT ON COLUMN system_users.avatar IS '头像地址'; +COMMENT ON COLUMN system_users.status IS '帐号状态(0正常 1停用)'; +COMMENT ON COLUMN system_users.login_ip IS '最后登录IP'; +COMMENT ON COLUMN system_users.login_date IS '最后登录时间'; +COMMENT ON COLUMN system_users.creator IS '创建者'; +COMMENT ON COLUMN system_users.create_time IS '创建时间'; +COMMENT ON COLUMN system_users.updater IS '更新者'; +COMMENT ON COLUMN system_users.update_time IS '更新时间'; +COMMENT ON COLUMN system_users.deleted IS '是否删除'; +COMMENT ON COLUMN system_users.tenant_id IS '租户编号'; +COMMENT ON TABLE system_users IS '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '18818260277', 2, 'http://test.win.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, '0:0:0:0:0:0:0:1', '2024-04-29 21:50:32', 'admin', '2021-01-05 17:03:47', NULL, '2024-04-29 21:50:32', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-03-18 21:09:04', '', '2021-01-13 23:50:35', NULL, '2024-03-18 21:09:04', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, 'test', '$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-26 07:11:35', '', '2021-01-21 02:13:53', NULL, '2024-03-26 07:11:35', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', '0', 118); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', '0', 119); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', '0', 120); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-09-25 22:47:33', '1', '2022-02-22 00:56:14', NULL, '2022-09-25 22:47:33', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', '0', 122); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-04-04 09:48:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_users_seq; +CREATE SEQUENCE system_users_seq + START 132; + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +DROP TABLE IF EXISTS win_demo01_contact; +CREATE TABLE win_demo01_contact +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + sex int2 NOT NULL, + birthday timestamp NOT NULL, + description varchar(255) NOT NULL, + avatar varchar(512) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo01_contact + ADD CONSTRAINT pk_win_demo01_contact PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo01_contact.id IS '编号'; +COMMENT ON COLUMN win_demo01_contact.name IS '名字'; +COMMENT ON COLUMN win_demo01_contact.sex IS '性别'; +COMMENT ON COLUMN win_demo01_contact.birthday IS '出生年'; +COMMENT ON COLUMN win_demo01_contact.description IS '简介'; +COMMENT ON COLUMN win_demo01_contact.avatar IS '头像'; +COMMENT ON COLUMN win_demo01_contact.creator IS '创建者'; +COMMENT ON COLUMN win_demo01_contact.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo01_contact.updater IS '更新者'; +COMMENT ON COLUMN win_demo01_contact.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo01_contact.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo01_contact.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo01_contact IS '示例联系人表'; + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo01_contact (id, name, sex, birthday, description, avatar, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 2, '2023-11-07 00:00:00', '

天蚕土豆!呀

', 'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', '1', '2023-11-15 23:34:30', '1', '2023-11-15 23:47:39', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo01_contact_seq; +CREATE SEQUENCE win_demo01_contact_seq + START 2; + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +DROP TABLE IF EXISTS win_demo02_category; +CREATE TABLE win_demo02_category +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + parent_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo02_category + ADD CONSTRAINT pk_win_demo02_category PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo02_category.id IS '编号'; +COMMENT ON COLUMN win_demo02_category.name IS '名字'; +COMMENT ON COLUMN win_demo02_category.parent_id IS '父级编号'; +COMMENT ON COLUMN win_demo02_category.creator IS '创建者'; +COMMENT ON COLUMN win_demo02_category.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo02_category.updater IS '更新者'; +COMMENT ON COLUMN win_demo02_category.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo02_category.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo02_category.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo02_category IS '示例分类表'; + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 0, '1', '2023-11-15 23:34:30', '1', '2023-11-16 20:24:23', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '番茄', 0, '1', '2023-11-16 20:24:00', '1', '2023-11-16 20:24:15', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '怪怪', 0, '1', '2023-11-16 20:24:32', '1', '2023-11-16 20:24:32', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '小番茄', 2, '1', '2023-11-16 20:24:39', '1', '2023-11-16 20:24:39', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大番茄', 2, '1', '2023-11-16 20:24:46', '1', '2023-11-16 20:24:46', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, '11', 3, '1', '2023-11-24 19:29:34', '1', '2023-11-24 19:29:34', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo02_category_seq; +CREATE SEQUENCE win_demo02_category_seq + START 7; + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_course; +CREATE TABLE win_demo03_course +( + id int8 NOT NULL, + student_id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + score int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_course + ADD CONSTRAINT pk_win_demo03_course PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_course.id IS '编号'; +COMMENT ON COLUMN win_demo03_course.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_course.name IS '名字'; +COMMENT ON COLUMN win_demo03_course.score IS '分数'; +COMMENT ON COLUMN win_demo03_course.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_course.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_course.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_course.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_course.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_course.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_course IS '学生课程表'; + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, '语文', 66, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 2, '数学', 22, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (11, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (12, 2, '电脑', 33, '1', '2023-11-17 00:20:42', '1', '2023-11-16 16:20:45', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (13, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2023-11-17 13:13:20', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_course_seq; +CREATE SEQUENCE win_demo03_course_seq + START 14; + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_grade; +CREATE TABLE win_demo03_grade +( + id int8 NOT NULL, + student_id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + teacher varchar(255) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_grade + ADD CONSTRAINT pk_win_demo03_grade PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_grade.id IS '编号'; +COMMENT ON COLUMN win_demo03_grade.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_grade.name IS '名字'; +COMMENT ON COLUMN win_demo03_grade.teacher IS '班主任'; +COMMENT ON COLUMN win_demo03_grade.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_grade.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_grade.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_grade.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_grade.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_grade.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_grade IS '学生班级表'; + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 2, '三年 2 班', '周杰伦', '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '华为', '遥遥领先', '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 9, '小图', '小娃111', '1', '2023-11-17 13:10:23', '1', '2023-11-17 13:10:23', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_grade_seq; +CREATE SEQUENCE win_demo03_grade_seq + START 10; + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_student; +CREATE TABLE win_demo03_student +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + sex int2 NOT NULL, + birthday timestamp NOT NULL, + description varchar(255) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_student + ADD CONSTRAINT pk_win_demo03_student PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_student.id IS '编号'; +COMMENT ON COLUMN win_demo03_student.name IS '名字'; +COMMENT ON COLUMN win_demo03_student.sex IS '性别'; +COMMENT ON COLUMN win_demo03_student.birthday IS '出生日期'; +COMMENT ON COLUMN win_demo03_student.description IS '简介'; +COMMENT ON COLUMN win_demo03_student.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_student.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_student.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_student.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_student.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_student.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_student IS '学生表'; + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '小白', 1, '2023-11-16 00:00:00', '

厉害

', '1', '2023-11-16 23:21:49', '1', '2023-11-17 16:49:06', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大黑', 2, '2023-11-13 00:00:00', '

你在教我做事?

', '1', '2023-11-16 23:22:46', '1', '2023-11-17 16:49:07', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, '小花', 1, '2023-11-07 00:00:00', '

哈哈哈

', '1', '2023-11-17 00:04:47', '1', '2023-11-17 16:49:08', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_student_seq; +CREATE SEQUENCE win_demo03_student_seq + START 10; + diff --git a/sql/mysql/quartz.sql b/sql/mysql/quartz.sql new file mode 100644 index 0000000..d75ce7a --- /dev/null +++ b/sql/mysql/quartz.sql @@ -0,0 +1,284 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 MySQL + Source Server Type : MySQL + Source Server Version : 80200 (8.2.0) + Source Host : 127.0.0.1:3306 + Source Schema : ruoyi-vue-pro + + Target Server Type : MySQL + Target Server Version : 80200 (8.2.0) + File Encoding : 65001 + + Date: 24/07/2024 08:52:41 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`; +CREATE TABLE `QRTZ_BLOB_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `BLOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_CALENDARS`; +CREATE TABLE `QRTZ_CALENDARS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`; +CREATE TABLE `QRTZ_CRON_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_CRON_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('schedulerName', 'accessLogCleanJob', 'DEFAULT', '0 0 0 * * ?', 'Asia/Shanghai'), ('schedulerName', 'brokerageRecordUnfreezeJob', 'DEFAULT', '0 * * * * ?', 'Asia/Shanghai'), ('schedulerName', 'errorLogCleanJob', 'DEFAULT', '0 0 0 * * ?', 'Asia/Shanghai'), ('schedulerName', 'jobLogCleanJob', 'DEFAULT', '0 0 0 * * ?', 'Asia/Shanghai'), ('schedulerName', 'payNotifyJob', 'DEFAULT', '* * * * * ?', 'Asia/Shanghai'), ('schedulerName', 'payOrderExpireJob', 'DEFAULT', '0 0/1 * * * ?', 'Asia/Shanghai'), ('schedulerName', 'payOrderSyncJob', 'DEFAULT', '0 0/1 * * * ?', 'Asia/Shanghai'), ('schedulerName', 'payRefundSyncJob', 'DEFAULT', '0 0/1 * * * ?', 'Asia/Shanghai'), ('schedulerName', 'tradeOrderAutoCancelJob', 'DEFAULT', '0 * * * * ?', 'Asia/Shanghai'), ('schedulerName', 'tradeOrderAutoCommentJob', 'DEFAULT', '0 * * * * ?', 'Asia/Shanghai'), ('schedulerName', 'tradeOrderAutoReceiveJob', 'DEFAULT', '0 * * * * ?', 'Asia/Shanghai'); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`; +CREATE TABLE `QRTZ_FIRED_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `FIRED_TIME` bigint NOT NULL, + `SCHED_TIME` bigint NOT NULL, + `PRIORITY` int NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, + INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`; +CREATE TABLE `QRTZ_JOB_DETAILS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE, + INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('schedulerName', 'accessLogCleanJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000197400104A4F425F48414E444C45525F4E414D457400116163636573734C6F67436C65616E4A6F627800), ('schedulerName', 'brokerageRecordUnfreezeJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000187400104A4F425F48414E444C45525F4E414D4574001A62726F6B65726167655265636F7264556E667265657A654A6F627800), ('schedulerName', 'errorLogCleanJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000001A7400104A4F425F48414E444C45525F4E414D457400106572726F724C6F67436C65616E4A6F627800), ('schedulerName', 'jobLogCleanJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000001B7400104A4F425F48414E444C45525F4E414D4574000E6A6F624C6F67436C65616E4A6F627800), ('schedulerName', 'payNotifyJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000057400104A4F425F48414E444C45525F4E414D4574000C7061794E6F746966794A6F627800), ('schedulerName', 'payOrderExpireJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000127400104A4F425F48414E444C45525F4E414D457400117061794F726465724578706972654A6F627800), ('schedulerName', 'payOrderSyncJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000117400104A4F425F48414E444C45525F4E414D4574000F7061794F7264657253796E634A6F627800), ('schedulerName', 'payRefundSyncJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000137400104A4F425F48414E444C45525F4E414D45740010706179526566756E6453796E634A6F627800), ('schedulerName', 'tradeOrderAutoCancelJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000157400104A4F425F48414E444C45525F4E414D4574001774726164654F726465724175746F43616E63656C4A6F627800), ('schedulerName', 'tradeOrderAutoCommentJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000177400104A4F425F48414E444C45525F4E414D4574001874726164654F726465724175746F436F6D6D656E744A6F627800), ('schedulerName', 'tradeOrderAutoReceiveJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000167400104A4F425F48414E444C45525F4E414D4574001874726164654F726465724175746F526563656976654A6F627800); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_LOCKS`; +CREATE TABLE `QRTZ_LOCKS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_LOCKS` (`SCHED_NAME`, `LOCK_NAME`) VALUES ('schedulerName', 'STATE_ACCESS'), ('schedulerName', 'TRIGGER_ACCESS'); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`; +CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`; +CREATE TABLE `QRTZ_SCHEDULER_STATE` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint NOT NULL, + `CHECKIN_INTERVAL` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_SCHEDULER_STATE` (`SCHED_NAME`, `INSTANCE_NAME`, `LAST_CHECKIN_TIME`, `CHECKIN_INTERVAL`) VALUES ('schedulerName', 'MacBook-Pro.local1713489703551', 1713742509534, 15000); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`; +CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `REPEAT_COUNT` bigint NOT NULL, + `REPEAT_INTERVAL` bigint NOT NULL, + `TIMES_TRIGGERED` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`; +CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `INT_PROP_1` int NULL DEFAULT NULL, + `INT_PROP_2` int NULL DEFAULT NULL, + `LONG_PROP_1` bigint NULL DEFAULT NULL, + `LONG_PROP_2` bigint NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_TRIGGERS`; +CREATE TABLE `QRTZ_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint NULL DEFAULT NULL, + `PRIORITY` int NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `START_TIME` bigint NOT NULL, + `END_TIME` bigint NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_J`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_C`(`SCHED_NAME` ASC, `CALENDAR_NAME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_G`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('schedulerName', 'accessLogCleanJob', 'DEFAULT', 'accessLogCleanJob', 'DEFAULT', NULL, 1696348800000, -1, 5, 'PAUSED', 'CRON', 1696301981000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800), ('schedulerName', 'brokerageRecordUnfreezeJob', 'DEFAULT', 'brokerageRecordUnfreezeJob', 'DEFAULT', NULL, 1695909720000, -1, 5, 'PAUSED', 'CRON', 1695909706000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800), ('schedulerName', 'errorLogCleanJob', 'DEFAULT', 'errorLogCleanJob', 'DEFAULT', NULL, 1696348800000, -1, 5, 'PAUSED', 'CRON', 1696302043000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800), ('schedulerName', 'jobLogCleanJob', 'DEFAULT', 'jobLogCleanJob', 'DEFAULT', NULL, 1696348800000, -1, 5, 'PAUSED', 'CRON', 1696302092000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800), ('schedulerName', 'payNotifyJob', 'DEFAULT', 'payNotifyJob', 'DEFAULT', NULL, 1688907102000, 1688907101000, 5, 'PAUSED', 'CRON', 1635294882000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800), ('schedulerName', 'payOrderExpireJob', 'DEFAULT', 'payOrderExpireJob', 'DEFAULT', NULL, 1690011600000, -1, 5, 'PAUSED', 'CRON', 1690011553000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800), ('schedulerName', 'payOrderSyncJob', 'DEFAULT', 'payOrderSyncJob', 'DEFAULT', NULL, 1690011600000, 1690011540000, 5, 'PAUSED', 'CRON', 1690007785000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800), ('schedulerName', 'payRefundSyncJob', 'DEFAULT', 'payRefundSyncJob', 'DEFAULT', NULL, 1690117560000, 1690117500000, 5, 'PAUSED', 'CRON', 1690117424000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800), ('schedulerName', 'tradeOrderAutoCancelJob', 'DEFAULT', 'tradeOrderAutoCancelJob', 'DEFAULT', NULL, 1695727440000, 1695727380000, 5, 'PAUSED', 'CRON', 1695656605000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800), ('schedulerName', 'tradeOrderAutoCommentJob', 'DEFAULT', 'tradeOrderAutoCommentJob', 'DEFAULT', NULL, 1695783840000, 1695783780000, 5, 'PAUSED', 'CRON', 1695742709000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800), ('schedulerName', 'tradeOrderAutoReceiveJob', 'DEFAULT', 'tradeOrderAutoReceiveJob', 'DEFAULT', NULL, 1695742740000, 1695742680000, 5, 'PAUSED', 'CRON', 1695727433000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D7400007400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E547371007E000A000000037800); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/mysql/ruoyi-vue-pro.sql b/sql/mysql/ruoyi-vue-pro.sql new file mode 100644 index 0000000..88bf752 --- /dev/null +++ b/sql/mysql/ruoyi-vue-pro.sql @@ -0,0 +1,3754 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 MySQL + Source Server Type : MySQL + Source Server Version : 80200 (8.2.0) + Source Host : 127.0.0.1:3306 + Source Schema : ruoyi-vue-pro + + Target Server Type : MySQL + Target Server Version : 80200 (8.2.0) + File Encoding : 65001 + + Date: 07/10/2024 15:55:58 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS `infra_api_access_log`; +CREATE TABLE `infra_api_access_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户编号', + `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', + `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法名', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求地址', + `request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '请求参数', + `response_body` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '响应结果', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', + `operate_module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '操作模块', + `operate_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '操作名', + `operate_type` tinyint NULL DEFAULT 0 COMMENT '操作分类', + `begin_time` datetime NOT NULL COMMENT '开始请求时间', + `end_time` datetime NOT NULL COMMENT '结束请求时间', + `duration` int NOT NULL COMMENT '执行时长', + `result_code` int NOT NULL DEFAULT 0 COMMENT '结果码', + `result_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果提示', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_create_time`(`create_time` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 35942 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表'; + +-- ---------------------------- +-- Records of infra_api_access_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS `infra_api_error_log`; +CREATE TABLE `infra_api_error_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '链路追踪编号', + `user_id` int NOT NULL DEFAULT 0 COMMENT '用户编号', + `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', + `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求方法名', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求地址', + `request_params` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求参数', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', + `exception_time` datetime NOT NULL COMMENT '异常发生时间', + `exception_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '异常名', + `exception_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常导致的消息', + `exception_root_cause_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常导致的根消息', + `exception_stack_trace` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常的栈轨迹', + `exception_class_name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的类全名', + `exception_file_name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的类文件', + `exception_method_name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的方法名', + `exception_line_number` int NOT NULL COMMENT '异常发生的方法所在行', + `process_status` tinyint NOT NULL COMMENT '处理状态', + `process_time` datetime NULL DEFAULT NULL COMMENT '处理时间', + `process_user_id` int NULL DEFAULT 0 COMMENT '处理用户编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 21016 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志'; + +-- ---------------------------- +-- Records of infra_api_error_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS `infra_codegen_column`; +CREATE TABLE `infra_codegen_column` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` bigint NOT NULL COMMENT '表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段名', + `data_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段描述', + `nullable` bit(1) NOT NULL COMMENT '是否允许为空', + `primary_key` bit(1) NOT NULL COMMENT '是否主键', + `ordinal_position` int NOT NULL COMMENT '排序', + `java_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Java 属性类型', + `java_field` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Java 属性名', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '字典类型', + `example` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '数据示例', + `create_operation` bit(1) NOT NULL COMMENT '是否为 Create 创建操作的字段', + `update_operation` bit(1) NOT NULL COMMENT '是否为 Update 更新操作的字段', + `list_operation` bit(1) NOT NULL COMMENT '是否为 List 查询操作的字段', + `list_operation_condition` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '=' COMMENT 'List 查询操作的条件类型', + `list_operation_result` bit(1) NOT NULL COMMENT '是否为 List 查询操作的返回字段', + `html_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '显示类型', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2483 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义'; + +-- ---------------------------- +-- Records of infra_codegen_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS `infra_codegen_table`; +CREATE TABLE `infra_codegen_table` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `data_source_config_id` bigint NOT NULL COMMENT '数据源配置的编号', + `scene` tinyint NOT NULL DEFAULT 1 COMMENT '生成场景', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '表描述', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '业务名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类名称', + `class_comment` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类描述', + `author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作者', + `template_type` tinyint NOT NULL DEFAULT 1 COMMENT '模板类型', + `front_type` tinyint NOT NULL COMMENT '前端类型', + `parent_menu_id` bigint NULL DEFAULT NULL COMMENT '父菜单编号', + `master_table_id` bigint NULL DEFAULT NULL COMMENT '主表的编号', + `sub_join_column_id` bigint NULL DEFAULT NULL COMMENT '子表关联主表的字段编号', + `sub_join_many` bit(1) NULL DEFAULT NULL COMMENT '主表与子表是否一对多', + `tree_parent_column_id` bigint NULL DEFAULT NULL COMMENT '树表的父字段编号', + `tree_name_column_id` bigint NULL DEFAULT NULL COMMENT '树表的名字字段编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 187 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表定义'; + +-- ---------------------------- +-- Records of infra_codegen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS `infra_config`; +CREATE TABLE `infra_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数分组', + `type` tinyint NOT NULL COMMENT '参数类型', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数键名', + `value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数键值', + `visible` bit(1) NOT NULL COMMENT '是否可见', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +BEGIN; +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'system.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-07-20 17:22:47', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', b'1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 'test2', 2, 'test3', 'test4', 'test5', b'1', 'test6', '1', '2023-12-03 09:55:16', '1', '2023-12-03 09:55:27', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS `infra_data_source_config`; +CREATE TABLE `infra_data_source_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', + `url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '数据源连接', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '数据源配置表'; + +-- ---------------------------- +-- Records of infra_data_source_config +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS `infra_file`; +CREATE TABLE `infra_file` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '文件编号', + `config_id` bigint NULL DEFAULT NULL COMMENT '配置编号', + `name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件名', + `path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径', + `url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件 URL', + `type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件类型', + `size` int NOT NULL COMMENT '文件大小', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1509 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; + +-- ---------------------------- +-- Records of infra_file +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS `infra_file_config`; +CREATE TABLE `infra_file_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '配置名', + `storage` tinyint NOT NULL COMMENT '存储器', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `master` bit(1) NOT NULL COMMENT '是否为主配置', + `config` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '存储配置', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 24 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +BEGIN; +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '数据库', 1, '我是数据库', b'0', '{\"@class\":\"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig\",\"domain\":\"http://127.0.0.1:48080\"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', b'0'); +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (22, '七牛存储器', 20, '', b'1', '{\"@class\":\"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3.cn-south-1.qiniucs.com\",\"domain\":\"http://test.win.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS\",\"accessSecret\":\"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY\"}', '1', '2024-01-13 22:11:12', '1', '2024-04-03 19:38:34', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS `infra_file_content`; +CREATE TABLE `infra_file_content` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `config_id` bigint NOT NULL COMMENT '配置编号', + `path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径', + `content` mediumblob NOT NULL COMMENT '文件内容', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 283 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; + +-- ---------------------------- +-- Records of infra_file_content +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS `infra_job`; +CREATE TABLE `infra_job` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务编号', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', + `status` tinyint NOT NULL COMMENT '任务状态', + `handler_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '处理器的名字', + `handler_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '处理器的参数', + `cron_expression` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'CRON 表达式', + `retry_count` int NOT NULL DEFAULT 0 COMMENT '重试次数', + `retry_interval` int NOT NULL DEFAULT 0 COMMENT '重试间隔', + `monitor_timeout` int NOT NULL DEFAULT 0 COMMENT '监控超时时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +BEGIN; +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2024-09-12 13:32:48', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 14:36:26', '1', '2023-07-22 15:39:08', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 15:36:23', '1', '2023-07-22 15:39:54', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-23 21:03:44', '1', '2023-07-23 21:09:00', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (21, '交易订单的自动过期 Job', 2, 'tradeOrderAutoCancelJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-25 23:43:26', '1', '2023-09-26 19:23:30', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (22, '交易订单的自动收货 Job', 2, 'tradeOrderAutoReceiveJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 19:23:53', '1', '2023-09-26 23:38:08', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (23, '交易订单的自动评论 Job', 2, 'tradeOrderAutoCommentJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 23:38:29', '1', '2023-09-27 11:03:10', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (24, '佣金解冻 Job', 2, 'brokerageRecordUnfreezeJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-28 22:01:46', '1', '2023-09-28 22:01:56', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (25, '访问日志清理 Job', 2, 'accessLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 10:59:41', '1', '2023-10-03 11:01:10', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (26, '错误日志清理 Job', 2, 'errorLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:00:43', '1', '2023-10-03 11:01:12', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (27, '任务日志清理 Job', 2, 'jobLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:01:33', '1', '2024-09-12 13:40:34', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `infra_job_log`; +CREATE TABLE `infra_job_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志编号', + `job_id` bigint NOT NULL COMMENT '任务编号', + `handler_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '处理器的名字', + `handler_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '处理器的参数', + `execute_index` tinyint NOT NULL DEFAULT 1 COMMENT '第几次执行', + `begin_time` datetime NOT NULL COMMENT '开始执行时间', + `end_time` datetime NULL DEFAULT NULL COMMENT '结束执行时间', + `duration` int NULL DEFAULT NULL COMMENT '执行时长', + `status` tinyint NOT NULL COMMENT '任务状态', + `result` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果数据', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 634 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务日志表'; + +-- ---------------------------- +-- Records of infra_job_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS `system_dept`; +CREATE TABLE `system_dept` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名称', + `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父部门id', + `sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序', + `leader_user_id` bigint NULL DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', + `status` tinyint NOT NULL COMMENT '部门状态(0正常 1停用)', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 115 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +BEGIN; +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-11-14 23:30:36', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:53:35', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, '研发部门', 101, 1, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2024-10-02 10:22:03', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:15', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (107, '运维部门', 101, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:28:22', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-02-16 08:35:45', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', b'0', 121); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', b'0', 122); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (112, '产品部门', 101, 100, 1, NULL, NULL, 1, '1', '2023-12-02 09:45:13', '1', '2023-12-02 09:45:31', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (113, '支持部门', 102, 3, 104, NULL, NULL, 1, '1', '2023-12-02 09:47:38', '1', '2023-12-02 09:47:38', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `system_dict_data`; +CREATE TABLE `system_dict_data` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `sort` int NOT NULL DEFAULT 0 COMMENT '字典排序', + `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典标签', + `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典类型', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)', + `color_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '颜色类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'css 样式', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1593 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +BEGIN; +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', '2022-03-29 00:14:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 2, '女', '2', 'system_user_sex', 0, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 23:30:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:05:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:06:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 0, '其它', '0', 'infra_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, 1, '查询', '1', 'infra_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (18, 2, '新增', '2', 'infra_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (19, 3, '修改', '3', 'infra_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (20, 4, '删除', '4', 'infra_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (22, 5, '导出', '5', 'infra_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (23, 6, '导入', '6', 'infra_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', '2022-02-16 13:23:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:09:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', '2022-03-10 16:33:15', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', '2022-03-10 16:33:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', '2022-02-16 19:33:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', '2022-02-16 19:07:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', '2022-02-16 19:07:52', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', '2022-02-16 19:07:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', '2021-02-26 00:16:27', '1', '2022-02-16 10:22:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', '2021-02-26 00:16:34', '1', '2022-02-16 10:22:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (66, 1, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2024-07-22 22:23:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-16 10:26:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-16 10:25:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-16 10:26:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-16 10:26:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-16 10:28:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-16 10:28:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-16 10:28:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-16 13:11:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-16 13:11:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-16 13:11:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-16 13:11:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', '2022-02-16 10:00:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', '2022-02-16 10:00:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', '2022-02-16 10:00:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', '2021-12-03 10:40:24', '1', '2023-07-19 20:08:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2023-07-19 20:08:50', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2023-07-19 20:08:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2023-07-19 20:09:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2023-07-19 20:09:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', '2021-12-03 10:42:55', '1', '2023-07-19 20:09:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2023-07-19 20:09:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', '1', '2023-07-19 10:08:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', '1', '2023-07-19 10:08:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', '2023-07-19 10:08:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', '2023-07-19 18:04:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', '2023-07-19 18:05:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', '2023-07-19 18:04:15', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (600, 5, '首页', '1', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (601, 4, '秒杀活动页', '2', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (602, 3, '砍价活动页', '3', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (603, 2, '限时折扣页', '4', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (604, 1, '满减送页', '5', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', '2021-12-10 16:44:59', '1', '2023-07-19 10:14:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', '1', '2023-07-19 10:15:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:46:26', '1', '2023-07-19 10:15:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1127, 1, '审批中', '1', 'bpm_process_instance_status', 0, 'default', '', '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2024-03-16 16:11:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1128, 2, '审批通过', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2024-03-16 16:11:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1129, 1, '审批中', '1', 'bpm_task_status', 0, 'primary', '', '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2024-03-08 22:41:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1130, 2, '审批通过', '2', 'bpm_task_status', 0, 'success', '', '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2024-03-08 22:41:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1131, 3, '审批不通过', '3', 'bpm_task_status', 0, 'danger', '', '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2024-03-08 22:41:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1132, 4, '已取消', '4', 'bpm_task_status', 0, 'info', '', '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2024-03-08 22:41:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1135, 10, '角色', '10', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '1', '2024-03-06 02:53:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '1', '2024-03-06 02:53:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2024-03-06 02:53:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1138, 30, '用户', '30', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '1', '2024-03-06 02:53:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1139, 40, '用户组', '40', 'bpm_task_candidate_strategy', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '1', '2024-03-06 02:53:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1140, 60, '流程表达式', '60', 'bpm_task_candidate_strategy', 0, 'danger', '', '任务分配规则的类型 - 流程表达式', '103', '2022-01-12 23:34:43', '1', '2024-03-06 02:53:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1141, 22, '岗位', '22', 'bpm_task_candidate_strategy', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '1', '2024-03-06 02:53:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', '2022-03-15 00:25:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', '2022-03-15 00:25:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', '2022-03-15 00:26:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', '2022-03-15 00:26:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', '2022-03-15 00:26:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', '2022-05-09 23:58:09', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', '2022-10-24 21:19:47', '1', '2022-10-24 21:20:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', '2022-10-24 21:20:54', '1', '2022-10-24 21:21:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', '2022-10-24 21:21:11', '1', '2022-10-24 21:21:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', '2022-11-01 12:46:41', '1', '2022-11-01 12:50:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', '2022-11-01 12:46:51', '1', '2022-11-01 12:50:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', '2022-11-02 00:07:34', '1', '2022-11-04 00:07:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', '2022-11-02 00:07:54', '1', '2022-11-04 00:07:52', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1169, 1, '通用劵', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', '2022-11-02 00:28:22', '1', '2023-09-28 00:27:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1170, 2, '商品劵', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', '2022-11-02 00:28:34', '1', '2023-09-28 00:27:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1171, 1, '未使用', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', '2022-11-04 00:15:08', '1', '2023-10-03 12:54:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', '2022-11-04 00:15:21', '1', '2022-11-04 19:16:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', '2022-11-04 00:15:43', '1', '2022-11-04 19:16:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', '2022-11-04 19:13:00', '1', '2022-11-04 19:13:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', '2022-11-04 19:13:13', '1', '2022-11-04 19:14:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', '2022-11-04 22:54:49', '1', '2022-11-04 22:55:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', '2022-11-04 22:55:06', '1', '2022-11-04 22:55:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', '2022-11-04 22:55:41', '1', '2022-11-04 22:55:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', '2022-11-04 22:56:10', '1', '2022-11-04 22:56:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', '2022-11-04 22:59:45', '1', '2022-11-04 22:59:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', '2022-11-04 23:00:02', '1', '2022-11-04 23:00:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', '2022-11-19 20:53:33', '1', '2022-11-19 20:54:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', '2022-11-19 20:54:36', '1', '2022-11-19 20:58:58', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', '2022-11-19 20:56:56', '1', '2022-11-19 20:59:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', '2022-11-19 20:59:54', '1', '2022-11-19 21:00:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', '2022-11-19 21:00:33', '1', '2022-11-19 21:00:33', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', '2022-11-19 21:01:29', '1', '2022-11-19 21:01:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', '2022-11-19 21:02:17', '1', '2022-11-19 21:02:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', '2022-11-19 21:02:37', '1', '2022-11-19 21:03:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', '2022-11-19 21:05:05', '1', '2022-11-19 21:38:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', '2022-11-19 21:05:32', '1', '2022-11-19 21:38:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', '2022-11-19 21:39:19', '1', '2022-11-19 21:39:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', '2022-11-19 21:39:38', '1', '2022-11-19 21:39:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', '2022-12-10 10:51:11', '1', '2022-12-10 10:51:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', '2022-12-10 10:51:30', '1', '2022-12-10 10:51:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', '2022-12-10 10:54:16', '1', '2022-12-10 10:52:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', '2022-12-10 10:54:42', '1', '2022-12-10 10:52:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', '2022-12-10 10:55:02', '1', '2022-12-10 10:59:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', '2022-12-10 16:34:14', '1', '2022-12-10 16:34:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', '2022-12-10 16:34:26', '1', '2022-12-10 16:34:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1201, 2, '砍价订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', '2022-12-10 16:34:36', '1', '2024-09-07 14:18:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1202, 3, '拼团订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', '2022-12-10 16:34:48', '1', '2024-09-07 14:18:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', '2022-12-10 16:49:29', '1', '2022-12-10 16:49:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', '2022-12-10 16:49:53', '1', '2022-12-10 16:51:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', '2022-12-10 16:50:13', '1', '2022-12-10 16:51:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1209, 10, '售后中', '10', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2024-07-21 17:01:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1210, 20, '已退款', '20', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2024-07-21 17:01:35', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:20:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:21:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:23:51', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', '2023-01-26 09:53:49', '1', '2023-01-26 16:36:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', '2023-01-26 09:54:28', '1', '2023-01-26 16:36:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', '2023-01-26 09:54:50', '1', '2023-01-26 16:36:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', '2023-01-26 09:55:06', '1', '2023-01-26 16:36:36', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', '2023-01-28 10:35:59', '1', '2023-01-28 10:35:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', '2023-01-28 10:36:20', '1', '2023-01-28 10:36:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', '2023-02-18 23:32:24', '1', '2023-07-19 20:09:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:03:55', '1', '2023-04-13 00:03:55', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1335, 11, '订单积分抵扣', '11', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-10-11 07:41:43', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-08-20 11:59:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', '2023-07-19 18:05:37', '1', '2023-07-19 18:05:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', '2023-07-19 18:10:47', '1', '2023-07-19 18:11:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', '2023-07-19 18:11:05', '1', '2023-07-19 18:11:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', '2023-07-19 20:07:47', '1', '2023-07-19 20:09:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', '2023-07-19 20:08:06', '1', '2023-07-19 20:09:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', '2023-07-20 12:23:17', '1', '2023-07-20 12:23:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', '2023-07-20 12:23:26', '1', '2023-07-20 12:23:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', '2023-07-29 11:10:51', '1', '2023-07-29 03:14:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1349, 12, '订单积分抵扣(整单取消)', '12', 'member_point_biz_type', 0, '', '', '', '1', '2023-08-20 12:00:03', '1', '2023-10-11 07:42:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1352, 11, '下单奖励', '11', 'member_experience_biz_type', 0, 'success', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:09', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1353, 12, '下单奖励(整单取消)', '12', 'member_experience_biz_type', 0, 'warning', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:04:55', '1', '2023-08-23 00:04:55', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:05:05', '1', '2023-08-23 00:05:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1358, 3, '品类劵', '3', 'promotion_product_scope', 0, 'default', '', '', '1', '2023-09-01 23:43:07', '1', '2023-09-28 00:27:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1359, 1, '人人分销', '1', 'brokerage_enabled_condition', 0, '', '', '所有用户都可以分销', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1360, 2, '指定分销', '2', 'brokerage_enabled_condition', 0, '', '', '仅可后台手动设置推广员', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1361, 1, '首次绑定', '1', 'brokerage_bind_mode', 0, '', '', '只要用户没有推广人,随时都可以绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1362, 2, '注册绑定', '2', 'brokerage_bind_mode', 0, '', '', '仅新用户注册时才能绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1363, 3, '覆盖绑定', '3', 'brokerage_bind_mode', 0, '', '', '如果用户已经有推广人,推广人会被变更', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1364, 1, '钱包', '1', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1365, 2, '银行卡', '2', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1366, 3, '微信', '3', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1367, 4, '支付宝', '4', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1368, 1, '订单返佣', '1', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1369, 2, '申请提现', '2', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1370, 3, '申请提现驳回', '3', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1371, 0, '待结算', '0', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1372, 1, '已结算', '1', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1373, 2, '已取消', '2', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1374, 0, '审核中', '0', 'brokerage_withdraw_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1375, 10, '审核通过', '10', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1376, 11, '提现成功', '11', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1377, 20, '审核不通过', '20', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1378, 21, '提现失败', '21', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1379, 0, '工商银行', '0', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1380, 1, '建设银行', '1', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1381, 2, '农业银行', '2', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1382, 3, '中国银行', '3', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1383, 4, '交通银行', '4', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1384, 5, '招商银行', '5', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1385, 21, '钱包', 'wallet', 'pay_channel_code', 0, 'primary', '', '', '1', '2023-10-01 21:46:19', '1', '2023-10-01 21:48:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1386, 1, '砍价中', '1', 'promotion_bargain_record_status', 0, 'default', '', '', '1', '2023-10-05 10:41:26', '1', '2023-10-05 10:41:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1387, 2, '砍价成功', '2', 'promotion_bargain_record_status', 0, 'success', '', '', '1', '2023-10-05 10:41:39', '1', '2023-10-05 10:41:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1388, 3, '砍价失败', '3', 'promotion_bargain_record_status', 0, 'warning', '', '', '1', '2023-10-05 10:41:57', '1', '2023-10-05 10:41:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1389, 1, '拼团中', '1', 'promotion_combination_record_status', 0, '', '', '', '1', '2023-10-08 07:24:44', '1', '2023-10-08 07:24:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1390, 2, '拼团成功', '2', 'promotion_combination_record_status', 0, 'success', '', '', '1', '2023-10-08 07:24:56', '1', '2023-10-08 07:24:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1391, 3, '拼团失败', '3', 'promotion_combination_record_status', 0, 'warning', '', '', '1', '2023-10-08 07:25:11', '1', '2023-10-08 07:25:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1392, 2, '管理员修改', '2', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:41:34', '1', '2023-10-11 07:41:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1393, 13, '订单积分抵扣(单个退款)', '13', 'member_point_biz_type', 0, '', '', '', '1', '2023-10-11 07:42:29', '1', '2023-10-11 07:42:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1394, 21, '订单积分奖励', '21', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:44', '1', '2023-10-11 07:42:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1395, 22, '订单积分奖励(整单取消)', '22', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:55', '1', '2023-10-11 07:43:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1396, 23, '订单积分奖励(单个退款)', '23', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:43:16', '1', '2023-10-11 07:43:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1397, 13, '下单奖励(单个退款)', '13', 'member_experience_biz_type', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1398, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1399, 6, '支付宝', '6', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:38', '1', '2023-10-18 21:55:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1400, 7, '微信支付', '7', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:53', '1', '2023-10-18 21:55:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1401, 8, '其他', '8', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1402, 1, 'IT', '1', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:15', '1', '2024-02-18 23:30:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1403, 2, '金融业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:29', '1', '2024-02-18 23:30:43', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1404, 3, '房地产', '3', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:41', '1', '2024-02-18 23:30:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1405, 4, '商业服务', '4', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:54', '1', '2024-02-18 23:30:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1406, 5, '运输/物流', '5', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:03', '1', '2024-02-18 23:31:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1407, 6, '生产', '6', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:13', '1', '2024-02-18 23:31:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1408, 7, '政府', '7', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:27', '1', '2024-02-18 23:31:13', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1409, 8, '文化传媒', '8', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:37', '1', '2024-02-18 23:31:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', '2023-10-28 23:07:13', '1', '2023-10-28 23:07:13', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', '2023-10-28 23:07:35', '1', '2023-10-28 23:07:35', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', '2023-10-28 23:07:53', '1', '2023-10-28 23:07:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:29', '1', '2023-10-28 23:08:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:39', '1', '2023-10-28 23:08:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:47', '1', '2023-10-28 23:08:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:58', '1', '2023-10-28 23:08:58', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:12', '1', '2023-10-28 23:09:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:22', '1', '2023-10-28 23:09:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:39', '1', '2023-10-28 23:09:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:04', '1', '2023-10-28 23:10:04', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:18', '1', '2023-10-28 23:10:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:33', '1', '2023-10-28 23:10:33', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1435, 10, 'Gitee', '10', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:42', '1', '2023-11-04 13:04:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1436, 20, '钉钉', '20', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:54', '1', '2023-11-04 13:04:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1437, 30, '企业微信', '30', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:09', '1', '2023-11-04 13:05:09', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1438, 31, '微信公众平台', '31', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:18', '1', '2023-11-04 13:05:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1439, 32, '微信开放平台', '32', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:30', '1', '2023-11-04 13:05:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1440, 34, '微信小程序', '34', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:38', '1', '2023-11-04 13:07:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1441, 1, '上架', '1', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:34', '1', '2023-10-30 21:49:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1442, 0, '下架', '0', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:13', '1', '2023-10-30 21:49:13', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1443, 15, '子表', '15', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-13 23:06:16', '1', '2023-11-13 23:06:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1444, 10, '主表(标准模式)', '10', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:32:49', '1', '2023-11-14 12:32:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1445, 11, '主表(ERP 模式)', '11', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:33:05', '1', '2023-11-14 12:33:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1446, 12, '主表(内嵌模式)', '12', 'infra_codegen_template_type', 0, '', '', '', '1', '2023-11-14 12:33:31', '1', '2023-11-14 12:33:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1447, 1, '负责人', '1', 'crm_permission_level', 0, 'default', '', '', '1', '2023-11-30 09:53:12', '1', '2023-11-30 09:53:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1448, 2, '只读', '2', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:29', '1', '2023-11-30 09:53:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1449, 3, '读写', '3', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:36', '1', '2023-11-30 09:53:36', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1450, 0, '未提交', '0', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:56:59', '1', '2023-11-30 18:56:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1451, 10, '审批中', '10', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:10', '1', '2023-11-30 18:57:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1452, 20, '审核通过', '20', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:24', '1', '2023-11-30 18:57:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1453, 30, '审核不通过', '30', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:32', '1', '2023-11-30 18:57:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1454, 40, '已取消', '40', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:42', '1', '2023-11-30 18:57:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1456, 1, '支票', '1', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:29', '1', '2023-10-18 21:54:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1464, 4, '把', '4', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:05', '1', '2023-12-05 23:03:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1465, 5, '枚', '5', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:14', '1', '2023-12-05 23:03:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1466, 6, '瓶', '6', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:20', '1', '2023-12-05 23:03:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1467, 7, '盒', '7', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:30', '1', '2023-12-05 23:03:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1468, 8, '台', '8', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:41', '1', '2023-12-05 23:03:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1469, 9, '吨', '9', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:48', '1', '2023-12-05 23:03:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1470, 10, '千克', '10', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:03', '1', '2023-12-05 23:04:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1471, 11, '米', '11', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:12', '1', '2023-12-05 23:04:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1472, 12, '箱', '12', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:25', '1', '2023-12-05 23:04:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1473, 13, '套', '13', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:34', '1', '2023-12-05 23:04:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1474, 1, '打电话', '1', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:20', '1', '2024-01-15 20:48:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1475, 2, '发短信', '2', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:31', '1', '2024-01-15 20:48:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1476, 3, '上门拜访', '3', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:07', '1', '2024-01-15 20:49:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1477, 4, '微信沟通', '4', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:15', '1', '2024-01-15 20:49:15', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1478, 4, '钱包余额', '4', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:37', '1', '2023-10-28 16:28:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1479, 3, '银行卡', '3', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:28:21', '1', '2023-10-28 16:28:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1480, 2, '微信余额', '2', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:07', '1', '2023-10-28 16:28:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1481, 1, '支付宝余额', '1', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:27:44', '1', '2023-10-28 16:27:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1482, 4, '转账失败', '30', 'pay_transfer_status', 0, 'warning', '', '', '1', '2023-10-28 16:24:16', '1', '2023-10-28 16:24:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1483, 3, '转账成功', '20', 'pay_transfer_status', 0, 'success', '', '', '1', '2023-10-28 16:23:50', '1', '2023-10-28 16:23:50', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1484, 2, '转账进行中', '10', 'pay_transfer_status', 0, 'info', '', '', '1', '2023-10-28 16:23:12', '1', '2023-10-28 16:23:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1485, 1, '等待转账', '0', 'pay_transfer_status', 0, 'default', '', '', '1', '2023-10-28 16:21:43', '1', '2023-10-28 16:23:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1486, 10, '其它入库', '10', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:07:25', '1', '2024-02-05 18:07:43', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1487, 11, '其它入库(作废)', '11', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:08:07', '1', '2024-02-05 19:20:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1488, 20, '其它出库', '20', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:08:51', '1', '2024-02-05 18:08:51', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1489, 21, '其它出库(作废)', '21', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:09:00', '1', '2024-02-05 19:20:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1490, 10, '未审核', '10', 'erp_audit_status', 0, 'default', '', '', '1', '2024-02-06 00:00:21', '1', '2024-02-06 00:00:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1491, 20, '已审核', '20', 'erp_audit_status', 0, 'success', '', '', '1', '2024-02-06 00:00:35', '1', '2024-02-06 00:00:35', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1492, 30, '调拨入库', '30', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:19', '1', '2024-02-07 12:36:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1493, 31, '调拨入库(作废)', '31', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:29', '1', '2024-02-07 20:37:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1494, 32, '调拨出库', '32', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:38', '1', '2024-02-07 12:36:33', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1495, 33, '调拨出库(作废)', '33', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:49', '1', '2024-02-07 20:37:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1496, 40, '盘盈入库', '40', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:53:00', '1', '2024-02-08 08:53:09', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1497, 41, '盘盈入库(作废)', '41', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:53:39', '1', '2024-02-16 19:40:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1498, 42, '盘亏出库', '42', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:54:16', '1', '2024-02-08 08:54:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1499, 43, '盘亏出库(作废)', '43', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:54:31', '1', '2024-02-16 19:40:46', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1500, 50, '销售出库', '50', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-11 21:47:25', '1', '2024-02-11 21:50:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1501, 51, '销售出库(作废)', '51', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-11 21:47:37', '1', '2024-02-11 21:51:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1502, 60, '销售退货入库', '60', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-12 06:51:05', '1', '2024-02-12 06:51:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1503, 61, '销售退货入库(作废)', '61', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-12 06:51:18', '1', '2024-02-12 06:51:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1504, 70, '采购入库', '70', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:02', '1', '2024-02-16 13:10:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1505, 71, '采购入库(作废)', '71', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:10', '1', '2024-02-16 19:40:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1506, 80, '采购退货出库', '80', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:17', '1', '2024-02-16 13:10:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1507, 81, '采购退货出库(作废)', '81', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:26', '1', '2024-02-16 19:40:33', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1509, 3, '审批不通过', '3', 'bpm_process_instance_status', 0, 'danger', '', '', '1', '2024-03-16 16:12:06', '1', '2024-03-16 16:12:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1510, 4, '已取消', '4', 'bpm_process_instance_status', 0, 'warning', '', '', '1', '2024-03-16 16:12:22', '1', '2024-03-16 16:12:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1511, 5, '已退回', '5', 'bpm_task_status', 0, 'warning', '', '', '1', '2024-03-16 19:10:46', '1', '2024-03-08 22:41:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1512, 6, '委派中', '6', 'bpm_task_status', 0, 'primary', '', '', '1', '2024-03-17 10:06:22', '1', '2024-03-08 22:41:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1513, 7, '审批通过中', '7', 'bpm_task_status', 0, 'success', '', '', '1', '2024-03-17 10:06:47', '1', '2024-03-08 22:41:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1514, 0, '待审批', '0', 'bpm_task_status', 0, 'info', '', '', '1', '2024-03-17 10:07:11', '1', '2024-03-08 22:41:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1515, 35, '发起人自选', '35', 'bpm_task_candidate_strategy', 0, '', '', '', '1', '2024-03-22 19:45:16', '1', '2024-03-22 19:45:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1516, 1, '执行监听器', 'execution', 'bpm_process_listener_type', 0, 'primary', '', '', '1', '2024-03-23 12:54:03', '1', '2024-03-23 19:14:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1517, 1, '任务监听器', 'task', 'bpm_process_listener_type', 0, 'success', '', '', '1', '2024-03-23 12:54:13', '1', '2024-03-23 19:14:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1526, 1, 'Java 类', 'class', 'bpm_process_listener_value_type', 0, 'primary', '', '', '1', '2024-03-23 15:08:45', '1', '2024-03-23 19:14:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1527, 2, '表达式', 'expression', 'bpm_process_listener_value_type', 0, 'success', '', '', '1', '2024-03-23 15:09:06', '1', '2024-03-23 19:14:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1528, 3, '代理表达式', 'delegateExpression', 'bpm_process_listener_value_type', 0, 'info', '', '', '1', '2024-03-23 15:11:23', '1', '2024-03-23 19:14:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1529, 1, '天', '1', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:26', '1', '2024-03-29 22:50:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1530, 2, '周', '2', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:36', '1', '2024-03-29 22:50:36', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1531, 3, '月', '3', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:46', '1', '2024-03-29 22:50:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1532, 4, '季度', '4', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:01', '1', '2024-03-29 22:51:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1533, 5, '年', '5', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:07', '1', '2024-03-29 22:51:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1534, 1, '赢单', '1', 'crm_business_end_status_type', 0, 'success', '', '', '1', '2024-04-13 23:26:57', '1', '2024-04-13 23:26:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1535, 2, '输单', '2', 'crm_business_end_status_type', 0, 'primary', '', '', '1', '2024-04-13 23:27:31', '1', '2024-04-13 23:27:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1536, 3, '无效', '3', 'crm_business_end_status_type', 0, 'info', '', '', '1', '2024-04-13 23:27:59', '1', '2024-04-13 23:27:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1537, 1, 'OpenAI', 'OpenAI', 'ai_platform', 0, '', '', '', '1', '2024-05-09 22:33:47', '1', '2024-05-09 22:58:46', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1538, 2, 'Ollama', 'Ollama', 'ai_platform', 0, '', '', '', '1', '2024-05-17 23:02:55', '1', '2024-05-17 23:02:55', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1539, 3, '文心一言', 'YiYan', 'ai_platform', 0, '', '', '', '1', '2024-05-18 09:24:20', '1', '2024-05-18 09:29:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1540, 4, '讯飞星火', 'XingHuo', 'ai_platform', 0, '', '', '', '1', '2024-05-18 10:08:56', '1', '2024-05-18 10:08:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1541, 5, '通义千问', 'TongYi', 'ai_platform', 0, '', '', '', '1', '2024-05-18 10:32:29', '1', '2024-07-06 15:42:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1542, 6, 'StableDiffusion', 'StableDiffusion', 'ai_platform', 0, '', '', '', '1', '2024-06-01 15:09:31', '1', '2024-06-01 15:10:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1543, 10, '进行中', '10', 'ai_image_status', 0, 'primary', '', '', '1', '2024-06-26 20:51:41', '1', '2024-06-26 20:52:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1544, 20, '已完成', '20', 'ai_image_status', 0, 'success', '', '', '1', '2024-06-26 20:52:07', '1', '2024-06-26 20:52:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1545, 30, '已失败', '30', 'ai_image_status', 0, 'warning', '', '', '1', '2024-06-26 20:52:25', '1', '2024-06-26 20:52:35', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1546, 7, 'Midjourney', 'Midjourney', 'ai_platform', 0, '', '', '', '1', '2024-06-26 22:14:46', '1', '2024-06-26 22:14:46', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1547, 10, '进行中', '10', 'ai_music_status', 0, 'primary', '', '', '1', '2024-06-27 22:45:22', '1', '2024-06-28 00:56:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1548, 20, '已完成', '20', 'ai_music_status', 0, 'success', '', '', '1', '2024-06-27 22:45:33', '1', '2024-06-28 00:56:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1549, 30, '已失败', '30', 'ai_music_status', 0, 'danger', '', '', '1', '2024-06-27 22:45:44', '1', '2024-06-28 00:56:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1550, 1, '歌词模式', '1', 'ai_generate_mode', 0, '', '', '', '1', '2024-06-27 22:46:31', '1', '2024-06-28 01:22:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1551, 2, '描述模式', '2', 'ai_generate_mode', 0, '', '', '', '1', '2024-06-27 22:46:37', '1', '2024-06-28 01:22:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1552, 8, 'Suno', 'Suno', 'ai_platform', 0, '', '', '', '1', '2024-06-29 09:13:36', '1', '2024-06-29 09:13:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1553, 9, 'DeepSeek', 'DeepSeek', 'ai_platform', 0, '', '', '', '1', '2024-07-06 12:04:30', '1', '2024-07-06 12:05:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1554, 10, '智谱', 'ZhiPu', 'ai_platform', 0, '', '', '', '1', '2024-07-06 18:00:35', '1', '2024-07-06 18:00:35', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1555, 4, '长', '4', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:49:03', '1', '2024-07-07 15:49:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1556, 5, '段落', '5', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:49:54', '1', '2024-07-07 15:49:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1557, 6, '文章', '6', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:05', '1', '2024-07-07 15:50:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1558, 7, '博客文章', '7', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:23', '1', '2024-07-07 15:50:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1559, 8, '想法', '8', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:31', '1', '2024-07-07 15:50:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1560, 9, '大纲', '9', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:50:37', '1', '2024-07-07 15:50:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1561, 1, '自动', '1', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:06', '1', '2024-07-07 15:51:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1562, 2, '友善', '2', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:19', '1', '2024-07-07 15:51:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1563, 3, '随意', '3', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:27', '1', '2024-07-07 15:51:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1564, 4, '友好', '4', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:37', '1', '2024-07-07 15:51:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1565, 5, '专业', '5', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:51:49', '1', '2024-07-07 15:52:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1566, 6, '诙谐', '6', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:52:15', '1', '2024-07-07 15:52:15', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1567, 7, '有趣', '7', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:52:24', '1', '2024-07-07 15:52:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1568, 8, '正式', '8', 'ai_write_tone', 0, '', '', '', '1', '2024-07-07 15:54:33', '1', '2024-07-07 15:54:33', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1569, 5, '段落', '5', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:49:54', '1', '2024-07-07 15:49:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1570, 1, '自动', '1', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:19:34', '1', '2024-07-07 15:19:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1571, 2, '电子邮件', '2', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:19:50', '1', '2024-07-07 15:49:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1572, 3, '消息', '3', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:20:01', '1', '2024-07-07 15:49:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1573, 4, '评论', '4', 'ai_write_format', 0, '', '', '', '1', '2024-07-07 15:20:13', '1', '2024-07-07 15:49:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1574, 1, '自动', '1', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:18', '1', '2024-07-07 15:44:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1575, 2, '中文', '2', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:28', '1', '2024-07-07 15:44:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1576, 3, '英文', '3', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:44:37', '1', '2024-07-07 15:44:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1577, 4, '韩语', '4', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:46:28', '1', '2024-07-07 15:46:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1578, 5, '日语', '5', 'ai_write_language', 0, '', '', '', '1', '2024-07-07 15:46:44', '1', '2024-07-07 15:46:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1579, 1, '自动', '1', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:34', '1', '2024-07-07 15:48:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1580, 2, '短', '2', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:44', '1', '2024-07-07 15:48:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1581, 3, '中等', '3', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:48:52', '1', '2024-07-07 15:48:52', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1582, 4, '长', '4', 'ai_write_length', 0, '', '', '', '1', '2024-07-07 15:49:03', '1', '2024-07-07 15:49:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1584, 1, '撰写', '1', 'ai_write_type', 0, '', '', '', '1', '2024-07-10 21:26:00', '1', '2024-07-10 21:26:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1585, 2, '回复', '2', 'ai_write_type', 0, '', '', '', '1', '2024-07-10 21:26:06', '1', '2024-07-10 21:26:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1586, 2, '腾讯云', 'TENCENT', 'system_sms_channel_code', 0, '', '', '', '1', '2024-07-22 22:23:16', '1', '2024-07-22 22:23:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1587, 3, '华为云', 'HUAWEI', 'system_sms_channel_code', 0, '', '', '', '1', '2024-07-22 22:23:46', '1', '2024-07-22 22:23:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1588, 1, 'OpenAI 微软', 'AzureOpenAI', 'ai_platform', 0, '', '', '', '1', '2024-08-10 14:07:41', '1', '2024-08-10 14:07:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1589, 10, 'BPMN 设计器', '10', 'bpm_model_type', 0, 'primary', '', '', '1', '2024-08-26 15:22:17', '1', '2024-08-26 16:46:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1590, 20, 'SIMPLE 设计器', '20', 'bpm_model_type', 0, 'success', '', '', '1', '2024-08-26 15:22:27', '1', '2024-08-26 16:45:58', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1591, 4, '七牛云', 'QINIU', 'system_sms_channel_code', 0, '', '', '', '1', '2024-08-31 08:45:03', '1', '2024-08-31 08:45:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1592, 3, '新人券', '3', 'promotion_coupon_take_type', 0, 'info', '', '新人注册后,自动发放', '1', '2024-09-03 11:57:16', '1', '2024-09-03 11:57:28', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `system_dict_type`; +CREATE TABLE `system_dict_type` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典名称', + `type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典类型', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 630 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +BEGIN; +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-05-16 20:29:32', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (9, '操作类型', 'infra_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:01', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '1', '2022-05-16 20:26:50', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2023-07-10 10:11:39', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', '2021-12-03 10:53:29', '1', '2023-07-19 18:09:43', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2023-07-19 10:13:17', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (140, '流程实例的结果', 'bpm_task_status', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2024-03-08 22:42:03', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (142, '任务分配规则的类型', 'bpm_task_candidate_strategy', 0, 'BPM 任务的候选人的策略', '103', '2022-01-12 23:21:04', '103', '2024-03-06 02:53:59', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', '2022-03-10 16:33:46', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', '2022-03-15 00:24:38', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', '2022-10-24 21:19:04', '1', '2022-10-24 21:19:08', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', '2022-11-01 12:46:06', '1', '2022-11-01 12:46:06', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', '2022-11-02 00:06:20', '1', '2022-11-04 00:08:26', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', '2022-11-02 00:28:01', '1', '2022-11-02 00:28:01', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', '2022-11-04 00:14:49', '1', '2022-11-04 00:14:49', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', '2022-11-04 19:12:27', '1', '2022-11-04 19:12:27', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', '2022-11-04 22:54:23', '1', '2022-11-04 22:54:23', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', '2022-11-04 22:59:23', '1', '2022-11-04 22:59:23', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', '2022-11-19 20:52:56', '1', '2022-11-19 20:52:56', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', '2022-11-19 21:04:09', '1', '2022-11-19 21:04:09', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', '2022-11-19 21:39:04', '1', '2022-11-19 21:39:04', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (160, '终端', 'terminal', 0, '终端', '1', '2022-12-10 10:50:50', '1', '2022-12-10 10:53:11', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', '2022-12-10 16:33:54', '1', '2022-12-10 16:33:54', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', '2022-12-10 16:48:44', '1', '2022-12-10 16:48:44', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', '2022-12-10 20:58:08', '1', '2022-12-10 20:58:08', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', '2023-01-16 23:29:56', '1', '2023-01-16 23:29:56', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', '2023-01-17 22:17:09', '1', '2023-01-17 22:17:09', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', '2023-07-20 12:23:03', '1', '2023-07-20 12:23:03', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', '2023-08-23 00:03:14', '1', '2023-08-23 00:03:14', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (176, '分佣模式', 'brokerage_enabled_condition', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (177, '分销关系绑定模式', 'brokerage_bind_mode', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (178, '佣金提现类型', 'brokerage_withdraw_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (179, '佣金记录业务类型', 'brokerage_record_biz_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (180, '佣金记录状态', 'brokerage_record_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (181, '佣金提现状态', 'brokerage_withdraw_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (182, '佣金提现银行', 'brokerage_bank_name', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (183, '砍价记录的状态', 'promotion_bargain_record_status', 0, '', '1', '2023-10-05 10:41:08', '1', '2023-10-05 10:41:08', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (184, '拼团记录的状态', 'promotion_combination_record_status', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-10-08 07:24:25', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (185, '回款-回款方式', 'crm_receivable_return_type', 0, '回款-回款方式', '1', '2023-10-18 21:54:10', '1', '2023-10-18 21:54:10', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (186, 'CRM 客户行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', '2023-10-28 22:57:07', '1', '2024-02-18 23:30:22', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', '2023-10-28 22:59:12', '1', '2023-10-28 15:11:16', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', '2023-10-28 23:00:34', '1', '2023-10-28 15:11:16', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (600, 'Banner 位置', 'promotion_banner_position', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-11-04 13:04:02', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (601, '社交类型', 'system_social_type', 0, '', '1', '2023-11-04 13:03:54', '1', '2023-11-04 13:03:54', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (604, '产品状态', 'crm_product_status', 0, '', '1', '2023-10-30 21:47:59', '1', '2023-10-30 21:48:45', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (605, 'CRM 数据权限的级别', 'crm_permission_level', 0, '', '1', '2023-11-30 09:51:59', '1', '2023-11-30 09:51:59', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (606, 'CRM 审批状态', 'crm_audit_status', 0, '', '1', '2023-11-30 18:56:23', '1', '2023-11-30 18:56:23', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (607, 'CRM 产品单位', 'crm_product_unit', 0, '', '1', '2023-12-05 23:01:51', '1', '2023-12-05 23:01:51', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (608, 'CRM 跟进方式', 'crm_follow_up_type', 0, '', '1', '2024-01-15 20:48:05', '1', '2024-01-15 20:48:05', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (609, '支付转账类型', 'pay_transfer_type', 0, '', '1', '2023-10-28 16:27:18', '1', '2023-10-28 16:27:18', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (610, '转账订单状态', 'pay_transfer_status', 0, '', '1', '2023-10-28 16:18:32', '1', '2023-10-28 16:18:32', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (611, 'ERP 库存明细的业务类型', 'erp_stock_record_biz_type', 0, 'ERP 库存明细的业务类型', '1', '2024-02-05 18:07:02', '1', '2024-02-05 18:07:02', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (612, 'ERP 审批状态', 'erp_audit_status', 0, '', '1', '2024-02-06 00:00:07', '1', '2024-02-06 00:00:07', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (613, 'BPM 监听器类型', 'bpm_process_listener_type', 0, '', '1', '2024-03-23 12:52:24', '1', '2024-03-09 15:54:28', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (615, 'BPM 监听器值类型', 'bpm_process_listener_value_type', 0, '', '1', '2024-03-23 13:00:31', '1', '2024-03-23 13:00:31', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (616, '时间间隔', 'date_interval', 0, '', '1', '2024-03-29 22:50:09', '1', '2024-03-29 22:50:09', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (619, 'CRM 商机结束状态类型', 'crm_business_end_status_type', 0, '', '1', '2024-04-13 23:23:00', '1', '2024-04-13 23:23:00', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (620, 'AI 模型平台', 'ai_platform', 0, '', '1', '2024-05-09 22:27:38', '1', '2024-05-09 22:27:38', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (621, 'AI 绘画状态', 'ai_image_status', 0, '', '1', '2024-06-26 20:51:23', '1', '2024-06-26 20:51:23', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (622, 'AI 音乐状态', 'ai_music_status', 0, '', '1', '2024-06-27 22:45:07', '1', '2024-06-28 00:56:27', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (623, 'AI 音乐生成模式', 'ai_generate_mode', 0, '', '1', '2024-06-27 22:46:21', '1', '2024-06-28 01:22:29', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (624, '写作语气', 'ai_write_tone', 0, '', '1', '2024-07-07 15:19:02', '1', '2024-07-07 15:19:02', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (625, '写作语言', 'ai_write_language', 0, '', '1', '2024-07-07 15:18:52', '1', '2024-07-07 15:18:52', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (626, '写作长度', 'ai_write_length', 0, '', '1', '2024-07-07 15:18:41', '1', '2024-07-07 15:18:41', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (627, '写作格式', 'ai_write_format', 0, '', '1', '2024-07-07 15:14:34', '1', '2024-07-07 15:14:34', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (628, 'AI 写作类型', 'ai_write_type', 0, '', '1', '2024-07-10 21:25:29', '1', '2024-07-10 21:25:29', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (629, 'BPM 流程模型类型', 'bpm_model_type', 0, '', '1', '2024-08-26 15:21:43', '1', '2024-08-26 15:21:43', b'0', '1970-01-01 00:00:00'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_login_log`; +CREATE TABLE `system_login_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `log_type` bigint NOT NULL COMMENT '日志类型', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户编号', + `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账号', + `result` tinyint NOT NULL COMMENT '登陆结果', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3335 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; + +-- ---------------------------- +-- Records of system_login_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS `system_mail_account`; +CREATE TABLE `system_mail_account` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', + `host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'SMTP 服务器域名', + `port` int NOT NULL COMMENT 'SMTP 服务器端口', + `ssl_enable` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否开启 SSL', + `starttls_enable` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否开启 STARTTLS', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +BEGIN; +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, b'0', b'0', '1', '2023-01-25 17:39:52', '1', '2024-07-27 22:39:12', b'0'); +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, b'1', b'0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', b'0'); +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, b'0', b'0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', b'1'); +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `starttls_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, b'1', b'0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', b'1'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_mail_log`; +CREATE TABLE `system_mail_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NULL DEFAULT NULL COMMENT '用户编号', + `user_type` tinyint NULL DEFAULT NULL COMMENT '用户类型', + `to_mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '接收邮箱地址', + `account_id` bigint NOT NULL COMMENT '邮箱账号编号', + `from_mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '发送邮箱地址', + `template_id` bigint NOT NULL COMMENT '模板编号', + `template_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `template_nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模版发送人名称', + `template_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件标题', + `template_content` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件内容', + `template_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件参数', + `send_status` tinyint NOT NULL DEFAULT 0 COMMENT '发送状态', + `send_time` datetime NULL DEFAULT NULL COMMENT '发送时间', + `send_message_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送返回的消息 ID', + `send_exception` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送异常', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 359 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件日志表'; + +-- ---------------------------- +-- Records of system_mail_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS `system_mail_template`; +CREATE TABLE `system_mail_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称', + `code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `account_id` bigint NOT NULL COMMENT '发送的邮箱账号编号', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送人名称', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板标题', + `content` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板内容', + `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数数组', + `status` tinyint NOT NULL COMMENT '开启状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +BEGIN; +INSERT INTO `system_mail_template` (`id`, `name`, `code`, `account_id`, `nickname`, `title`, `content`, `params`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '[\"code\",\"name\"]', 0, '3', '1', '2021-10-11 08:10:00', '1', '2023-12-02 19:51:14', b'0'); +INSERT INTO `system_mail_template` (`id`, `name`, `code`, `account_id`, `nickname`, `title`, `content`, `params`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '[\"key01\",\"key02\"]', 0, NULL, '1', '2023-01-26 01:27:40', '1', '2023-01-27 10:32:16', b'0'); +INSERT INTO `system_mail_template` (`id`, `name`, `code`, `account_id`, `nickname`, `title`, `content`, `params`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', '2023-01-27 15:50:35', '1', '2023-01-27 16:34:49', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS `system_menu`; +CREATE TABLE `system_menu` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称', + `permission` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限标识', + `type` tinyint NOT NULL COMMENT '菜单类型', + `sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序', + `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父菜单ID', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '路由地址', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '#' COMMENT '菜单图标', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件路径', + `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件名', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '菜单状态', + `visible` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否可见', + `keep_alive` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否缓存', + `always_show` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否总是显示', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2814 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +BEGIN; +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-06-18 01:19:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-03-01 08:28:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-09-20 16:26:19', '1', '2024-02-29 12:38:13', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:02:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-05-01 18:35:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:39', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:07:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:02:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (107, '通知公告', '', 2, 4, 2739, 'notice', 'ep:takeaway-box', 'system/notice/index', 'SystemNotice', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-22 23:56:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:08:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:13:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (110, '定时任务', '', 2, 7, 2, 'job', 'fa-solid:tasks', 'infra/job/index', 'InfraJob', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:57:36', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:05:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:document-copy', 'infra/codegen/index', 'InfraCodegen', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:01:24', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:09:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:10:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2023-11-15 23:45:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, b'1', b'1', b'1', '', '2021-02-08 20:41:31', '1', '2024-04-23 00:07:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, b'1', b'1', b'1', '', '2021-02-26 01:32:59', '1', '2024-02-29 08:54:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, b'1', b'1', b'1', '', '2021-02-26 02:18:24', '1', '2024-04-22 23:58:36', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2024-02-29 08:55:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '1', '2024-02-29 08:53:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1093, '短信管理', '', 1, 1, 2739, 'sms', 'ep:message', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-04-05 01:10:16', '1', '2024-04-22 23:56:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'fa:stack-exchange', 'system/sms/channel/index', 'SystemSmsChannel', 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '1', '2024-02-29 01:15:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'ep:connection', 'system/sms/template/index', 'SystemSmsTemplate', 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '1', '2024-02-29 01:16:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'fa:edit', 'system/sms/log/index', 'SystemSmsLog', 0, b'1', b'1', b'1', '', '2021-04-11 08:37:05', '1', '2024-02-29 08:49:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1117, '支付管理', '', 1, 30, 0, '/pay', 'ep:money', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-25 16:43:41', '1', '2024-02-29 08:58:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2024-02-29 12:38:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'fa:apple', 'pay/app/index', 'PayApp', 0, b'1', b'1', b'1', '', '2021-11-10 01:13:30', '1', '2024-02-29 08:59:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'ep:house', 'system/tenant/index', 'SystemTenant', 0, b'1', b'1', b'1', '', '2021-12-14 12:31:43', '1', '2024-02-29 01:01:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'fa:registered', 'pay/refund/index', 'PayRefund', 0, b'1', b'1', b'1', '', '2021-12-25 08:29:07', '1', '2024-02-29 08:59:20', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'fa:cc-paypal', 'pay/order/index', 'PayOrder', 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '1', '2024-02-29 08:59:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:26:36', '1', '2024-02-29 12:43:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:28:30', '1', '2024-02-29 12:36:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2024-03-19 12:25:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, b'1', b'1', b'1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-01-07 23:51:48', '1', '2024-03-21 00:33:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, b'1', b'1', b'1', '', '2022-01-07 15:53:44', '1', '2024-03-21 23:52:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, b'1', b'1', b'1', '1', '2022-01-08 10:33:37', '1', '2024-02-29 12:37:39', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, b'1', b'1', b'1', '1', '2022-01-08 10:34:13', '1', '2024-02-29 12:37:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '1', '2024-03-21 23:55:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'fa-solid:house-user', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-02-20 01:41:13', '1', '2024-02-29 00:59:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'fa:bars', 'system/tenantPackage/index', 'SystemTenantPackage', 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '1', '2024-02-29 01:01:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '1', '2024-02-29 08:52:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, b'1', b'1', b'1', '1', '2022-03-16 23:47:40', '1', '2024-04-23 00:02:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:avatar', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-04-23 01:03:15', '1', '2024-09-06 09:19:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:data-analysis', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '1', '2024-02-29 08:51:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-05-09 23:38:17', '1', '2024-02-29 01:12:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2024-02-29 01:13:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1281, '报表管理', '', 2, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2024-02-29 12:33:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'GoView', 0, b'1', b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2024-02-29 12:33:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2000, '商品中心', '', 1, 60, 2362, 'product', 'fa:product-hunt', NULL, NULL, 0, b'1', b'1', b'1', '', '2022-07-29 15:53:53', '1', '2023-09-30 11:52:36', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2002, '商品分类', '', 2, 2, 2000, 'category', 'ep:cellphone', 'mall/product/category/index', 'ProductCategory', 0, b'1', b'1', b'1', '', '2022-07-29 15:53:53', '1', '2023-08-21 10:27:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2003, '分类查询', 'product:category:query', 3, 1, 2002, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2004, '分类创建', 'product:category:create', 3, 2, 2002, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2005, '分类更新', 'product:category:update', 3, 3, 2002, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2006, '分类删除', 'product:category:delete', 3, 4, 2002, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2008, '商品品牌', '', 2, 3, 2000, 'brand', 'ep:chicken', 'mall/product/brand/index', 'ProductBrand', 0, b'1', b'1', b'1', '', '2022-07-30 13:52:44', '1', '2023-08-21 10:27:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2009, '品牌查询', 'product:brand:query', 3, 1, 2008, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2010, '品牌创建', 'product:brand:create', 3, 2, 2008, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2011, '品牌更新', 'product:brand:update', 3, 3, 2008, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2012, '品牌删除', 'product:brand:delete', 3, 4, 2008, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2014, '商品列表', '', 2, 1, 2000, 'spu', 'ep:apple', 'mall/product/spu/index', 'ProductSpu', 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '1', '2023-08-21 10:27:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2015, '商品查询', 'product:spu:query', 3, 1, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2016, '商品创建', 'product:spu:create', 3, 2, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2017, '商品更新', 'product:spu:update', 3, 3, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2018, '商品删除', 'product:spu:delete', 3, 4, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2019, '商品属性', '', 2, 4, 2000, 'property', 'ep:cold-drink', 'mall/product/property/index', 'ProductProperty', 0, b'1', b'1', b'1', '', '2022-08-01 14:55:35', '1', '2023-08-26 11:01:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2020, '规格查询', 'product:property:query', 3, 1, 2019, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:24', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2021, '规格创建', 'product:property:create', 3, 2, 2019, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2022, '规格更新', 'product:property:update', 3, 3, 2019, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2023, '规格删除', 'product:property:delete', 3, 4, 2019, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2025, 'Banner', '', 2, 100, 2387, 'banner', 'fa:bandcamp', 'mall/promotion/banner/index', NULL, 0, b'1', b'1', b'1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2026, 'Banner查询', 'promotion:banner:query', 3, 1, 2025, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2027, 'Banner创建', 'promotion:banner:create', 3, 2, 2025, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2028, 'Banner更新', 'promotion:banner:update', 3, 3, 2025, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2029, 'Banner删除', 'promotion:banner:delete', 3, 4, 2025, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:36', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2030, '营销中心', '', 1, 70, 2362, 'promotion', 'ep:present', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-10-31 21:25:09', '1', '2023-09-30 11:54:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2032, '优惠劵列表', '', 2, 1, 2365, 'template', 'ep:discount', 'mall/promotion/coupon/template/index', 'PromotionCouponTemplate', 0, b'1', b'1', b'1', '', '2022-10-31 22:27:14', '1', '2023-10-03 12:40:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2033, '优惠劵模板查询', 'promotion:coupon-template:query', 3, 1, 2032, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2034, '优惠劵模板创建', 'promotion:coupon-template:create', 3, 2, 2032, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2035, '优惠劵模板更新', 'promotion:coupon-template:update', 3, 3, 2032, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2036, '优惠劵模板删除', 'promotion:coupon-template:delete', 3, 4, 2032, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2038, '领取记录', '', 2, 2, 2365, 'list', 'ep:collection-tag', 'mall/promotion/coupon/index', 'PromotionCoupon', 0, b'1', b'1', b'1', '', '2022-11-03 23:21:31', '1', '2023-10-03 12:55:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2039, '优惠劵查询', 'promotion:coupon:query', 3, 1, 2038, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2040, '优惠劵删除', 'promotion:coupon:delete', 3, 4, 2038, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2041, '满减送', '', 2, 10, 2390, 'reward-activity', 'ep:goblet-square-full', 'mall/promotion/rewardActivity/index', 'PromotionRewardActivity', 0, b'1', b'1', b'1', '', '2022-11-04 23:47:49', '1', '2023-10-21 19:24:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2042, '满减送活动查询', 'promotion:reward-activity:query', 3, 1, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2043, '满减送活动创建', 'promotion:reward-activity:create', 3, 2, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2044, '满减送活动更新', 'promotion:reward-activity:update', 3, 3, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2045, '满减送活动删除', 'promotion:reward-activity:delete', 3, 4, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2047, '限时折扣', '', 2, 7, 2390, 'discount-activity', 'ep:timer', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '1', '2023-10-21 19:24:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '1', '2023-06-24 18:57:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:50', '1', '2023-06-24 18:57:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:48:39', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2072, '订单中心', '', 1, 65, 2362, 'trade', 'ep:eleme', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-11-19 18:57:19', '1', '2023-09-30 11:54:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2073, '售后退款', '', 2, 2, 2072, 'after-sale', 'ep:refrigerator', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, b'1', b'1', b'1', '', '2022-11-19 20:15:32', '1', '2023-10-01 21:42:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2075, '秒杀活动关闭', 'promotion:seckill-activity:close', 3, 5, 2059, '', '', '', '', 0, b'1', b'1', b'1', '1', '2022-11-28 20:20:15', '1', '2023-10-03 18:34:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2076, '订单列表', '', 2, 1, 2072, 'order', 'ep:list', 'mall/trade/order/index', 'TradeOrder', 0, b'1', b'1', b'1', '1', '2022-12-10 21:05:44', '1', '2023-10-01 21:42:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, b'1', b'1', b'1', '1', '2022-12-23 17:35:05', '1', '2024-02-29 08:50:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'ep:compass', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-01 20:11:04', '1', '2024-02-29 12:39:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'fa:user', 'mp/account/index', 'MpAccount', 0, b'1', b'1', b'1', '1', '2023-01-01 20:13:31', '1', '2024-02-29 12:42:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2086, '新增账号', 'mp:account:create', 3, 1, 2085, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-01 20:21:40', '1', '2023-01-07 17:32:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2087, '修改账号', 'mp:account:update', 3, 2, 2085, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-07 17:32:46', '1', '2023-01-07 17:32:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2088, '查询账号', 'mp:account:query', 3, 0, 2085, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-07 17:33:07', '1', '2023-01-07 17:33:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2089, '删除账号', 'mp:account:delete', 3, 3, 2085, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-07 17:33:21', '1', '2023-01-07 17:33:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2090, '生成二维码', 'mp:account:qr-code', 3, 4, 2085, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-07 17:33:58', '1', '2023-01-07 17:33:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2091, '清空 API 配额', 'mp:account:clear-quota', 3, 5, 2085, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-07 18:20:32', '1', '2023-01-07 18:20:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2092, '数据统计', 'mp:statistics:query', 2, 2, 2084, 'statistics', 'ep:trend-charts', 'mp/statistics/index', 'MpStatistics', 0, b'1', b'1', b'1', '1', '2023-01-07 20:17:36', '1', '2024-02-29 12:42:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2093, '标签管理', '', 2, 3, 2084, 'tag', 'ep:collection-tag', 'mp/tag/index', 'MpTag', 0, b'1', b'1', b'1', '1', '2023-01-08 11:37:32', '1', '2024-02-29 12:42:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2094, '查询标签', 'mp:tag:query', 3, 0, 2093, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 11:59:03', '1', '2023-01-08 11:59:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2095, '新增标签', 'mp:tag:create', 3, 1, 2093, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 11:59:23', '1', '2023-01-08 11:59:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2096, '修改标签', 'mp:tag:update', 3, 2, 2093, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 11:59:41', '1', '2023-01-08 11:59:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2097, '删除标签', 'mp:tag:delete', 3, 3, 2093, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 12:00:04', '1', '2023-01-08 12:00:13', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2098, '同步标签', 'mp:tag:sync', 3, 4, 2093, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 12:00:29', '1', '2023-01-08 12:00:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2099, '粉丝管理', '', 2, 4, 2084, 'user', 'fa:user-secret', 'mp/user/index', 'MpUser', 0, b'1', b'1', b'1', '1', '2023-01-08 16:51:20', '1', '2024-02-29 12:42:39', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2100, '查询粉丝', 'mp:user:query', 3, 0, 2099, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 17:16:59', '1', '2023-01-08 17:17:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2101, '修改粉丝', 'mp:user:update', 3, 1, 2099, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 17:17:11', '1', '2023-01-08 17:17:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2102, '同步粉丝', 'mp:user:sync', 3, 2, 2099, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-08 17:17:40', '1', '2023-01-08 17:17:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2103, '消息管理', '', 2, 5, 2084, 'message', 'ep:message', 'mp/message/index', 'MpMessage', 0, b'1', b'1', b'1', '1', '2023-01-08 18:44:19', '1', '2024-02-29 12:42:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2104, '图文发表记录', '', 2, 10, 2084, 'free-publish', 'ep:edit-pen', 'mp/freePublish/index', 'MpFreePublish', 0, b'1', b'1', b'1', '1', '2023-01-13 00:30:50', '1', '2024-02-29 12:43:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2105, '查询发布列表', 'mp:free-publish:query', 3, 1, 2104, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-13 07:19:17', '1', '2023-01-13 07:19:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2106, '发布草稿', 'mp:free-publish:submit', 3, 2, 2104, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-13 07:19:46', '1', '2023-01-13 07:19:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2107, '删除发布记录', 'mp:free-publish:delete', 3, 3, 2104, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-13 07:20:01', '1', '2023-01-13 07:20:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2108, '图文草稿箱', '', 2, 9, 2084, 'draft', 'ep:edit', 'mp/draft/index', 'MpDraft', 0, b'1', b'1', b'1', '1', '2023-01-13 07:40:21', '1', '2024-02-29 12:43:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2109, '新建草稿', 'mp:draft:create', 3, 1, 2108, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-13 23:15:30', '1', '2023-01-13 23:15:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2110, '修改草稿', 'mp:draft:update', 3, 2, 2108, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 10:08:47', '1', '2023-01-14 10:08:47', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2111, '查询草稿', 'mp:draft:query', 3, 0, 2108, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 10:09:01', '1', '2023-01-14 10:09:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2112, '删除草稿', 'mp:draft:delete', 3, 3, 2108, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 10:09:19', '1', '2023-01-14 10:09:19', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2113, '素材管理', '', 2, 8, 2084, 'material', 'ep:basketball', 'mp/material/index', 'MpMaterial', 0, b'1', b'1', b'1', '1', '2023-01-14 14:12:07', '1', '2024-02-29 12:43:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2114, '上传临时素材', 'mp:material:upload-temporary', 3, 1, 2113, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 15:33:55', '1', '2023-01-14 15:33:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2115, '上传永久素材', 'mp:material:upload-permanent', 3, 2, 2113, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 15:34:14', '1', '2023-01-14 15:34:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2116, '删除素材', 'mp:material:delete', 3, 3, 2113, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 15:35:37', '1', '2023-01-14 15:35:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2117, '上传图文图片', 'mp:material:upload-news-image', 3, 4, 2113, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 15:36:31', '1', '2023-01-14 15:36:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2118, '查询素材', 'mp:material:query', 3, 5, 2113, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-14 15:39:22', '1', '2023-01-14 15:39:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2119, '菜单管理', '', 2, 6, 2084, 'menu', 'ep:menu', 'mp/menu/index', 'MpMenu', 0, b'1', b'1', b'1', '1', '2023-01-14 17:43:54', '1', '2024-02-29 12:42:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2120, '自动回复', '', 2, 7, 2084, 'auto-reply', 'fa-solid:republican', 'mp/autoReply/index', 'MpAutoReply', 0, b'1', b'1', b'1', '1', '2023-01-15 22:13:09', '1', '2024-02-29 12:43:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2121, '查询回复', 'mp:auto-reply:query', 3, 0, 2120, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-16 22:28:41', '1', '2023-01-16 22:28:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2122, '新增回复', 'mp:auto-reply:create', 3, 1, 2120, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-16 22:28:54', '1', '2023-01-16 22:28:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2123, '修改回复', 'mp:auto-reply:update', 3, 2, 2120, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-16 22:29:05', '1', '2023-01-16 22:29:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2124, '删除回复', 'mp:auto-reply:delete', 3, 3, 2120, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-16 22:29:34', '1', '2023-01-16 22:29:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2125, '查询菜单', 'mp:menu:query', 3, 0, 2119, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-17 23:05:41', '1', '2023-01-17 23:05:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2126, '保存菜单', 'mp:menu:save', 3, 1, 2119, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-17 23:06:01', '1', '2023-01-17 23:06:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2127, '删除菜单', 'mp:menu:delete', 3, 2, 2119, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-17 23:06:16', '1', '2023-01-17 23:06:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2128, '查询消息', 'mp:message:query', 3, 0, 2103, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-17 23:07:14', '1', '2023-01-17 23:07:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2129, '发送消息', 'mp:message:send', 3, 1, 2103, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-17 23:07:26', '1', '2023-01-17 23:07:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2130, '邮箱管理', '', 2, 2, 2739, 'mail', 'fa-solid:mail-bulk', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-25 17:27:44', '1', '2024-04-22 23:56:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'fa:universal-access', 'system/mail/account/index', 'SystemMailAccount', 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '1', '2024-02-29 08:48:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'fa:tag', 'system/mail/template/index', 'SystemMailTemplate', 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '1', '2024-02-29 08:48:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'fa:edit', 'system/mail/log/index', 'SystemMailLog', 0, b'1', b'1', b'1', '', '2023-01-26 02:16:50', '1', '2024-02-29 08:48:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-26 02:16:50', '', '2023-01-26 02:16:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-26 23:29:15', '1', '2023-01-26 23:29:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2144, '站内信管理', '', 1, 3, 2739, 'notify', 'ep:message-box', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-28 10:25:18', '1', '2024-04-22 23:56:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'fa:archive', 'system/notify/template/index', 'SystemNotifyTemplate', 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '1', '2024-02-29 08:49:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-28 10:54:43', '1', '2023-01-28 10:54:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'fa:edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, b'1', b'1', b'1', '', '2023-01-28 04:28:22', '1', '2024-02-29 08:49:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 04:28:22', '', '2023-01-28 04:28:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'JimuReport', 0, b'1', b'1', b'1', '1', '2023-02-07 00:03:19', '1', '2024-02-29 12:34:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:14', '1', '2023-02-07 19:25:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2155, '更新项目', 'report:go-view-project:update', 3, 2, 2153, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:34', '1', '2024-04-24 20:01:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:46:28', '1', '2024-07-28 11:36:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, b'1', b'1', b'1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2164, '配送管理', '', 1, 3, 2072, 'delivery', 'ep:shopping-cart', '', '', 0, b'1', b'1', b'1', '1', '2023-05-18 09:18:02', '1', '2023-09-28 10:58:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', 'ep:bicycle', '', '', 0, b'1', b'1', b'1', '1', '2023-05-18 09:22:06', '1', '2023-08-30 21:02:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', 'ep:add-location', '', '', 0, b'1', b'1', b'1', '1', '2023-05-18 09:23:14', '1', '2023-08-30 21:03:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', 'ep:compass', 'mall/trade/delivery/express/index', 'Express', 0, b'1', b'1', b'1', '1', '2023-05-18 09:27:21', '1', '2023-08-30 21:02:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', 'ep:coordinate', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, b'1', b'1', b'1', '1', '2023-05-20 06:48:10', '1', '2023-08-30 21:03:13', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', 'ep:basketball', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, b'1', b'1', b'1', '1', '2023-05-25 10:50:00', '1', '2023-08-30 21:03:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, b'1', b'1', b'1', '1', '2023-06-24 17:39:13', '1', '2023-06-24 18:55:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'ep:bicycle', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-06-10 00:42:03', '1', '2023-08-20 09:23:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2275, '会员配置', '', 2, 0, 2262, 'config', 'fa:archive', 'member/config/index', 'MemberConfig', 0, b'1', b'1', b'1', '', '2023-06-10 02:07:44', '1', '2023-10-01 23:41:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2276, '会员配置查询', 'member:config:query', 3, 1, 2275, '', '', '', '', 0, b'1', b'1', b'1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:48:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2277, '会员配置保存', 'member:config:save', 3, 2, 2275, '', '', '', '', 0, b'1', b'1', b'1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:49:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2281, '签到配置', '', 2, 2, 2300, 'config', 'ep:calendar', 'member/signin/config/index', 'SignInConfig', 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '1', '2023-08-20 19:25:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2287, '会员积分', '', 2, 10, 2262, 'record', 'fa:asterisk', 'member/point/record/index', 'PointRecord', 0, b'1', b'1', b'1', '', '2023-06-10 04:18:50', '1', '2023-10-01 23:42:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 04:18:50', '', '2023-06-10 04:18:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2293, '签到记录', '', 2, 3, 2300, 'record', 'ep:chicken', 'member/signin/record/index', 'SignInRecord', 0, b'1', b'1', b'1', '', '2023-06-10 04:48:22', '1', '2023-08-20 19:26:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2300, '会员签到', '', 1, 11, 2262, 'signin', 'ep:alarm-clock', '', '', 0, b'1', b'1', b'1', '1', '2023-06-27 22:49:53', '1', '2023-08-20 09:23:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2301, '回调通知', '', 2, 5, 1117, 'notify', 'ep:mute-notification', 'pay/notify/index', 'PayNotify', 0, b'1', b'1', b'1', '', '2023-07-20 04:41:32', '1', '2024-01-18 23:56:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2302, '支付通知查询', 'pay:notify:query', 3, 1, 2301, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-07-20 04:41:32', '', '2023-07-20 04:41:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2303, '拼团活动', '', 2, 3, 2030, 'combination', 'fa:group', '', '', 0, b'1', b'1', b'1', '1', '2023-08-12 17:19:54', '1', '2023-08-12 17:20:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2304, '拼团商品', '', 2, 1, 2303, 'acitivity', 'ep:apple', 'mall/promotion/combination/activity/index', 'PromotionCombinationActivity', 0, b'1', b'1', b'1', '1', '2023-08-12 17:22:03', '1', '2023-08-12 17:22:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2305, '拼团活动查询', 'promotion:combination-activity:query', 3, 1, 2304, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-12 17:54:32', '1', '2023-11-24 11:57:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2306, '拼团活动创建', 'promotion:combination-activity:create', 3, 2, 2304, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-12 17:54:49', '1', '2023-08-12 17:54:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2307, '拼团活动更新', 'promotion:combination-activity:update', 3, 3, 2304, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-12 17:55:04', '1', '2023-08-12 17:55:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2308, '拼团活动删除', 'promotion:combination-activity:delete', 3, 4, 2304, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-12 17:55:23', '1', '2023-08-12 17:55:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2309, '拼团活动关闭', 'promotion:combination-activity:close', 3, 5, 2304, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-12 17:55:37', '1', '2023-10-06 10:51:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2310, '砍价活动', '', 2, 4, 2030, 'bargain', 'ep:box', '', '', 0, b'1', b'1', b'1', '1', '2023-08-13 00:27:25', '1', '2023-08-13 00:27:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2311, '砍价商品', '', 2, 1, 2310, 'activity', 'ep:burger', 'mall/promotion/bargain/activity/index', 'PromotionBargainActivity', 0, b'1', b'1', b'1', '1', '2023-08-13 00:28:49', '1', '2023-10-05 01:16:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2312, '砍价活动查询', 'promotion:bargain-activity:query', 3, 1, 2311, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-13 00:32:30', '1', '2023-08-13 00:32:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2313, '砍价活动创建', 'promotion:bargain-activity:create', 3, 2, 2311, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-13 00:32:44', '1', '2023-08-13 00:32:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2314, '砍价活动更新', 'promotion:bargain-activity:update', 3, 3, 2311, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-13 00:32:55', '1', '2023-08-13 00:32:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2315, '砍价活动删除', 'promotion:bargain-activity:delete', 3, 4, 2311, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-13 00:34:50', '1', '2023-08-13 00:34:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2316, '砍价活动关闭', 'promotion:bargain-activity:close', 3, 5, 2311, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-13 00:35:02', '1', '2023-08-13 00:35:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2317, '会员管理', '', 2, 0, 2262, 'user', 'ep:avatar', 'member/user/index', 'MemberUser', 0, b'1', b'1', b'1', '', '2023-08-19 04:12:15', '1', '2023-08-24 00:50:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2318, '会员用户查询', 'member:user:query', 3, 1, 2317, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2319, '会员用户更新', 'member:user:update', 3, 3, 2317, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2320, '会员标签', '', 2, 1, 2262, 'tag', 'ep:collection-tag', 'member/tag/index', 'MemberTag', 0, b'1', b'1', b'1', '', '2023-08-20 01:03:08', '1', '2023-08-20 09:23:19', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2321, '会员标签查询', 'member:tag:query', 3, 1, 2320, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2322, '会员标签创建', 'member:tag:create', 3, 2, 2320, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2323, '会员标签更新', 'member:tag:update', 3, 3, 2320, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2324, '会员标签删除', 'member:tag:delete', 3, 4, 2320, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2325, '会员等级', '', 2, 2, 2262, 'level', 'fa:level-up', 'member/level/index', 'MemberLevel', 0, b'1', b'1', b'1', '', '2023-08-22 12:41:01', '1', '2023-08-22 21:47:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2326, '会员等级查询', 'member:level:query', 3, 1, 2325, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2327, '会员等级创建', 'member:level:create', 3, 2, 2325, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2328, '会员等级更新', 'member:level:update', 3, 3, 2325, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2329, '会员等级删除', 'member:level:delete', 3, 4, 2325, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2330, '会员分组', '', 2, 3, 2262, 'group', 'fa:group', 'member/group/index', 'MemberGroup', 0, b'1', b'1', b'1', '', '2023-08-22 13:50:06', '1', '2023-10-01 23:42:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2331, '用户分组查询', 'member:group:query', 3, 1, 2330, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2332, '用户分组创建', 'member:group:create', 3, 2, 2330, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2333, '用户分组更新', 'member:group:update', 3, 3, 2330, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2334, '用户分组删除', 'member:group:delete', 3, 4, 2330, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2335, '用户等级修改', 'member:user:update-level', 3, 5, 2317, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-08-23 16:49:05', '', '2023-08-23 16:50:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2336, '商品评论', '', 2, 5, 2000, 'comment', 'ep:comment', 'mall/product/comment/index', 'ProductComment', 0, b'1', b'1', b'1', '1', '2023-08-26 11:03:00', '1', '2023-08-26 11:03:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2337, '评论查询', 'product:comment:query', 3, 1, 2336, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-26 11:04:01', '1', '2023-08-26 11:04:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2338, '添加自评', 'product:comment:create', 3, 2, 2336, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-26 11:04:23', '1', '2023-08-26 11:08:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2339, '商家回复', 'product:comment:update', 3, 3, 2336, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-26 11:04:37', '1', '2023-08-26 11:04:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2340, '显隐评论', 'product:comment:update', 3, 4, 2336, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-08-26 11:04:55', '1', '2023-08-26 11:04:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2341, '优惠劵发送', 'promotion:coupon:send', 3, 2, 2038, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-09-02 00:03:14', '1', '2023-09-02 00:03:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2342, '交易配置', '', 2, 0, 2072, 'config', 'ep:setting', 'mall/trade/config/index', 'TradeConfig', 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:30:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2343, '交易中心配置查询', 'trade:config:query', 3, 1, 2342, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2344, '交易中心配置保存', 'trade:config:save', 3, 2, 2342, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2345, '分销管理', '', 1, 4, 2072, 'brokerage', 'fa-solid:project-diagram', '', '', 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '1', '2023-09-28 10:58:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2346, '分销用户', '', 2, 0, 2345, 'brokerage-user', 'fa-solid:user-tie', 'mall/trade/brokerage/user/index', 'TradeBrokerageUser', 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2347, '分销用户查询', 'trade:brokerage-user:query', 3, 1, 2346, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2348, '分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, 2346, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2349, '分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, 2346, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2350, '分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2351, '分销用户修改推广员', 'trade:brokerage-user:update-bind-user', 3, 5, 2346, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2352, '分销用户清除推广员', 'trade:brokerage-user:clear-bind-user', 3, 6, 2346, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2353, '佣金记录', '', 2, 1, 2345, 'brokerage-record', 'fa:money', 'mall/trade/brokerage/record/index', 'TradeBrokerageRecord', 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2354, '佣金记录查询', 'trade:brokerage-record:query', 3, 1, 2353, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2355, '佣金提现', '', 2, 2, 2345, 'brokerage-withdraw', 'fa:credit-card', 'mall/trade/brokerage/withdraw/index', 'TradeBrokerageWithdraw', 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2356, '佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, 2355, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2357, '佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, 2355, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2358, '统计中心', '', 1, 75, 2362, 'statistics', 'ep:data-line', '', '', 0, b'1', b'1', b'1', '', '2023-09-30 03:22:40', '1', '2023-09-30 11:54:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2359, '交易统计', '', 2, 4, 2358, 'trade', 'fa-solid:credit-card', 'mall/statistics/trade/index', 'TradeStatistics', 0, b'1', b'1', b'1', '', '2023-09-30 03:22:40', '1', '2024-02-26 20:42:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2360, '交易统计查询', 'statistics:trade:query', 3, 1, 2359, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2361, '交易统计导出', 'statistics:trade:export', 3, 2, 2359, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2362, '商城系统', '', 1, 59, 0, '/mall', 'ep:shop', '', '', 0, b'1', b'1', b'1', '1', '2023-09-30 11:52:02', '1', '2023-09-30 11:52:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2363, '用户积分修改', 'member:user:update-point', 3, 6, 2317, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-01 14:39:43', '', '2023-10-01 14:39:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2364, '用户余额修改', 'pay:wallet:update-balance', 3, 7, 2317, '', '', '', '', 0, b'1', b'1', b'1', '', '2023-10-01 14:39:43', '1', '2024-10-01 09:42:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2365, '优惠劵', '', 1, 2, 2030, 'coupon', 'fa-solid:disease', '', '', 0, b'1', b'1', b'1', '1', '2023-10-03 12:39:15', '1', '2023-10-05 00:16:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2366, '砍价记录', '', 2, 2, 2310, 'record', 'ep:list', 'mall/promotion/bargain/record/index', 'PromotionBargainRecord', 0, b'1', b'1', b'1', '', '2023-10-05 02:49:06', '1', '2023-10-05 10:50:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2367, '砍价记录查询', 'promotion:bargain-record:query', 3, 1, 2366, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-05 02:49:06', '', '2023-10-05 02:49:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2368, '助力记录查询', 'promotion:bargain-help:query', 3, 2, 2366, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-10-05 12:27:49', '1', '2023-10-05 12:27:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2369, '拼团记录', 'promotion:combination-record:query', 2, 2, 2303, 'record', 'ep:avatar', 'mall/promotion/combination/record/index.vue', 'PromotionCombinationRecord', 0, b'1', b'1', b'1', '1', '2023-10-08 07:10:22', '1', '2023-10-08 07:34:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2374, '会员统计', '', 2, 2, 2358, 'member', 'ep:avatar', 'mall/statistics/member/index', 'MemberStatistics', 0, b'1', b'1', b'1', '', '2023-10-11 04:39:24', '1', '2024-02-26 20:41:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2375, '会员统计查询', 'statistics:member:query', 3, 1, 2374, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-11 04:39:24', '', '2023-10-11 04:39:24', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2376, '订单核销', 'trade:order:pick-up', 3, 10, 2076, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-10-14 17:11:58', '1', '2023-10-14 17:11:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2377, '文章分类', '', 2, 0, 2387, 'article/category', 'fa:certificate', 'mall/promotion/article/category/index', 'ArticleCategory', 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:38:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2378, '分类查询', 'promotion:article-category:query', 3, 1, 2377, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2379, '分类创建', 'promotion:article-category:create', 3, 2, 2377, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2380, '分类更新', 'promotion:article-category:update', 3, 3, 2377, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2381, '分类删除', 'promotion:article-category:delete', 3, 4, 2377, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2382, '文章列表', '', 2, 2, 2387, 'article', 'ep:connection', 'mall/promotion/article/index', 'Article', 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:41:19', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2383, '文章管理查询', 'promotion:article:query', 3, 1, 2382, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2384, '文章管理创建', 'promotion:article:create', 3, 2, 2382, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2385, '文章管理更新', 'promotion:article:update', 3, 3, 2382, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2386, '文章管理删除', 'promotion:article:delete', 3, 4, 2382, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2387, '内容管理', '', 1, 1, 2030, 'content', 'ep:collection', '', '', 0, b'1', b'1', b'1', '1', '2023-10-16 09:37:31', '1', '2023-10-16 09:37:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2388, '商城首页', '', 2, 1, 2362, 'home', 'ep:home-filled', 'mall/home/index', 'MallHome', 0, b'1', b'1', b'1', '', '2023-10-16 12:10:33', '', '2023-10-16 12:10:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2389, '核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder', 0, b'1', b'1', b'1', '', '2023-10-19 16:09:51', '', '2023-10-19 16:09:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2390, '优惠活动', '', 1, 99, 2030, 'youhui', 'ep:aim', '', '', 0, b'1', b'1', b'1', '1', '2023-10-21 19:23:49', '1', '2023-10-21 19:23:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2391, '客户管理', '', 2, 10, 2397, 'customer', 'fa:address-book-o', 'crm/customer/index', 'CrmCustomer', 0, b'1', b'1', b'1', '', '2023-10-29 09:04:21', '1', '2024-02-17 17:13:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2392, '客户查询', 'crm:customer:query', 3, 1, 2391, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2393, '客户创建', 'crm:customer:create', 3, 2, 2391, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2394, '客户更新', 'crm:customer:update', 3, 3, 2391, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2395, '客户删除', 'crm:customer:delete', 3, 4, 2391, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2396, '客户导出', 'crm:customer:export', 3, 5, 2391, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2397, 'CRM 系统', '', 1, 200, 0, '/crm', 'ep:avatar', '', '', 0, b'1', b'1', b'1', '1', '2023-10-29 17:08:30', '1', '2024-02-04 15:37:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2398, '合同管理', '', 2, 50, 2397, 'contract', 'ep:notebook', 'crm/contract/index', 'CrmContract', 0, b'1', b'1', b'1', '', '2023-10-29 10:50:41', '1', '2024-02-17 17:15:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2399, '合同查询', 'crm:contract:query', 3, 1, 2398, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2400, '合同创建', 'crm:contract:create', 3, 2, 2398, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2401, '合同更新', 'crm:contract:update', 3, 3, 2398, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2402, '合同删除', 'crm:contract:delete', 3, 4, 2398, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2403, '合同导出', 'crm:contract:export', 3, 5, 2398, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2404, '线索管理', '', 2, 8, 2397, 'clue', 'fa:pagelines', 'crm/clue/index', 'CrmClue', 0, b'1', b'1', b'1', '', '2023-10-29 11:06:29', '1', '2024-02-17 17:15:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2405, '线索查询', 'crm:clue:query', 3, 1, 2404, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2406, '线索创建', 'crm:clue:create', 3, 2, 2404, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2407, '线索更新', 'crm:clue:update', 3, 3, 2404, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2408, '线索删除', 'crm:clue:delete', 3, 4, 2404, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2409, '线索导出', 'crm:clue:export', 3, 5, 2404, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2410, '商机管理', '', 2, 40, 2397, 'business', 'fa:bus', 'crm/business/index', 'CrmBusiness', 0, b'1', b'1', b'1', '', '2023-10-29 11:12:35', '1', '2024-02-17 17:14:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2411, '商机查询', 'crm:business:query', 3, 1, 2410, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2412, '商机创建', 'crm:business:create', 3, 2, 2410, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2413, '商机更新', 'crm:business:update', 3, 3, 2410, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2414, '商机删除', 'crm:business:delete', 3, 4, 2410, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2415, '商机导出', 'crm:business:export', 3, 5, 2410, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2416, '联系人管理', '', 2, 20, 2397, 'contact', 'fa:address-book-o', 'crm/contact/index', 'CrmContact', 0, b'1', b'1', b'1', '', '2023-10-29 11:14:56', '1', '2024-02-17 17:13:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2417, '联系人查询', 'crm:contact:query', 3, 1, 2416, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2418, '联系人创建', 'crm:contact:create', 3, 2, 2416, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2419, '联系人更新', 'crm:contact:update', 3, 3, 2416, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2420, '联系人删除', 'crm:contact:delete', 3, 4, 2416, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2421, '联系人导出', 'crm:contact:export', 3, 5, 2416, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2422, '回款管理', '', 2, 60, 2397, 'receivable', 'ep:money', 'crm/receivable/index', 'CrmReceivable', 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2423, '回款管理查询', 'crm:receivable:query', 3, 1, 2422, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2424, '回款管理创建', 'crm:receivable:create', 3, 2, 2422, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2425, '回款管理更新', 'crm:receivable:update', 3, 3, 2422, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2426, '回款管理删除', 'crm:receivable:delete', 3, 4, 2422, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2427, '回款管理导出', 'crm:receivable:export', 3, 5, 2422, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2428, '回款计划', '', 2, 61, 2397, 'receivable-plan', 'fa:money', 'crm/receivable/plan/index', 'CrmReceivablePlan', 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2429, '回款计划查询', 'crm:receivable-plan:query', 3, 1, 2428, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2430, '回款计划创建', 'crm:receivable-plan:create', 3, 2, 2428, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2431, '回款计划更新', 'crm:receivable-plan:update', 3, 3, 2428, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2432, '回款计划删除', 'crm:receivable-plan:delete', 3, 4, 2428, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2433, '回款计划导出', 'crm:receivable-plan:export', 3, 5, 2428, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2435, '商城装修', '', 2, 20, 2030, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2436, '装修模板', '', 2, 1, 2435, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2437, '装修模板查询', 'promotion:diy-template:query', 3, 1, 2436, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2438, '装修模板创建', 'promotion:diy-template:create', 3, 2, 2436, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2439, '装修模板更新', 'promotion:diy-template:update', 3, 3, 2436, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2440, '装修模板删除', 'promotion:diy-template:delete', 3, 4, 2436, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2441, '装修模板使用', 'promotion:diy-template:use', 3, 5, 2436, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2442, '装修页面', '', 2, 2, 2435, 'diy-page', 'foundation:page-edit', 'mall/promotion/diy/page/index', 'DiyPage', 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2443, '装修页面查询', 'promotion:diy-page:query', 3, 1, 2442, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2444, '装修页面创建', 'promotion:diy-page:create', 3, 2, 2442, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2445, '装修页面更新', 'promotion:diy-page:update', 3, 3, 2442, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2446, '装修页面删除', 'promotion:diy-page:delete', 3, 4, 2442, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2447, '三方登录', '', 1, 10, 1, 'social', 'fa:rocket', '', '', 0, b'1', b'1', b'1', '1', '2023-11-04 12:12:01', '1', '2024-02-29 01:14:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2448, '三方应用', '', 2, 1, 2447, 'client', 'ep:set-up', 'system/social/client/index.vue', 'SocialClient', 0, b'1', b'1', b'1', '1', '2023-11-04 12:17:19', '1', '2024-05-04 19:09:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2449, '三方应用查询', 'system:social-client:query', 3, 1, 2448, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-11-04 12:43:12', '1', '2023-11-04 12:43:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2450, '三方应用创建', 'system:social-client:create', 3, 2, 2448, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-11-04 12:43:58', '1', '2023-11-04 12:43:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2451, '三方应用更新', 'system:social-client:update', 3, 3, 2448, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-11-04 12:44:27', '1', '2023-11-04 12:44:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2452, '三方应用删除', 'system:social-client:delete', 3, 4, 2448, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-11-04 12:44:43', '1', '2023-11-04 12:44:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2453, '三方用户', 'system:social-user:query', 2, 2, 2447, 'user', 'ep:avatar', 'system/social/user/index.vue', 'SocialUser', 0, b'1', b'1', b'1', '1', '2023-11-04 14:01:05', '1', '2023-11-04 14:01:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, b'1', b'1', b'1', '', '2023-11-13 04:39:51', '1', '2023-11-16 23:53:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '1', '2023-11-16 20:34:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '1', '2023-11-16 20:35:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '1', '2023-11-16 23:10:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2497, '主子表(ERP)', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, b'1', b'1', b'1', '', '2023-11-16 15:50:59', '1', '2023-11-17 13:19:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2516, '客户公海配置', '', 2, 0, 2524, 'customer-pool-config', 'ep:data-analysis', 'crm/customer/poolConfig/index', 'CrmCustomerPoolConfig', 0, b'1', b'1', b'1', '', '2023-11-18 13:33:31', '1', '2024-01-03 19:52:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2517, '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, 2516, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-18 13:33:31', '', '2023-11-18 13:33:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2518, '客户限制配置', '', 2, 1, 2524, 'customer-limit-config', 'ep:avatar', 'crm/customer/limitConfig/index', 'CrmCustomerLimitConfig', 0, b'1', b'1', b'1', '', '2023-11-18 13:33:53', '1', '2024-02-24 16:43:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2519, '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, 2518, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2520, '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, 2518, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2521, '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, 2518, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2522, '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, 2518, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2523, '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, 2518, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2524, '系统配置', '', 1, 999, 2397, 'config', 'ep:connection', '', '', 0, b'1', b'1', b'1', '1', '2023-11-18 21:58:00', '1', '2024-02-17 17:14:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, b'1', b'1', b'1', '1', '2023-11-23 19:41:55', '1', '2024-04-23 00:02:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2526, '产品管理', '', 2, 80, 2397, 'product', 'fa:product-hunt', 'crm/product/index', 'CrmProduct', 0, b'1', b'1', b'1', '1', '2023-12-05 22:45:26', '1', '2024-02-20 20:36:20', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2527, '产品查询', 'crm:product:query', 3, 1, 2526, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-05 22:47:16', '1', '2023-12-05 22:47:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2528, '产品创建', 'crm:product:create', 3, 2, 2526, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-05 22:47:41', '1', '2023-12-05 22:47:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2529, '产品更新', 'crm:product:update', 3, 3, 2526, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-05 22:48:03', '1', '2023-12-05 22:48:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2530, '产品删除', 'crm:product:delete', 3, 4, 2526, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-05 22:48:17', '1', '2023-12-05 22:48:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2531, '产品导出', 'crm:product:export', 3, 5, 2526, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-05 22:48:29', '1', '2023-12-05 22:48:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2532, '产品分类配置', '', 2, 3, 2524, 'product/category', 'fa-solid:window-restore', 'crm/product/category/index', 'CrmProductCategory', 0, b'1', b'1', b'1', '1', '2023-12-06 12:52:36', '1', '2023-12-06 12:52:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2533, '产品分类查询', 'crm:product-category:query', 3, 1, 2532, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-06 12:53:23', '1', '2023-12-06 12:53:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2534, '产品分类创建', 'crm:product-category:create', 3, 2, 2532, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-06 12:53:41', '1', '2023-12-06 12:53:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2535, '产品分类更新', 'crm:product-category:update', 3, 3, 2532, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-06 12:53:59', '1', '2023-12-06 12:53:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2536, '产品分类删除', 'crm:product-category:delete', 3, 4, 2532, '', '', '', '', 0, b'1', b'1', b'1', '1', '2023-12-06 12:54:14', '1', '2023-12-06 12:54:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2543, '关联商机', 'crm:contact:create-business', 3, 10, 2416, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-01-02 17:28:25', '1', '2024-01-02 17:28:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2544, '取关商机', 'crm:contact:delete-business', 3, 11, 2416, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-01-02 17:28:43', '1', '2024-01-02 17:28:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2545, '商品统计', '', 2, 3, 2358, 'product', 'fa:product-hunt', 'mall/statistics/product/index', 'ProductStatistics', 0, b'1', b'1', b'1', '', '2023-12-15 18:54:28', '1', '2024-02-26 20:41:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2546, '客户公海', '', 2, 30, 2397, 'customer/pool', 'fa-solid:swimming-pool', 'crm/customer/pool/index', 'CrmCustomerPool', 0, b'1', b'1', b'1', '1', '2024-01-15 21:29:34', '1', '2024-02-17 17:14:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2547, '订单查询', 'trade:order:query', 3, 1, 2076, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-01-16 08:52:00', '1', '2024-01-16 08:52:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2548, '订单更新', 'trade:order:update', 3, 2, 2076, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-01-16 08:52:21', '1', '2024-01-16 08:52:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2549, '支付&退款案例', '', 2, 1, 2161, 'order', 'fa:paypal', 'pay/demo/order/index', '', 0, b'1', b'1', b'1', '1', '2024-01-18 23:45:00', '1', '2024-01-18 23:47:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2550, '转账案例', '', 2, 2, 2161, 'transfer', 'fa:transgender-alt', 'pay/demo/transfer/index', '', 0, b'1', b'1', b'1', '1', '2024-01-18 23:51:16', '1', '2024-01-18 23:51:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2551, '钱包管理', '', 1, 4, 1117, 'wallet', 'ep:wallet', '', '', 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '1', '2024-02-29 08:58:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2552, '充值套餐', '', 2, 2, 2551, 'wallet-recharge-package', 'fa:leaf', 'pay/wallet/rechargePackage/index', 'WalletRechargePackage', 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2553, '钱包充值套餐查询', 'pay:wallet-recharge-package:query', 3, 1, 2552, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2554, '钱包充值套餐创建', 'pay:wallet-recharge-package:create', 3, 2, 2552, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2555, '钱包充值套餐更新', 'pay:wallet-recharge-package:update', 3, 3, 2552, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2556, '钱包充值套餐删除', 'pay:wallet-recharge-package:delete', 3, 4, 2552, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2557, '钱包余额', '', 2, 1, 2551, 'wallet-balance', 'fa:leaf', 'pay/wallet/balance/index', 'WalletBalance', 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2558, '钱包余额查询', 'pay:wallet:query', 3, 1, 2557, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2559, '转账订单', '', 2, 3, 1117, 'transfer', 'ep:credit-card', 'pay/transfer/index', 'PayTransfer', 0, b'1', b'1', b'1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2560, '数据统计', '', 1, 200, 2397, 'statistics', 'ep:data-line', '', '', 0, b'1', b'1', b'1', '1', '2024-01-26 22:50:35', '1', '2024-02-24 20:10:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2561, '排行榜', 'crm:statistics-rank:query', 2, 1, 2560, 'ranking', 'fa:area-chart', 'crm/statistics/rank/index', 'CrmStatisticsRank', 0, b'1', b'1', b'1', '1', '2024-01-26 22:52:09', '1', '2024-04-24 19:39:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2562, '客户导入', 'crm:customer:import', 3, 6, 2391, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-01 13:09:00', '1', '2024-02-01 13:09:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2563, 'ERP 系统', '', 1, 300, 0, '/erp', 'fa-solid:store', '', '', 0, b'1', b'1', b'1', '1', '2024-02-04 15:37:25', '1', '2024-02-04 15:37:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2564, '产品管理', '', 1, 40, 2563, 'product', 'fa:product-hunt', '', '', 0, b'1', b'1', b'1', '1', '2024-02-04 15:38:43', '1', '2024-02-04 15:38:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2565, '产品信息', '', 2, 0, 2564, 'product', 'fa-solid:apple-alt', 'erp/product/product/index', 'ErpProduct', 0, b'1', b'1', b'1', '', '2024-02-04 07:52:15', '1', '2024-02-05 14:42:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2566, '产品查询', 'erp:product:query', 3, 1, 2565, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:21:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2567, '产品创建', 'erp:product:create', 3, 2, 2565, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2568, '产品更新', 'erp:product:update', 3, 3, 2565, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2569, '产品删除', 'erp:product:delete', 3, 4, 2565, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2570, '产品导出', 'erp:product:export', 3, 5, 2565, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2571, '产品分类', '', 2, 1, 2564, 'product-category', 'fa:certificate', 'erp/product/category/index', 'ErpProductCategory', 0, b'1', b'1', b'1', '', '2024-02-04 09:21:04', '1', '2024-02-04 17:24:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2572, '分类查询', 'erp:product-category:query', 3, 1, 2571, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2573, '分类创建', 'erp:product-category:create', 3, 2, 2571, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2574, '分类更新', 'erp:product-category:update', 3, 3, 2571, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2575, '分类删除', 'erp:product-category:delete', 3, 4, 2571, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2576, '分类导出', 'erp:product-category:export', 3, 5, 2571, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2577, '产品单位', '', 2, 2, 2564, 'unit', 'ep:opportunity', 'erp/product/unit/index', 'ErpProductUnit', 0, b'1', b'1', b'1', '', '2024-02-04 11:54:08', '1', '2024-02-04 19:54:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2578, '单位查询', 'erp:product-unit:query', 3, 1, 2577, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2579, '单位创建', 'erp:product-unit:create', 3, 2, 2577, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2580, '单位更新', 'erp:product-unit:update', 3, 3, 2577, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2581, '单位删除', 'erp:product-unit:delete', 3, 4, 2577, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2582, '单位导出', 'erp:product-unit:export', 3, 5, 2577, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2583, '库存管理', '', 1, 30, 2563, 'stock', 'fa:window-restore', '', '', 0, b'1', b'1', b'1', '1', '2024-02-05 00:29:37', '1', '2024-02-05 00:29:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2584, '仓库信息', '', 2, 0, 2583, 'warehouse', 'ep:house', 'erp/stock/warehouse/index', 'ErpWarehouse', 0, b'1', b'1', b'1', '', '2024-02-04 17:12:09', '1', '2024-02-05 01:12:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2585, '仓库查询', 'erp:warehouse:query', 3, 1, 2584, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2586, '仓库创建', 'erp:warehouse:create', 3, 2, 2584, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2587, '仓库更新', 'erp:warehouse:update', 3, 3, 2584, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2588, '仓库删除', 'erp:warehouse:delete', 3, 4, 2584, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2589, '仓库导出', 'erp:warehouse:export', 3, 5, 2584, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2590, '产品库存', '', 2, 1, 2583, 'stock', 'ep:coffee', 'erp/stock/stock/index', 'ErpStock', 0, b'1', b'1', b'1', '', '2024-02-05 06:40:50', '1', '2024-02-05 14:42:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2591, '库存查询', 'erp:stock:query', 3, 1, 2590, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2592, '库存导出', 'erp:stock:export', 3, 5, 2590, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2593, '出入库明细', '', 2, 2, 2583, 'record', 'fa-solid:blog', 'erp/stock/record/index', 'ErpStockRecord', 0, b'1', b'1', b'1', '', '2024-02-05 10:27:21', '1', '2024-02-06 17:26:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2594, '库存明细查询', 'erp:stock-record:query', 3, 1, 2593, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2595, '库存明细导出', 'erp:stock-record:export', 3, 5, 2593, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2596, '其它入库', '', 2, 3, 2583, 'in', 'ep:zoom-in', 'erp/stock/in/index', 'ErpStockIn', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2597, '其它入库单查询', 'erp:stock-in:query', 3, 1, 2596, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2598, '其它入库单创建', 'erp:stock-in:create', 3, 2, 2596, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2599, '其它入库单更新', 'erp:stock-in:update', 3, 3, 2596, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2600, '其它入库单删除', 'erp:stock-in:delete', 3, 4, 2596, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2601, '其它入库单导出', 'erp:stock-in:export', 3, 5, 2596, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2602, '采购管理', '', 1, 10, 2563, 'purchase', 'fa:buysellads', '', '', 0, b'1', b'1', b'1', '1', '2024-02-06 16:01:01', '1', '2024-02-06 16:01:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2603, '供应商信息', '', 2, 4, 2602, 'supplier', 'fa:superpowers', 'erp/purchase/supplier/index', 'ErpSupplier', 0, b'1', b'1', b'1', '', '2024-02-06 08:21:55', '1', '2024-02-06 16:22:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2604, '供应商查询', 'erp:supplier:query', 3, 1, 2603, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2605, '供应商创建', 'erp:supplier:create', 3, 2, 2603, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2606, '供应商更新', 'erp:supplier:update', 3, 3, 2603, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2607, '供应商删除', 'erp:supplier:delete', 3, 4, 2603, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2608, '供应商导出', 'erp:supplier:export', 3, 5, 2603, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2609, '其它入库单审批', 'erp:stock-in:update-status', 3, 6, 2596, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2610, '其它出库', '', 2, 4, 2583, 'out', 'ep:zoom-out', 'erp/stock/out/index', 'ErpStockOut', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2611, '其它出库单查询', 'erp:stock-out:query', 3, 1, 2610, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:39', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2612, '其它出库单创建', 'erp:stock-out:create', 3, 2, 2610, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2613, '其它出库单更新', 'erp:stock-out:update', 3, 3, 2610, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2614, '其它出库单删除', 'erp:stock-out:delete', 3, 4, 2610, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2615, '其它出库单导出', 'erp:stock-out:export', 3, 5, 2610, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2616, '其它出库单审批', 'erp:stock-out:update-status', 3, 6, 2610, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2617, '销售管理', '', 1, 20, 2563, 'sale', 'fa:sellsy', '', '', 0, b'1', b'1', b'1', '1', '2024-02-07 15:12:32', '1', '2024-02-07 15:12:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2618, '客户信息', '', 2, 4, 2617, 'customer', 'ep:avatar', 'erp/sale/customer/index', 'ErpCustomer', 0, b'1', b'1', b'1', '', '2024-02-07 07:21:45', '1', '2024-02-07 15:22:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2619, '客户查询', 'erp:customer:query', 3, 1, 2618, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2620, '客户创建', 'erp:customer:create', 3, 2, 2618, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2621, '客户更新', 'erp:customer:update', 3, 3, 2618, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2622, '客户删除', 'erp:customer:delete', 3, 4, 2618, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2623, '客户导出', 'erp:customer:export', 3, 5, 2618, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2624, '库存调拨', '', 2, 5, 2583, 'move', 'ep:folder-remove', 'erp/stock/move/index', 'ErpStockMove', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-16 18:53:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2625, '库存调度单查询', 'erp:stock-move:query', 3, 1, 2624, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2626, '库存调度单创建', 'erp:stock-move:create', 3, 2, 2624, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2627, '库存调度单更新', 'erp:stock-move:update', 3, 3, 2624, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2628, '库存调度单删除', 'erp:stock-move:delete', 3, 4, 2624, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2629, '库存调度单导出', 'erp:stock-move:export', 3, 5, 2624, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2630, '库存调度单审批', 'erp:stock-move:update-status', 3, 6, 2624, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2631, '库存盘点', '', 2, 6, 2583, 'check', 'ep:circle-check-filled', 'erp/stock/check/index', 'ErpStockCheck', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-08 08:31:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2632, '库存盘点单查询', 'erp:stock-check:query', 3, 1, 2631, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2633, '库存盘点单创建', 'erp:stock-check:create', 3, 2, 2631, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2634, '库存盘点单更新', 'erp:stock-check:update', 3, 3, 2631, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2635, '库存盘点单删除', 'erp:stock-check:delete', 3, 4, 2631, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2636, '库存盘点单导出', 'erp:stock-check:export', 3, 5, 2631, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2637, '库存盘点单审批', 'erp:stock-check:update-status', 3, 6, 2631, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2638, '销售订单', '', 2, 1, 2617, 'order', 'fa:first-order', 'erp/sale/order/index', 'ErpSaleOrder', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-10 21:59:20', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2639, '销售订单查询', 'erp:sale-order:query', 3, 1, 2638, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2640, '销售订单创建', 'erp:sale-order:create', 3, 2, 2638, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2641, '销售订单更新', 'erp:sale-order:update', 3, 3, 2638, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2642, '销售订单删除', 'erp:sale-order:delete', 3, 4, 2638, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2643, '销售订单导出', 'erp:sale-order:export', 3, 5, 2638, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2644, '销售订单审批', 'erp:sale-order:update-status', 3, 6, 2638, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2645, '财务管理', '', 1, 50, 2563, 'finance', 'ep:money', '', '', 0, b'1', b'1', b'1', '1', '2024-02-10 08:05:58', '1', '2024-02-10 08:06:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2646, '结算账户', '', 2, 10, 2645, 'account', 'fa:universal-access', 'erp/finance/account/index', 'ErpAccount', 0, b'1', b'1', b'1', '', '2024-02-10 00:15:07', '1', '2024-02-14 08:24:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2647, '结算账户查询', 'erp:account:query', 3, 1, 2646, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2648, '结算账户创建', 'erp:account:create', 3, 2, 2646, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2649, '结算账户更新', 'erp:account:update', 3, 3, 2646, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2650, '结算账户删除', 'erp:account:delete', 3, 4, 2646, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2651, '结算账户导出', 'erp:account:export', 3, 5, 2646, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2652, '销售出库', '', 2, 2, 2617, 'out', 'ep:sold-out', 'erp/sale/out/index', 'ErpSaleOut', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-10 22:02:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2653, '销售出库查询', 'erp:sale-out:query', 3, 1, 2652, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2654, '销售出库创建', 'erp:sale-out:create', 3, 2, 2652, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2655, '销售出库更新', 'erp:sale-out:update', 3, 3, 2652, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2656, '销售出库删除', 'erp:sale-out:delete', 3, 4, 2652, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2657, '销售出库导出', 'erp:sale-out:export', 3, 5, 2652, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2658, '销售出库审批', 'erp:sale-out:update-status', 3, 6, 2652, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2659, '销售退货', '', 2, 3, 2617, 'return', 'fa-solid:bone', 'erp/sale/return/index', 'ErpSaleReturn', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-12 06:12:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2660, '销售退货查询', 'erp:sale-return:query', 3, 1, 2659, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2661, '销售退货创建', 'erp:sale-return:create', 3, 2, 2659, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2662, '销售退货更新', 'erp:sale-return:update', 3, 3, 2659, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2663, '销售退货删除', 'erp:sale-return:delete', 3, 4, 2659, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2664, '销售退货导出', 'erp:sale-return:export', 3, 5, 2659, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2665, '销售退货审批', 'erp:sale-return:update-status', 3, 6, 2659, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2666, '采购订单', '', 2, 1, 2602, 'order', 'fa-solid:border-all', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-12 08:51:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2667, '采购订单查询', 'erp:purchase-order:query', 3, 1, 2666, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2668, '采购订单创建', 'erp:purchase-order:create', 3, 2, 2666, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2669, '采购订单更新', 'erp:purchase-order:update', 3, 3, 2666, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2670, '采购订单删除', 'erp:purchase-order:delete', 3, 4, 2666, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2671, '采购订单导出', 'erp:purchase-order:export', 3, 5, 2666, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2672, '采购订单审批', 'erp:purchase-order:update-status', 3, 6, 2666, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2673, '采购入库', '', 2, 2, 2602, 'in', 'fa-solid:gopuram', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-12 11:19:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2674, '采购入库查询', 'erp:purchase-in:query', 3, 1, 2673, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2675, '采购入库创建', 'erp:purchase-in:create', 3, 2, 2673, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2676, '采购入库更新', 'erp:purchase-in:update', 3, 3, 2673, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2677, '采购入库删除', 'erp:purchase-in:delete', 3, 4, 2673, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2678, '采购入库导出', 'erp:purchase-in:export', 3, 5, 2673, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2679, '采购入库审批', 'erp:purchase-in:update-status', 3, 6, 2673, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2680, '采购退货', '', 2, 3, 2602, 'return', 'ep:minus', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-12 20:51:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2681, '采购退货查询', 'erp:purchase-return:query', 3, 1, 2680, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2682, '采购退货创建', 'erp:purchase-return:create', 3, 2, 2680, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2683, '采购退货更新', 'erp:purchase-return:update', 3, 3, 2680, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2684, '采购退货删除', 'erp:purchase-return:delete', 3, 4, 2680, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2685, '采购退货导出', 'erp:purchase-return:export', 3, 5, 2680, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2686, '采购退货审批', 'erp:purchase-return:update-status', 3, 6, 2680, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2687, '付款单', '', 2, 1, 2645, 'payment', 'ep:caret-right', 'erp/finance/payment/index', 'ErpFinancePayment', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-14 08:24:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2688, '付款单查询', 'erp:finance-payment:query', 3, 1, 2687, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2689, '付款单创建', 'erp:finance-payment:create', 3, 2, 2687, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2690, '付款单更新', 'erp:finance-payment:update', 3, 3, 2687, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2691, '付款单删除', 'erp:finance-payment:delete', 3, 4, 2687, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2692, '付款单导出', 'erp:finance-payment:export', 3, 5, 2687, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2693, '付款单审批', 'erp:finance-payment:update-status', 3, 6, 2687, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2694, '收款单', '', 2, 2, 2645, 'receipt', 'ep:expand', 'erp/finance/receipt/index', 'ErpFinanceReceipt', 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '1', '2024-02-15 19:35:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2695, '收款单查询', 'erp:finance-receipt:query', 3, 1, 2694, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2696, '收款单创建', 'erp:finance-receipt:create', 3, 2, 2694, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2697, '收款单更新', 'erp:finance-receipt:update', 3, 3, 2694, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2698, '收款单删除', 'erp:finance-receipt:delete', 3, 4, 2694, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2699, '收款单导出', 'erp:finance-receipt:export', 3, 5, 2694, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2700, '收款单审批', 'erp:finance-receipt:update-status', 3, 6, 2694, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2701, '待办事项', '', 2, 0, 2397, 'backlog', 'fa-solid:tasks', 'crm/backlog/index', 'CrmBacklog', 0, b'1', b'1', b'1', '1', '2024-02-17 17:17:11', '1', '2024-02-17 17:17:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2702, 'ERP 首页', 'erp:statistics:query', 2, 0, 2563, 'home', 'ep:home-filled', 'erp/home/index.vue', 'ErpHome', 0, b'1', b'1', b'1', '1', '2024-02-18 16:49:40', '1', '2024-02-26 21:12:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2703, '商机状态配置', '', 2, 4, 2524, 'business-status', 'fa-solid:charging-station', 'crm/business/status/index', 'CrmBusinessStatus', 0, b'1', b'1', b'1', '1', '2024-02-21 20:15:17', '1', '2024-02-21 20:15:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2704, '商机状态查询', 'crm:business-status:query', 3, 1, 2703, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-21 20:35:36', '1', '2024-02-21 20:36:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2705, '商机状态创建', 'crm:business-status:create', 3, 2, 2703, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-21 20:35:57', '1', '2024-02-21 20:35:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2706, '商机状态更新', 'crm:business-status:update', 3, 3, 2703, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-21 20:36:21', '1', '2024-02-21 20:36:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2707, '商机状态删除', 'crm:business-status:delete', 3, 4, 2703, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-21 20:36:36', '1', '2024-02-21 20:36:36', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2708, '合同配置', '', 2, 5, 2524, 'contract-config', 'ep:connection', 'crm/contract/config/index', 'CrmContractConfig', 0, b'1', b'1', b'1', '1', '2024-02-24 16:44:40', '1', '2024-02-24 16:44:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2709, '客户公海配置查询', 'crm:customer-pool-config:query', 3, 2, 2516, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-24 16:45:19', '1', '2024-02-24 16:45:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2710, '合同配置更新', 'crm:contract-config:update', 3, 1, 2708, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-24 16:45:56', '1', '2024-02-24 16:45:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2711, '合同配置查询', 'crm:contract-config:query', 3, 2, 2708, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-24 16:46:16', '1', '2024-02-24 16:46:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2712, '客户分析', 'crm:statistics-customer:query', 2, 0, 2560, 'customer', 'ep:avatar', 'crm/statistics/customer/index.vue', 'CrmStatisticsCustomer', 0, b'1', b'1', b'1', '1', '2024-03-09 16:43:56', '1', '2024-05-04 20:38:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, b'1', b'1', b'1', '1', '2024-03-17 21:50:23', '1', '2024-04-24 19:55:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-21 23:51:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, b'1', b'0', b'1', '1', '2024-03-19 19:46:05', '1', '2024-03-23 19:03:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, b'1', b'1', b'1', '1', '2024-03-21 23:57:30', '1', '2024-03-21 23:57:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-03-22 08:18:27', '1', '2024-03-22 08:19:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-03-22 08:19:25', '1', '2024-03-22 08:19:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, b'1', b'1', b'1', '1', '2024-03-22 08:43:22', '1', '2024-03-22 08:43:27', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-03-22 08:43:49', '1', '2024-03-22 08:43:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '1', '2024-03-23 13:13:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '1', '2024-03-23 19:43:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2736, '员工业绩', 'crm:statistics-performance:query', 2, 3, 2560, 'performance', 'ep:dish-dot', 'crm/statistics/performance/index', 'CrmStatisticsPerformance', 0, b'1', b'1', b'1', '1', '2024-04-05 13:49:20', '1', '2024-04-24 19:42:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2737, '客户画像', 'crm:statistics-portrait:query', 2, 4, 2560, 'portrait', 'ep:picture', 'crm/statistics/portrait/index', 'CrmStatisticsPortrait', 0, b'1', b'1', b'1', '1', '2024-04-05 13:57:40', '1', '2024-04-24 19:42:24', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2738, '销售漏斗', 'crm:statistics-funnel:query', 2, 5, 2560, 'funnel', 'ep:grape', 'crm/statistics/funnel/index', 'CrmStatisticsFunnel', 0, b'1', b'1', b'1', '1', '2024-04-13 10:53:26', '1', '2024-04-24 19:39:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2739, '消息中心', '', 1, 7, 1, 'messages', 'ep:chat-dot-round', '', '', 0, b'1', b'1', b'1', '1', '2024-04-22 23:54:30', '1', '2024-04-23 09:36:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, b'1', b'1', b'1', '1', '2024-04-23 00:04:44', '1', '2024-04-23 00:04:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2741, '领取公海客户', 'crm:customer:receive', 3, 1, 2546, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:47:45', '1', '2024-04-24 19:47:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2742, '分配公海客户', 'crm:customer:distribute', 3, 2, 2546, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:48:05', '1', '2024-04-24 19:48:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2743, '商品统计查询', 'statistics:product:query', 3, 1, 2545, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:50:05', '1', '2024-04-24 19:50:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2744, '商品统计导出', 'statistics:product:export', 3, 2, 2545, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:50:26', '1', '2024-04-24 19:50:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2745, '支付渠道查询', 'pay:channel:query', 3, 10, 1126, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:53:01', '1', '2024-04-24 19:53:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2746, '支付渠道创建', 'pay:channel:create', 3, 11, 1126, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:53:18', '1', '2024-04-24 19:53:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2747, '支付渠道更新', 'pay:channel:update', 3, 12, 1126, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:53:32', '1', '2024-04-24 19:53:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2748, '支付渠道删除', 'pay:channel:delete', 3, 13, 1126, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:54:34', '1', '2024-04-24 19:54:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2749, '商品收藏查询', 'product:favorite:query', 3, 10, 2014, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:55:47', '1', '2024-04-24 19:55:47', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2750, '商品浏览查询', 'product:browse-history:query', 3, 20, 2014, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:57:43', '1', '2024-04-24 19:57:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2751, '售后同意', 'trade:after-sale:agree', 3, 2, 2073, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:58:40', '1', '2024-04-24 19:58:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2752, '售后不同意', 'trade:after-sale:disagree', 3, 3, 2073, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 19:59:03', '1', '2024-04-24 19:59:03', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2753, '售后确认退货', 'trade:after-sale:receive', 3, 4, 2073, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 20:00:07', '1', '2024-04-24 20:00:07', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2754, '售后确认退款', 'trade:after-sale:refund', 3, 5, 2073, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 20:00:24', '1', '2024-04-24 20:00:24', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2755, '删除项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 20:01:37', '1', '2024-04-24 20:01:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2756, '会员等级记录查询', 'member:level-record:query', 3, 10, 2325, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 20:02:32', '1', '2024-04-24 20:02:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2757, '会员经验记录查询', 'member:experience-record:query', 3, 11, 2325, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-04-24 20:02:51', '1', '2024-04-24 20:02:51', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2758, 'AI 大模型', '', 1, 400, 0, '/ai', 'fa:apple', '', '', 0, b'1', b'1', b'1', '1', '2024-05-07 15:07:56', '1', '2024-05-25 12:36:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2759, 'AI 对话', '', 2, 1, 2758, 'chat', 'ep:message', 'ai/chat/index/index.vue', 'AiChat', 0, b'1', b'1', b'1', '1', '2024-05-07 15:09:14', '1', '2024-07-07 17:15:36', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2760, '控制台', '', 1, 100, 2758, 'console', 'ep:setting', '', '', 0, b'1', b'1', b'1', '1', '2024-05-09 22:39:09', '1', '2024-05-24 23:34:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2761, 'API 密钥', '', 2, 0, 2760, 'api-key', 'ep:key', 'ai/model/apiKey/index.vue', 'AiApiKey', 0, b'1', b'1', b'1', '', '2024-05-09 14:52:56', '1', '2024-05-10 22:44:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2762, 'API 密钥查询', 'ai:api-key:query', 3, 1, 2761, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2763, 'API 密钥创建', 'ai:api-key:create', 3, 2, 2761, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:26', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2764, 'API 密钥更新', 'ai:api-key:update', 3, 3, 2761, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2765, 'API 密钥删除', 'ai:api-key:delete', 3, 4, 2761, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-09 14:52:56', '1', '2024-05-13 20:36:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2767, '聊天模型', '', 2, 0, 2760, 'chat-model', 'fa-solid:abacus', 'ai/model/chatModel/index.vue', 'AiChatModel', 0, b'1', b'1', b'1', '', '2024-05-10 14:42:48', '1', '2024-05-10 22:44:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2768, '聊天模型查询', 'ai:chat-model:query', 3, 1, 2767, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:02', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2769, '聊天模型创建', 'ai:chat-model:create', 3, 2, 2767, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2770, '聊天模型更新', 'ai:chat-model:update', 3, 3, 2767, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2771, '聊天模型删除', 'ai:chat-model:delete', 3, 4, 2767, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-10 14:42:48', '1', '2024-05-13 20:37:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2773, '聊天角色', '', 2, 0, 2760, 'chat-role', 'fa:user-secret', 'ai/model/chatRole/index.vue', 'AiChatRole', 0, b'1', b'1', b'1', '', '2024-05-13 12:39:28', '1', '2024-05-13 20:41:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2774, '聊天角色查询', 'ai:chat-role:query', 3, 1, 2773, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-05-13 12:39:28', '', '2024-05-13 12:39:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2775, '聊天角色创建', 'ai:chat-role:create', 3, 2, 2773, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-05-13 12:39:28', '', '2024-05-13 12:39:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2776, '聊天角色更新', 'ai:chat-role:update', 3, 3, 2773, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-05-13 12:39:28', '', '2024-05-13 12:39:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2777, '聊天角色删除', 'ai:chat-role:delete', 3, 4, 2773, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-05-13 21:43:38', '1', '2024-05-13 21:43:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2778, '聊天管理', '', 2, 10, 2760, 'chat-conversation', 'ep:chat-square', 'ai/chat/manager/index.vue', 'AiChatManager', 0, b'1', b'1', b'1', '', '2024-05-24 15:39:18', '1', '2024-06-26 21:36:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2779, '会话查询', 'ai:chat-conversation:query', 3, 1, 2778, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-24 15:39:18', '1', '2024-05-25 08:38:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2780, '会话删除', 'ai:chat-conversation:delete', 3, 2, 2778, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-05-24 15:39:18', '1', '2024-05-25 08:38:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2781, '消息查询', 'ai:chat-message:query', 3, 11, 2778, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-05-25 08:38:56', '1', '2024-05-25 08:38:56', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2782, '消息删除', 'ai:chat-message:delete', 3, 12, 2778, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-05-25 08:39:10', '1', '2024-05-25 08:39:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2783, 'AI 绘画', '', 2, 2, 2758, 'image', 'ep:picture-rounded', 'ai/image/index/index.vue', 'AiImage', 0, b'1', b'1', b'1', '1', '2024-05-26 11:45:17', '1', '2024-07-07 17:18:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2784, '绘画管理', '', 2, 11, 2760, 'image', 'fa:file-image-o', 'ai/image/manager/index.vue', 'AiImageManager', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 21:37:13', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2785, '绘画查询', 'ai:image:query', 3, 1, 2784, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:21:57', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2786, '绘画删除', 'ai:image:delete', 3, 4, 2784, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-06-26 13:32:31', '1', '2024-06-26 22:22:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2787, '绘图更新', 'ai:image:update', 3, 2, 2784, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-06-26 22:47:56', '1', '2024-08-31 09:21:35', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2788, '音乐管理', '', 2, 12, 2760, 'music', 'fa:music', 'ai/music/manager/index.vue', 'AiMusicManager', 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '1', '2024-06-27 23:04:19', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2789, '音乐查询', 'ai:music:query', 3, 1, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2790, '音乐更新', 'ai:music:update', 3, 3, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2791, '音乐删除', 'ai:music:delete', 3, 4, 2788, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-06-27 15:03:33', '', '2024-06-27 15:03:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2792, 'AI 写作', '', 2, 3, 2758, 'write', 'fa-solid:book-reader', 'ai/write/index/index.vue', 'AiWrite', 0, b'1', b'1', b'1', '1', '2024-07-08 09:26:44', '1', '2024-07-16 13:03:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2793, '写作管理', '', 2, 13, 2760, 'write', 'fa:bookmark-o', 'ai/write/manager/index.vue', 'AiWriteManager', 0, b'1', b'1', b'1', '', '2024-07-10 13:24:34', '1', '2024-07-10 21:31:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2794, 'AI 写作查询', 'ai:write:query', 3, 1, 2793, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-07-10 13:24:34', '', '2024-07-10 13:24:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2795, 'AI 写作删除', 'ai:write:delete', 3, 4, 2793, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-07-10 13:24:34', '', '2024-07-10 13:24:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2796, 'AI 音乐', '', 2, 4, 2758, 'music', 'fa:music', 'ai/music/index/index.vue', 'AiMusic', 0, b'1', b'1', b'1', '1', '2024-07-17 09:21:12', '1', '2024-07-29 21:11:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2797, '客服中心', '', 2, 100, 2362, 'kefu', 'fa-solid:user-alt', 'mall/promotion/kefu/index', 'KeFu', 0, b'1', b'1', b'1', '1', '2024-07-17 23:49:05', '1', '2024-07-17 23:49:16', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2798, 'AI 思维导图', '', 2, 5, 2758, 'mind-map', 'fa:sitemap', 'ai/mindmap/index/index.vue', 'AiMindMap', 0, b'1', b'1', b'1', '1', '2024-07-29 21:31:59', '1', '2024-07-29 21:33:20', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2799, '导图管理', '', 2, 14, 2760, 'mind-map', 'fa:map', 'ai/mindmap/manager/index', 'AiMindMapManager', 0, b'1', b'1', b'1', '', '2024-08-10 09:15:09', '1', '2024-08-10 17:24:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2800, '思维导图查询', 'ai:mind-map:query', 3, 1, 2799, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-08-10 09:15:09', '', '2024-08-10 09:15:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2801, '思维导图删除', 'ai:mind-map:delete', 3, 4, 2799, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2024-08-10 09:15:09', '', '2024-08-10 09:15:09', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2802, '会话查询', 'promotion:kefu-conversation:query', 3, 1, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:17:52', '1', '2024-08-31 09:18:52', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2803, '会话更新', 'promotion:kefu-conversation:update', 3, 2, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:18:15', '1', '2024-08-31 09:19:29', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2804, '消息查询', 'promotion:kefu-message:query', 3, 10, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:18:42', '1', '2024-08-31 09:18:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2805, '会话删除', 'promotion:kefu-conversation:delete', 3, 3, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:19:51', '1', '2024-08-31 09:20:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2806, '消息发送', 'promotion:kefu-message:send', 3, 12, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:20:06', '1', '2024-08-31 09:20:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2807, '消息更新', 'promotion:kefu-message:update', 3, 11, 2797, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-08-31 09:20:22', '1', '2024-08-31 09:20:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2808, '积分商城', '', 2, 5, 2030, 'point-activity', 'ep:bowl', 'mall/promotion/point/activity/index', 'PointActivity', 0, b'1', b'1', b'1', '', '2024-09-21 05:36:42', '1', '2024-09-23 09:14:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2809, '积分商城活动查询', 'promotion:point-activity:query', 3, 1, 2808, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-09-21 05:36:42', '1', '2024-09-22 14:49:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2810, '积分商城活动创建', 'promotion:point-activity:create', 3, 2, 2808, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-09-21 05:36:42', '1', '2024-09-22 14:49:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2811, '积分商城活动更新', 'promotion:point-activity:update', 3, 3, 2808, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-09-21 05:36:42', '1', '2024-09-22 14:49:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2812, '积分商城活动删除', 'promotion:point-activity:delete', 3, 4, 2808, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-09-21 05:36:42', '1', '2024-09-22 14:49:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2813, '积分商城活动导出', 'promotion:point-activity:export', 3, 5, 2808, '', '', '', '', 0, b'1', b'1', b'1', '', '2024-09-21 05:36:42', '1', '2024-09-22 14:49:27', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS `system_notice`; +CREATE TABLE `system_notice` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公告标题', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公告内容', + `type` tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '公告状态(0正常 1关闭)', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +BEGIN; +INSERT INTO `system_notice` (`id`, `title`, `content`, `type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '芋道的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', b'0', 1); +INSERT INTO `system_notice` (`id`, `title`, `content`, `type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '维护通知:2018-07-01 系统凌晨维护', '

\"\"11112222\"image\"

', 2, 1, 'admin', '2021-01-05 17:03:48', '1', '2024-09-24 20:48:09', b'0', 1); +INSERT INTO `system_notice` (`id`, `title`, `content`, `type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', b'0', 121); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS `system_notify_message`; +CREATE TABLE `system_notify_message` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `user_id` bigint NOT NULL COMMENT '用户id', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `template_id` bigint NOT NULL COMMENT '模版编号', + `template_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `template_nickname` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版发送人名称', + `template_content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版内容', + `template_type` int NOT NULL COMMENT '模版类型', + `template_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版参数', + `read_status` bit(1) NOT NULL COMMENT '是否已读', + `read_time` datetime NULL DEFAULT NULL COMMENT '阅读时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +BEGIN; +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{\"name\":\"1\",\"what\":\"2\"}', b'1', '2023-02-10 00:47:04', '1', '2023-01-28 11:44:08', '1', '2023-02-10 00:47:04', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{\"name\":\"1\",\"what\":\"2\"}', b'1', '2023-02-10 00:47:04', '1', '2023-01-28 11:45:04', '1', '2023-02-10 00:47:04', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, 103, 2, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{\"name\":\"哈哈\"}', b'0', NULL, '1', '2023-01-28 21:02:20', '1', '2023-01-28 21:02:20', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{\"name\":\"芋艿\",\"what\":\"写代码\"}', b'1', '2023-02-10 00:47:04', '1', '2023-01-28 22:21:42', '1', '2023-02-10 00:47:04', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{\"name\":\"芋艿\",\"what\":\"写代码\"}', b'1', '2023-01-29 10:52:06', '1', '2023-01-28 22:22:07', '1', '2023-01-29 10:52:06', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (7, 1, 2, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{\"name\":\"2\",\"what\":\"3\"}', b'1', '2023-01-29 10:52:06', '1', '2023-01-28 23:45:21', '1', '2023-01-29 10:52:06', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (8, 1, 2, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{\"name\":\"123\"}', b'1', '2023-01-29 10:52:06', '1', '2023-01-28 23:50:21', '1', '2023-01-29 10:52:06', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (9, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, '{\"reason\":null,\"createTime\":\"2023-09-28 08:35:46\",\"price\":\"0.09\"}', b'0', NULL, '1', '2023-09-28 16:36:22', '1', '2023-09-28 16:36:22', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `user_type`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (10, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, '{\"reason\":null,\"createTime\":\"2023-09-30 20:59:40\",\"price\":\"1.00\"}', b'0', NULL, '1', '2023-10-03 12:11:34', '1', '2023-10-03 12:11:34', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS `system_notify_template`; +CREATE TABLE `system_notify_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称', + `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版编码', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '发送人名称', + `content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版内容', + `type` tinyint NOT NULL COMMENT '类型', + `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '参数数组', + `status` tinyint NOT NULL COMMENT '状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '站内信模板表'; + +-- ---------------------------- +-- Records of system_notify_template +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_access_token`; +CREATE TABLE `system_oauth2_access_token` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `user_info` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户信息', + `access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '访问令牌', + `refresh_token` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '刷新令牌', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权范围', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_access_token`(`access_token` ASC) USING BTREE, + INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 10113 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; + +-- ---------------------------- +-- Records of system_oauth2_access_token +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_approve`; +CREATE TABLE `system_oauth2_approve` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '授权范围', + `approved` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否接受', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 82 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 批准表'; + +-- ---------------------------- +-- Records of system_oauth2_approve +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_client`; +CREATE TABLE `system_oauth2_client` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端密钥', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用图标', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用描述', + `status` tinyint NOT NULL COMMENT '状态', + `access_token_validity_seconds` int NOT NULL COMMENT '访问令牌的有效期', + `refresh_token_validity_seconds` int NOT NULL COMMENT '刷新令牌的有效期', + `redirect_uris` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '可重定向的 URI 地址', + `authorized_grant_types` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授权类型', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权范围', + `auto_approve_scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '自动通过的授权范围', + `authorities` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '权限', + `resource_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '资源', + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '附加信息', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +BEGIN; +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 2592000, '[\"https://www.iocoder.cn\",\"https://doc.iocoder.cn\"]', '[\"password\",\"authorization_code\",\"implicit\",\"refresh_token\"]', '[\"user.read\",\"user.write\"]', '[]', '[\"user.read\",\"user.write\"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2024-02-22 16:31:52', b'0'); +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', '啦啦啦啦', 0, 1800, 43200, '[\"https://www.iocoder.cn\"]', '[\"password\",\"authorization_code\",\"implicit\"]', '[\"user_info\",\"projects\"]', '[\"user_info\"]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2023-12-02 21:01:01', b'0'); +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '[\"http://127.0.0.1:18080\"]', '[\"authorization_code\",\"refresh_token\"]', '[\"user.read\",\"user.write\"]', '[]', '[]', '[]', NULL, '1', '2022-09-29 13:28:31', '1', '2022-09-29 13:28:31', b'0'); +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '[\"http://127.0.0.1:18080\"]', '[\"password\",\"refresh_token\"]', '[\"user.read\",\"user.write\"]', '[]', '[]', '[]', NULL, '1', '2022-10-04 17:40:16', '1', '2022-10-04 20:31:21', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_code`; +CREATE TABLE `system_oauth2_code` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授权码', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '授权范围', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `redirect_uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '可重定向的 URI 地址', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '状态', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 147 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 授权码表'; + +-- ---------------------------- +-- Records of system_oauth2_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_refresh_token`; +CREATE TABLE `system_oauth2_refresh_token` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `refresh_token` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '刷新令牌', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权范围', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1652 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; + +-- ---------------------------- +-- Records of system_oauth2_refresh_token +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_operate_log`; +CREATE TABLE `system_operate_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作模块类型', + `sub_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名', + `biz_id` bigint NOT NULL COMMENT '操作数据模块编号', + `action` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作内容', + `extra` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '拓展字段', + `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求方法名', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求地址', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户 IP', + `user_agent` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '浏览器 UA', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9063 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录 V2 版本'; + +-- ---------------------------- +-- Records of system_operate_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS `system_post`; +CREATE TABLE `system_post` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位名称', + `sort` int NOT NULL COMMENT '显示顺序', + `status` tinyint NOT NULL COMMENT '状态(0正常 1停用)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +BEGIN; +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2023-02-11 15:19:04', b'0', 1); +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 09:18:20', b'0', 1); +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 10:04:37', b'0', 1); +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, 'HR', '人力资源', 5, 0, '', '1', '2024-03-24 20:45:40', '1', '2024-03-24 20:45:40', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS `system_role`; +CREATE TABLE `system_role` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称', + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色权限字符串', + `sort` int NOT NULL COMMENT '显示顺序', + `data_scope` tinyint NOT NULL DEFAULT 1 COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `data_scope_dept_ids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)', + `status` tinyint NOT NULL COMMENT '角色状态(0正常 1停用)', + `type` tinyint NOT NULL COMMENT '角色类型', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 154 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +BEGIN; +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '', '', '2021-01-06 13:49:35', '1', '2024-08-11 10:41:10', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (153, '某角色', 'tt', 4, 1, '', 0, 2, '', '1', '2024-08-17 14:09:35', '1', '2024-08-17 14:09:35', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `system_role_menu`; +CREATE TABLE `system_role_menu` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5793 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +BEGIN; +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1729, 109, 100, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1730, 109, 101, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1731, 109, 1063, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1732, 109, 1064, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1733, 109, 1001, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1734, 109, 1065, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1735, 109, 1002, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1736, 109, 1003, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1737, 109, 1004, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1738, 109, 1005, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1739, 109, 1006, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1740, 109, 1007, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1741, 109, 1008, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1742, 109, 1009, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1743, 109, 1010, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1744, 109, 1011, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1745, 109, 1012, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1746, 111, 100, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1747, 111, 101, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1748, 111, 1063, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1749, 111, 1064, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1750, 111, 1001, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1751, 111, 1065, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1752, 111, 1002, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1753, 111, 1003, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1754, 111, 1004, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1755, 111, 1005, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1756, 111, 1006, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1757, 111, 1007, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1758, 111, 1008, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1759, 111, 1009, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1760, 111, 1010, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1761, 111, 1011, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1762, 111, 1012, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1763, 109, 100, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1764, 109, 101, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1765, 109, 1063, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1766, 109, 1064, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1767, 109, 1001, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1768, 109, 1065, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1769, 109, 1002, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1770, 109, 1003, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1771, 109, 1004, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1772, 109, 1005, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1773, 109, 1006, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1774, 109, 1007, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1775, 109, 1008, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1776, 109, 1009, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1777, 109, 1010, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1778, 109, 1011, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1779, 109, 1012, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1780, 111, 100, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1781, 111, 101, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1782, 111, 1063, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1783, 111, 1064, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1784, 111, 1001, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1785, 111, 1065, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1786, 111, 1002, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1787, 111, 1003, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1788, 111, 1004, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1789, 111, 1005, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1790, 111, 1006, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1791, 111, 1007, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1792, 111, 1008, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1793, 111, 1009, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1794, 111, 1010, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1795, 111, 1011, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1796, 111, 1012, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1797, 109, 100, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1798, 109, 101, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1799, 109, 1063, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1800, 109, 1064, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1801, 109, 1001, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1802, 109, 1065, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1803, 109, 1002, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1804, 109, 1003, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1805, 109, 1004, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1806, 109, 1005, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1807, 109, 1006, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1808, 109, 1007, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1809, 109, 1008, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1810, 109, 1009, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1811, 109, 1010, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1812, 109, 1011, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1813, 109, 1012, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1814, 111, 100, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1815, 111, 101, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1816, 111, 1063, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1817, 111, 1064, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1818, 111, 1001, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1819, 111, 1065, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1820, 111, 1002, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1821, 111, 1003, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1822, 111, 1004, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1823, 111, 1005, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1824, 111, 1006, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1825, 111, 1007, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1826, 111, 1008, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1827, 111, 1009, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1828, 111, 1010, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1829, 111, 1011, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1830, 111, 1012, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1831, 109, 103, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1832, 109, 1017, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1833, 109, 1018, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1834, 109, 1019, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1835, 109, 1020, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1836, 111, 103, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1837, 111, 1017, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1838, 111, 1018, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1839, 111, 1019, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1840, 111, 1020, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1841, 109, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1842, 109, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1843, 109, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1844, 109, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1845, 109, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1846, 111, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1847, 111, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1848, 111, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1849, 111, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1850, 111, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2003, 2, 1036, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2004, 2, 1037, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2005, 2, 1038, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2006, 2, 1039, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2013, 2, 1050, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2014, 2, 1051, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2015, 2, 1052, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2016, 2, 1053, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2017, 2, 1054, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2018, 2, 1056, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2019, 2, 1057, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2020, 2, 1058, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2022, 2, 1059, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2023, 2, 1060, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2034, 2, 1075, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2039, 2, 1087, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2044, 2, 1095, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2045, 2, 1096, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2046, 2, 1097, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2047, 2, 1098, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2048, 2, 1101, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2049, 2, 1102, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2050, 2, 1103, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2051, 2, 1104, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2052, 2, 1105, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2053, 2, 1106, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2054, 2, 1108, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2055, 2, 1109, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2061, 2, 1127, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2069, 2, 1135, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2070, 2, 1136, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2071, 2, 1137, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2073, 2, 1139, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2074, 2, 115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2075, 2, 1140, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2077, 2, 1141, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2078, 2, 1142, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2079, 2, 1143, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2080, 2, 1150, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2081, 2, 1161, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2082, 2, 1162, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2083, 2, 1163, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2084, 2, 1164, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2085, 2, 1165, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2086, 2, 1166, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2087, 2, 1173, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2088, 2, 1174, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2089, 2, 1175, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2102, 2, 1229, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2116, 2, 1254, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2117, 2, 1255, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2118, 2, 1256, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2119, 2, 1257, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2120, 2, 1258, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2121, 2, 1259, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2122, 2, 1260, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2142, 2, 1014, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2144, 2, 1016, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2152, 2, 1281, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2153, 2, 1282, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2154, 2, 2000, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2155, 2, 2002, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2156, 2, 2003, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2157, 2, 2004, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2158, 2, 2005, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2159, 2, 2006, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2160, 2, 2008, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2161, 2, 2009, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2162, 2, 2010, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2163, 2, 2011, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2164, 2, 2012, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2170, 2, 2019, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2171, 2, 2020, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2172, 2, 2021, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2173, 2, 2022, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2174, 2, 2023, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2175, 2, 2025, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2177, 2, 2027, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2178, 2, 2028, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2179, 2, 2029, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2180, 2, 2014, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2181, 2, 2015, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2182, 2, 2016, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2183, 2, 2017, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2184, 2, 2018, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2188, 101, 1024, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2189, 101, 1, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2190, 101, 1025, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2191, 101, 1026, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2192, 101, 1027, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2193, 101, 1028, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2194, 101, 1029, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2195, 101, 1030, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2196, 101, 1036, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2197, 101, 1037, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2198, 101, 1038, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2199, 101, 1039, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2200, 101, 1040, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2201, 101, 1042, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2202, 101, 1043, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2203, 101, 1045, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2204, 101, 1046, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2205, 101, 1048, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2206, 101, 2083, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2207, 101, 1063, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2208, 101, 1064, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2209, 101, 1065, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2210, 101, 1093, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2211, 101, 1094, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2212, 101, 1095, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2213, 101, 1096, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2214, 101, 1097, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2215, 101, 1098, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2216, 101, 1100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2217, 101, 1101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2218, 101, 1102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2219, 101, 1103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2220, 101, 1104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2221, 101, 1105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2222, 101, 1106, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2223, 101, 2130, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2224, 101, 1107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2225, 101, 2131, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2226, 101, 1108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2227, 101, 2132, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2228, 101, 1109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2229, 101, 2133, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2230, 101, 2134, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2232, 101, 2135, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2234, 101, 2136, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2236, 101, 2137, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2238, 101, 2138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2240, 101, 2139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2242, 101, 2140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2243, 101, 2141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2244, 101, 2142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2245, 101, 2143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2246, 101, 2144, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2247, 101, 2145, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2248, 101, 2146, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2249, 101, 2147, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2250, 101, 100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2251, 101, 2148, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2252, 101, 101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2253, 101, 2149, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2254, 101, 102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2255, 101, 2150, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2256, 101, 103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2257, 101, 2151, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2258, 101, 104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2259, 101, 2152, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2260, 101, 105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2261, 101, 107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2262, 101, 108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2263, 101, 109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2264, 101, 1138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2265, 101, 1139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2266, 101, 1140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2267, 101, 1141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2268, 101, 1142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2269, 101, 1143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2270, 101, 1224, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2271, 101, 1225, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2272, 101, 1226, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2273, 101, 1227, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2274, 101, 1228, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2275, 101, 1229, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2282, 101, 1261, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2283, 101, 1263, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2284, 101, 1264, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2285, 101, 1265, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2286, 101, 1266, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2287, 101, 1267, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2288, 101, 1001, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2289, 101, 1002, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2290, 101, 1003, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2291, 101, 1004, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2292, 101, 1005, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2293, 101, 1006, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2294, 101, 1007, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2295, 101, 1008, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2296, 101, 1009, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2297, 101, 1010, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2298, 101, 1011, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2299, 101, 1012, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2300, 101, 500, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2301, 101, 1013, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2302, 101, 501, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2303, 101, 1014, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2304, 101, 1015, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2305, 101, 1016, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2306, 101, 1017, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2307, 101, 1018, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2308, 101, 1019, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2309, 101, 1020, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2310, 101, 1021, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2311, 101, 1022, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2312, 101, 1023, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2929, 109, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2930, 109, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2931, 109, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2932, 109, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2933, 109, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2934, 109, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2935, 109, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2936, 109, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2937, 109, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2938, 109, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2939, 109, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2940, 109, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2941, 111, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2942, 111, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2943, 111, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2944, 111, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2945, 111, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2946, 111, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2947, 111, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2948, 111, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2949, 111, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2950, 111, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2951, 111, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2952, 111, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2993, 109, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2994, 109, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2995, 109, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2996, 109, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2997, 109, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2998, 109, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2999, 109, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3000, 109, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3001, 109, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3002, 109, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3003, 109, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3004, 109, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3005, 109, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3006, 109, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3007, 109, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3008, 109, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3009, 109, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3017, 109, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3018, 109, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3019, 109, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3020, 109, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3021, 109, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3022, 109, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3023, 109, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3024, 109, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3025, 109, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3026, 109, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3027, 109, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3028, 109, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3029, 109, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3030, 109, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3031, 109, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3032, 109, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3033, 109, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3034, 109, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3035, 109, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3036, 109, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3037, 109, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3038, 109, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3039, 109, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3040, 109, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3041, 109, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3042, 109, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3043, 109, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3044, 109, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3045, 109, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3046, 109, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3047, 109, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3048, 109, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3049, 109, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3050, 109, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3051, 109, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3052, 109, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3053, 109, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3054, 109, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3055, 109, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3056, 109, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3057, 109, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3058, 109, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3059, 109, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3060, 109, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3061, 109, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3062, 109, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3063, 109, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3064, 109, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3065, 109, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3066, 109, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3067, 109, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3068, 109, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3069, 111, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3070, 111, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3071, 111, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3072, 111, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3073, 111, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3074, 111, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3075, 111, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3076, 111, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3077, 111, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3078, 111, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3079, 111, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3080, 111, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3081, 111, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3082, 111, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3083, 111, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3084, 111, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3085, 111, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3093, 111, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3094, 111, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3095, 111, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3096, 111, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3097, 111, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3098, 111, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3099, 111, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3100, 111, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3101, 111, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3102, 111, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3103, 111, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3104, 111, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3105, 111, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3106, 111, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3107, 111, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3108, 111, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3109, 111, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3110, 111, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3111, 111, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3112, 111, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3113, 111, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3114, 111, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3115, 111, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3116, 111, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3117, 111, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3118, 111, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3119, 111, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3120, 111, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3121, 111, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3122, 111, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3123, 111, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3124, 111, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3125, 111, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3126, 111, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3127, 111, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3128, 111, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3129, 111, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3130, 111, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3131, 111, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3132, 111, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3133, 111, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3134, 111, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3135, 111, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3136, 111, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3137, 111, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3138, 111, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3139, 111, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3140, 111, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3141, 111, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3142, 111, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3143, 111, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3144, 111, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3221, 109, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3222, 109, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3223, 109, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3224, 109, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3225, 109, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3226, 111, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3227, 111, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3228, 111, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3229, 111, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3230, 111, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4163, 109, 5, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4164, 109, 1118, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4165, 109, 1119, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4166, 109, 1120, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4167, 109, 2713, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4168, 109, 2714, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4169, 109, 2715, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4170, 109, 2716, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4171, 109, 2717, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4172, 109, 2718, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4173, 109, 2720, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4174, 109, 1185, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4175, 109, 2721, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4176, 109, 1186, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4177, 109, 2722, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4178, 109, 1187, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4179, 109, 2723, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4180, 109, 1188, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4181, 109, 2724, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4182, 109, 1189, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4183, 109, 2725, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4184, 109, 1190, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4185, 109, 2726, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4186, 109, 1191, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4187, 109, 2727, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4188, 109, 1192, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4189, 109, 2728, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4190, 109, 1193, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4191, 109, 2729, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4192, 109, 1194, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4193, 109, 2730, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4194, 109, 1195, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4195, 109, 2731, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4196, 109, 1196, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4197, 109, 2732, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4198, 109, 1197, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4199, 109, 2733, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4200, 109, 1198, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4201, 109, 2734, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4202, 109, 1199, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4203, 109, 2735, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4204, 109, 1200, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4205, 109, 1201, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4206, 109, 1202, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4207, 109, 1207, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4208, 109, 1208, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4209, 109, 1209, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4210, 109, 1210, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4211, 109, 1211, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4212, 109, 1212, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4213, 109, 1213, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4214, 109, 1215, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4215, 109, 1216, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4216, 109, 1217, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4217, 109, 1218, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4218, 109, 1219, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4219, 109, 1220, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4220, 109, 1221, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4221, 109, 1222, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4222, 111, 5, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4223, 111, 1118, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4224, 111, 1119, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4225, 111, 1120, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4226, 111, 2713, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4227, 111, 2714, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4228, 111, 2715, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4229, 111, 2716, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4230, 111, 2717, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4231, 111, 2718, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4232, 111, 2720, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4233, 111, 1185, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4234, 111, 2721, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4235, 111, 1186, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4236, 111, 2722, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4237, 111, 1187, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4238, 111, 2723, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4239, 111, 1188, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4240, 111, 2724, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4241, 111, 1189, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4242, 111, 2725, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4243, 111, 1190, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4244, 111, 2726, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4245, 111, 1191, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4246, 111, 2727, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4247, 111, 1192, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4248, 111, 2728, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4249, 111, 1193, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4250, 111, 2729, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4251, 111, 1194, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4252, 111, 2730, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4253, 111, 1195, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4254, 111, 2731, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4255, 111, 1196, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4256, 111, 2732, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4257, 111, 1197, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4258, 111, 2733, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4259, 111, 1198, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4260, 111, 2734, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4261, 111, 1199, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4262, 111, 2735, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4263, 111, 1200, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4264, 111, 1201, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4265, 111, 1202, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4266, 111, 1207, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4267, 111, 1208, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4268, 111, 1209, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4269, 111, 1210, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4270, 111, 1211, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4271, 111, 1212, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4272, 111, 1213, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4273, 111, 1215, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4274, 111, 1216, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4275, 111, 1217, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4276, 111, 1218, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4277, 111, 1219, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4278, 111, 1220, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4279, 111, 1221, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5779, 2, 2739, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5780, 2, 2740, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5781, 2, 2758, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5782, 2, 2759, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5783, 2, 2362, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5784, 2, 2387, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5785, 2, 2030, '1', '2024-07-07 20:39:38', '1', '2024-07-07 20:39:38', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5786, 101, 2758, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5787, 101, 2759, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5788, 101, 2783, '1', '2024-07-07 20:39:55', '1', '2024-07-07 20:39:55', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5789, 109, 2739, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5790, 109, 2740, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5791, 111, 2739, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5792, 111, 2740, '1', '2024-07-13 22:37:24', '1', '2024-07-13 22:37:24', b'0', 122); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_channel`; +CREATE TABLE `system_sms_channel` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `signature` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信签名', + `code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道编码', + `status` tinyint NOT NULL COMMENT '开启状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `api_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的账号', + `api_secret` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 的秘钥', + `callback_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信发送回调 URL', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +BEGIN; +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2024-08-04 08:53:26', b'0'); +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', b'0'); +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 'mock腾讯云', 'TENCENT', 0, '', '1 2', '2 3', '', '1', '2024-09-30 08:53:45', '1', '2024-09-30 08:55:01', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_code`; +CREATE TABLE `system_sms_code` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号', + `code` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '验证码', + `create_ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '创建 IP', + `scene` tinyint NOT NULL COMMENT '发送场景', + `today_index` tinyint NOT NULL COMMENT '今日发送的第几条', + `used` tinyint NOT NULL COMMENT '是否使用', + `used_time` datetime NULL DEFAULT NULL COMMENT '使用时间', + `used_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '使用 IP', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号' +) ENGINE = InnoDB AUTO_INCREMENT = 639 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '手机验证码'; + +-- ---------------------------- +-- Records of system_sms_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_log`; +CREATE TABLE `system_sms_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `channel_id` bigint NOT NULL COMMENT '短信渠道编号', + `channel_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信渠道编码', + `template_id` bigint NOT NULL COMMENT '模板编号', + `template_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `template_type` tinyint NOT NULL COMMENT '短信类型', + `template_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信内容', + `template_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信参数', + `api_template_id` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的模板编号', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号', + `user_id` bigint NULL DEFAULT NULL COMMENT '用户编号', + `user_type` tinyint NULL DEFAULT NULL COMMENT '用户类型', + `send_status` tinyint NOT NULL DEFAULT 0 COMMENT '发送状态', + `send_time` datetime NULL DEFAULT NULL COMMENT '发送时间', + `api_send_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送结果的编码', + `api_send_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送失败的提示', + `api_request_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送返回的唯一请求 ID', + `api_serial_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送返回的序号', + `receive_status` tinyint NOT NULL DEFAULT 0 COMMENT '接收状态', + `receive_time` datetime NULL DEFAULT NULL COMMENT '接收时间', + `api_receive_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'API 接收结果的编码', + `api_receive_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'API 接收结果的说明', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1147 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志'; + +-- ---------------------------- +-- Records of system_sms_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_template`; +CREATE TABLE `system_sms_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `type` tinyint NOT NULL COMMENT '模板类型', + `status` tinyint NOT NULL COMMENT '开启状态', + `code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板内容', + `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数数组', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `api_template_id` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的模板编号', + `channel_id` bigint NOT NULL COMMENT '短信渠道编号', + `channel_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信渠道编码', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +BEGIN; +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '[\"operation\",\"code\"]', '测试备注', '4383920', 4, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2024-08-18 11:57:18', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '[\"code\"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '[\"name\"]', 'f哈哈哈', '4383920', 4, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2024-08-18 11:57:07', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '[\"name\",\"code\"]', '哈哈哈哈', 'suibian', 7, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2024-09-30 00:56:24', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '[\"code\"]', NULL, '4372216', 4, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2024-08-18 11:57:06', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"startUserNickname\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '[\"processInstanceName\",\"reason\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '[\"processInstanceName\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 4, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2024-08-18 11:57:04', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, 2, 0, 'bpm_task_timeout', '【工作流】任务审批超时', '您收到了一条超时的待办任务:{processInstanceName}-{taskName},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"detailUrl\"]', '', 'X', 4, 'DEBUG_DING_TALK', '1', '2024-08-16 21:59:15', '1', '2024-08-16 21:59:34', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +DROP TABLE IF EXISTS `system_social_client`; +CREATE TABLE `system_social_client` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `social_type` tinyint NOT NULL COMMENT '社交平台的类型', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `client_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端密钥', + `agent_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '代理编号', + `status` tinyint NOT NULL COMMENT '状态', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交客户端表'; + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +BEGIN; +INSERT INTO `system_social_client` (`id`, `name`, `social_type`, `user_type`, `client_id`, `client_secret`, `agent_id`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '钉钉', 20, 2, 'dingvrnreaje3yqvzhxg', 'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, '', '2023-10-18 11:21:18', '1', '2023-12-20 21:28:26', b'1', 1); +INSERT INTO `system_social_client` (`id`, `name`, `social_type`, `user_type`, `client_id`, `client_secret`, `agent_id`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '钉钉(王土豆)', 20, 2, 'dingtsu9hpepjkbmthhw', 'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, '', '2023-10-18 11:21:18', '', '2023-12-20 21:28:26', b'1', 121); +INSERT INTO `system_social_client` (`id`, `name`, `social_type`, `user_type`, `client_id`, `client_secret`, `agent_id`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, '微信公众号', 31, 1, 'wx5b23ba7a5589ecbb', '2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, '', '2023-10-18 16:07:46', '1', '2023-12-20 21:28:23', b'1', 1); +INSERT INTO `system_social_client` (`id`, `name`, `social_type`, `user_type`, `client_id`, `client_secret`, `agent_id`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (43, '微信小程序', 34, 1, 'wx63c280fe3248a3e7', '6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, '', '2023-10-19 13:37:41', '1', '2023-12-20 21:28:25', b'1', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS `system_social_user`; +CREATE TABLE `system_social_user` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键(自增策略)', + `type` tinyint NOT NULL COMMENT '社交平台的类型', + `openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '社交 openid', + `token` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '社交 token', + `raw_token_info` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原始 Token 数据,一般是 JSON 格式', + `nickname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户昵称', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户头像', + `raw_user_info` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原始用户数据,一般是 JSON 格式', + `code` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '最后一次的认证 code', + `state` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '最后一次的认证 state', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交用户表'; + +-- ---------------------------- +-- Records of system_social_user +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS `system_social_user_bind`; +CREATE TABLE `system_social_user_bind` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键(自增策略)', + `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL COMMENT '用户类型', + `social_type` tinyint NOT NULL COMMENT '社交平台的类型', + `social_user_id` bigint NOT NULL COMMENT '社交用户的编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 121 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交绑定表'; + +-- ---------------------------- +-- Records of system_social_user_bind +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS `system_tenant`; +CREATE TABLE `system_tenant` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '租户编号', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '租户名', + `contact_user_id` bigint NULL DEFAULT NULL COMMENT '联系人的用户编号', + `contact_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系人', + `contact_mobile` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系手机', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '租户状态(0正常 1停用)', + `website` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '绑定域名', + `package_id` bigint NOT NULL COMMENT '租户套餐编号', + `expire_time` datetime NOT NULL COMMENT '过期时间', + `account_count` int NOT NULL COMMENT '账号数量', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 162 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +BEGIN; +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', b'0'); +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2025-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2024-07-20 22:21:53', b'0'); +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `website`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-29 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2024-09-22 12:10:50', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS `system_tenant_package`; +CREATE TABLE `system_tenant_package` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '套餐编号', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '套餐名', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '租户状态(0正常 1停用)', + `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '备注', + `menu_ids` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '关联的菜单编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 112 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +BEGIN; +INSERT INTO `system_tenant_package` (`id`, `name`, `status`, `remark`, `menu_ids`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2739,2484,2740,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-07-13 22:37:24', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `system_user_post`; +CREATE TABLE `system_user_post` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户ID', + `post_id` bigint NOT NULL DEFAULT 0 COMMENT '岗位ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 126 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +BEGIN; +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (115, 104, 1, '1', '2022-05-16 19:36:28', '1', '2022-05-16 19:36:28', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (116, 117, 2, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (117, 118, 1, '1', '2022-07-09 17:44:44', '1', '2022-07-09 17:44:44', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (125, 1, 2, '1', '2024-07-13 22:31:39', '1', '2024-07-13 22:31:39', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `system_user_role`; +CREATE TABLE `system_user_role` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 47 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +BEGIN; +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', b'0', 121); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (20, 104, 101, '1', '2022-05-28 15:43:57', '1', '2022-05-28 15:43:57', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (22, 115, 2, '1', '2022-07-21 22:08:30', '1', '2022-07-21 22:08:30', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (35, 112, 1, '1', '2024-03-15 20:00:24', '1', '2024-03-15 20:00:24', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (36, 118, 1, '1', '2024-03-17 09:12:08', '1', '2024-03-17 09:12:08', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (38, 114, 101, '1', '2024-03-24 22:23:03', '1', '2024-03-24 22:23:03', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (46, 117, 1, '1', '2024-10-02 10:16:11', '1', '2024-10-02 10:16:11', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS `system_users`; +CREATE TABLE `system_users` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户账号', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码', + `nickname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户昵称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID', + `post_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '岗位编号数组', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '用户邮箱', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '手机号码', + `sex` tinyint NULL DEFAULT 0 COMMENT '用户性别', + `avatar` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '头像地址', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '帐号状态(0正常 1停用)', + `login_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 140 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +BEGIN; +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1,2]', 'aoteman@126.com', '18818260277', 2, 'http://test.win.iocoder.cn/bf2002b38950c904243be7c825d3f82e29f25a44526583c3fde2ebdff3a87f75.png', 0, '0:0:0:0:0:0:0:1', '2024-10-07 15:05:17', 'admin', '2021-01-05 17:03:47', NULL, '2024-10-07 15:05:17', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 0, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', '1', '2024-09-22 14:55:06', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, 'yuanma', '$2a$04$fUBSmjKCPYAUmnMzOb6qE.eZCGPhHi1JmAKclODbfS/O7fHOl2bH6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-08-11 17:48:12', '', '2021-01-13 23:50:35', NULL, '2024-08-11 17:48:12', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, 'test', '$2a$04$jDFLttgfik0QqJKAbfhMa.2A9xXoZmAIxakdFJUzkX.MgBKT6ddo6', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-09-17 15:05:43', '', '2021-01-21 02:13:53', NULL, '2024-09-17 15:05:43', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', b'0', 118); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', b'0', 119); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', b'0', 120); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-07-20 22:23:17', '1', '2022-02-22 00:56:14', NULL, '2024-07-20 22:23:17', b'0', 121); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', b'0', 121); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', b'0', 122); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (117, 'admin123', '$2a$04$sEtimsHu9YCkYY4/oqElHem2Ijc9ld20eYO6lN.g/21NfLUTDLB9W', '测试号02', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-10-02 10:16:20', '1', '2022-07-09 17:40:26', NULL, '2024-10-02 10:16:20', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-09-06 21:40:43', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (139, 'wwbwwb', '$2a$04$aOHoFbQU6zfBk/1Z9raF/ugTdhjNdx7culC1HhO0zvoczAnahCiMq', '小秃头', NULL, NULL, NULL, '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-09-10 21:03:58', NULL, '2024-09-10 21:03:58', NULL, '2024-09-10 21:03:58', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +DROP TABLE IF EXISTS `win_demo01_contact`; +CREATE TABLE `win_demo01_contact` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', + `sex` tinyint(1) NOT NULL COMMENT '性别', + `birthday` datetime NOT NULL COMMENT '出生年', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '简介', + `avatar` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '示例联系人表'; + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +BEGIN; +INSERT INTO `win_demo01_contact` (`id`, `name`, `sex`, `birthday`, `description`, `avatar`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '土豆', 2, '2023-11-07 00:00:00', '

天蚕土豆!呀

', 'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', '1', '2023-11-15 23:34:30', '1', '2023-11-15 23:47:39', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +DROP TABLE IF EXISTS `win_demo02_category`; +CREATE TABLE `win_demo02_category` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', + `parent_id` bigint NOT NULL COMMENT '父级编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '示例分类表'; + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +BEGIN; +INSERT INTO `win_demo02_category` (`id`, `name`, `parent_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '土豆', 0, '1', '2023-11-15 23:34:30', '1', '2023-11-16 20:24:23', b'0', 1); +INSERT INTO `win_demo02_category` (`id`, `name`, `parent_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '番茄', 0, '1', '2023-11-16 20:24:00', '1', '2023-11-16 20:24:15', b'0', 1); +INSERT INTO `win_demo02_category` (`id`, `name`, `parent_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, '怪怪', 0, '1', '2023-11-16 20:24:32', '1', '2023-11-16 20:24:32', b'0', 1); +INSERT INTO `win_demo02_category` (`id`, `name`, `parent_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, '小番茄', 2, '1', '2023-11-16 20:24:39', '1', '2023-11-16 20:24:39', b'0', 1); +INSERT INTO `win_demo02_category` (`id`, `name`, `parent_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, '大番茄', 2, '1', '2023-11-16 20:24:46', '1', '2023-11-16 20:24:46', b'0', 1); +INSERT INTO `win_demo02_category` (`id`, `name`, `parent_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, '11', 3, '1', '2023-11-24 19:29:34', '1', '2023-11-24 19:29:34', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +DROP TABLE IF EXISTS `win_demo03_course`; +CREATE TABLE `win_demo03_course` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `student_id` bigint NOT NULL COMMENT '学生编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', + `score` tinyint NOT NULL COMMENT '分数', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生课程表'; + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +BEGIN; +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 2, '语文', 66, '1', '2023-11-16 23:21:49', '1', '2024-09-17 10:55:30', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, 2, '数学', 22, '1', '2023-11-16 23:21:49', '1', '2024-09-17 10:55:30', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (7, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (8, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (9, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (10, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2024-09-17 10:55:28', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (11, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2024-09-17 10:55:28', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (12, 2, '电脑', 33, '1', '2023-11-17 00:20:42', '1', '2023-11-16 16:20:45', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (13, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2024-09-17 10:55:26', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (14, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2024-09-17 10:55:49', b'1', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (15, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2024-09-17 18:55:29', b'0', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (16, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2024-09-17 18:55:29', b'0', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (17, 2, '语文', 66, '1', '2023-11-16 23:21:49', '1', '2024-09-17 18:55:31', b'0', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (18, 2, '数学', 22, '1', '2023-11-16 23:21:49', '1', '2024-09-17 18:55:31', b'0', 1); +INSERT INTO `win_demo03_course` (`id`, `student_id`, `name`, `score`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (19, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2024-09-17 18:55:50', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +DROP TABLE IF EXISTS `win_demo03_grade`; +CREATE TABLE `win_demo03_grade` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `student_id` bigint NOT NULL COMMENT '学生编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', + `teacher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班主任', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生班级表'; + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +BEGIN; +INSERT INTO `win_demo03_grade` (`id`, `student_id`, `name`, `teacher`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (7, 2, '三年 2 班', '周杰伦', '1', '2023-11-16 23:21:49', '1', '2024-09-17 18:55:31', b'0', 1); +INSERT INTO `win_demo03_grade` (`id`, `student_id`, `name`, `teacher`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (8, 5, '华为', '遥遥领先', '1', '2023-11-16 23:22:46', '1', '2024-09-17 18:55:29', b'0', 1); +INSERT INTO `win_demo03_grade` (`id`, `student_id`, `name`, `teacher`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (9, 9, '小图', '小娃111', '1', '2023-11-17 13:10:23', '1', '2024-09-17 18:55:50', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +DROP TABLE IF EXISTS `win_demo03_student`; +CREATE TABLE `win_demo03_student` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', + `sex` tinyint NOT NULL COMMENT '性别', + `birthday` datetime NOT NULL COMMENT '出生日期', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '简介', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生表'; + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +BEGIN; +INSERT INTO `win_demo03_student` (`id`, `name`, `sex`, `birthday`, `description`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '小白', 1, '2023-11-16 00:00:00', '

厉害

', '1', '2023-11-16 23:21:49', '1', '2024-09-17 18:55:31', b'0', 1); +INSERT INTO `win_demo03_student` (`id`, `name`, `sex`, `birthday`, `description`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, '大黑', 2, '2023-11-13 00:00:00', '

你在教我做事?

', '1', '2023-11-16 23:22:46', '1', '2024-09-17 18:55:29', b'0', 1); +INSERT INTO `win_demo03_student` (`id`, `name`, `sex`, `birthday`, `description`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (9, '小花', 1, '2023-11-07 00:00:00', '

哈哈哈

', '1', '2023-11-17 00:04:47', '1', '2024-09-17 18:55:50', b'0', 1); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/opengauss/quartz.sql b/sql/opengauss/quartz.sql new file mode 100644 index 0000000..4ec390c --- /dev/null +++ b/sql/opengauss/quartz.sql @@ -0,0 +1,253 @@ +-- ---------------------------- +-- qrtz_blob_triggers +-- ---------------------------- +CREATE TABLE qrtz_blob_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + blob_data bytea NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +CREATE INDEX idx_qrtz_blob_triggers_sched_name ON qrtz_blob_triggers (sched_name, trigger_name, trigger_group); + +-- ---------------------------- +-- qrtz_calendars +-- ---------------------------- +CREATE TABLE qrtz_calendars +( + sched_name varchar(120) NOT NULL, + calendar_name varchar(190) NOT NULL, + calendar bytea NOT NULL, + PRIMARY KEY (sched_name, calendar_name) +); + + +-- ---------------------------- +-- qrtz_cron_triggers +-- ---------------------------- +CREATE TABLE qrtz_cron_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + cron_expression varchar(120) NOT NULL, + time_zone_id varchar(80) NULL DEFAULT NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_fired_triggers +-- ---------------------------- +CREATE TABLE qrtz_fired_triggers +( + sched_name varchar(120) NOT NULL, + entry_id varchar(95) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + instance_name varchar(190) NOT NULL, + fired_time int8 NOT NULL, + sched_time int8 NOT NULL, + priority int4 NOT NULL, + state varchar(16) NOT NULL, + job_name varchar(190) NULL DEFAULT NULL, + job_group varchar(190) NULL DEFAULT NULL, + is_nonconcurrent varchar(1) NULL DEFAULT NULL, + requests_recovery varchar(1) NULL DEFAULT NULL, + PRIMARY KEY (sched_name, entry_id) +); + +CREATE INDEX idx_qrtz_ft_trig_inst_name ON qrtz_fired_triggers (sched_name, instance_name); +CREATE INDEX idx_qrtz_ft_inst_job_req_rcvry ON qrtz_fired_triggers (sched_name, instance_name, requests_recovery); +CREATE INDEX idx_qrtz_ft_j_g ON qrtz_fired_triggers (sched_name, job_name, job_group); +CREATE INDEX idx_qrtz_ft_jg ON qrtz_fired_triggers (sched_name, job_group); +CREATE INDEX idx_qrtz_ft_t_g ON qrtz_fired_triggers (sched_name, trigger_name, trigger_group); +CREATE INDEX idx_qrtz_ft_tg ON qrtz_fired_triggers (sched_name, trigger_group); + +-- ---------------------------- +-- qrtz_job_details +-- ---------------------------- +CREATE TABLE qrtz_job_details +( + sched_name varchar(120) NOT NULL, + job_name varchar(190) NOT NULL, + job_group varchar(190) NOT NULL, + description varchar(250) NULL DEFAULT NULL, + job_class_name varchar(250) NOT NULL, + is_durable varchar(1) NOT NULL, + is_nonconcurrent varchar(1) NOT NULL, + is_update_data varchar(1) NOT NULL, + requests_recovery varchar(1) NOT NULL, + job_data bytea NULL, + PRIMARY KEY (sched_name, job_name, job_group) +); + +CREATE INDEX idx_qrtz_j_req_recovery ON qrtz_job_details (sched_name, requests_recovery); +CREATE INDEX idx_qrtz_j_grp ON qrtz_job_details (sched_name, job_group); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_locks +-- ---------------------------- +CREATE TABLE qrtz_locks +( + sched_name varchar(120) NOT NULL, + lock_name varchar(40) NOT NULL, + PRIMARY KEY (sched_name, lock_name) +); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_paused_trigger_grps +-- ---------------------------- +CREATE TABLE qrtz_paused_trigger_grps +( + sched_name varchar(120) NOT NULL, + trigger_group varchar(190) NOT NULL, + PRIMARY KEY (sched_name, trigger_group) +); + +-- ---------------------------- +-- qrtz_scheduler_state +-- ---------------------------- +CREATE TABLE qrtz_scheduler_state +( + sched_name varchar(120) NOT NULL, + instance_name varchar(190) NOT NULL, + last_checkin_time int8 NOT NULL, + checkin_interval int8 NOT NULL, + PRIMARY KEY (sched_name, instance_name) +); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_simple_triggers +-- ---------------------------- +CREATE TABLE qrtz_simple_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + repeat_count int8 NOT NULL, + repeat_interval int8 NOT NULL, + times_triggered int8 NOT NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +-- ---------------------------- +-- qrtz_simprop_triggers +-- ---------------------------- +CREATE TABLE qrtz_simprop_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + str_prop_1 varchar(512) NULL DEFAULT NULL, + str_prop_2 varchar(512) NULL DEFAULT NULL, + str_prop_3 varchar(512) NULL DEFAULT NULL, + int_prop_1 int4 NULL DEFAULT NULL, + int_prop_2 int4 NULL DEFAULT NULL, + long_prop_1 int8 NULL DEFAULT NULL, + long_prop_2 int8 NULL DEFAULT NULL, + dec_prop_1 numeric(13, 4) NULL DEFAULT NULL, + dec_prop_2 numeric(13, 4) NULL DEFAULT NULL, + bool_prop_1 varchar(1) NULL DEFAULT NULL, + bool_prop_2 varchar(1) NULL DEFAULT NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +-- ---------------------------- +-- qrtz_triggers +-- ---------------------------- +CREATE TABLE qrtz_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + job_name varchar(190) NOT NULL, + job_group varchar(190) NOT NULL, + description varchar(250) NULL DEFAULT NULL, + next_fire_time int8 NULL DEFAULT NULL, + prev_fire_time int8 NULL DEFAULT NULL, + priority int4 NULL DEFAULT NULL, + trigger_state varchar(16) NOT NULL, + trigger_type varchar(8) NOT NULL, + start_time int8 NOT NULL, + end_time int8 NULL DEFAULT NULL, + calendar_name varchar(190) NULL DEFAULT NULL, + misfire_instr int2 NULL DEFAULT NULL, + job_data bytea NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +CREATE INDEX idx_qrtz_t_j ON qrtz_triggers (sched_name, job_name, job_group); +CREATE INDEX idx_qrtz_t_jg ON qrtz_triggers (sched_name, job_group); +CREATE INDEX idx_qrtz_t_c ON qrtz_triggers (sched_name, calendar_name); +CREATE INDEX idx_qrtz_t_g ON qrtz_triggers (sched_name, trigger_group); +CREATE INDEX idx_qrtz_t_state ON qrtz_triggers (sched_name, trigger_state); +CREATE INDEX idx_qrtz_t_n_state ON qrtz_triggers (sched_name, trigger_name, trigger_group, trigger_state); +CREATE INDEX idx_qrtz_t_n_g_state ON qrtz_triggers (sched_name, trigger_group, trigger_state); +CREATE INDEX idx_qrtz_t_next_fire_time ON qrtz_triggers (sched_name, next_fire_time); +CREATE INDEX idx_qrtz_t_nft_st ON qrtz_triggers (sched_name, trigger_state, next_fire_time); +CREATE INDEX idx_qrtz_t_nft_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time); +CREATE INDEX idx_qrtz_t_nft_st_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_state); +CREATE INDEX idx_qrtz_t_nft_st_misfire_grp ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_group, + trigger_state); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + + +-- ---------------------------- +-- FK: qrtz_blob_triggers +-- ---------------------------- +ALTER TABLE qrtz_blob_triggers + ADD CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, + trigger_name, + trigger_group); + +-- ---------------------------- +-- FK: qrtz_cron_triggers +-- ---------------------------- +ALTER TABLE qrtz_cron_triggers + ADD CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group); + +-- ---------------------------- +-- FK: qrtz_simple_triggers +-- ---------------------------- +ALTER TABLE qrtz_simple_triggers + ADD CONSTRAINT qrtz_simple_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, + trigger_name, + trigger_group); + +-- ---------------------------- +-- FK: qrtz_simprop_triggers +-- ---------------------------- +ALTER TABLE qrtz_simprop_triggers + ADD CONSTRAINT qrtz_simprop_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group); + +-- ---------------------------- +-- FK: qrtz_triggers +-- ---------------------------- +ALTER TABLE qrtz_triggers + ADD CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details (sched_name, job_name, job_group); diff --git a/sql/opengauss/ruoyi-vue-pro.sql b/sql/opengauss/ruoyi-vue-pro.sql new file mode 100644 index 0000000..dbffcb3 --- /dev/null +++ b/sql/opengauss/ruoyi-vue-pro.sql @@ -0,0 +1,4723 @@ +/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : OpenGauss + + Date: 2024-06-05 07:41:22 +*/ + + +-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +DROP TABLE IF EXISTS dual; +CREATE TABLE dual +( + id int2 +); + +COMMENT ON TABLE dual IS '数据库连接的表'; + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +-- @formatter:off +INSERT INTO dual VALUES (1); +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_access_log; +CREATE TABLE infra_api_access_log +( + id int8 NOT NULL, + trace_id varchar(64) NULL DEFAULT '', + user_id int8 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + application_name varchar(50) NOT NULL, + request_method varchar(16) NULL DEFAULT '', + request_url varchar(255) NULL DEFAULT '', + request_params text NULL, + response_body text NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + operate_module varchar(50) NULL DEFAULT NULL, + operate_name varchar(50) NULL DEFAULT NULL, + operate_type int2 NULL DEFAULT 0, + begin_time timestamp NOT NULL, + end_time timestamp NOT NULL, + duration int4 NOT NULL, + result_code int4 NOT NULL DEFAULT 0, + result_msg varchar(512) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_api_access_log + ADD CONSTRAINT pk_infra_api_access_log PRIMARY KEY (id); + +CREATE INDEX idx_infra_api_access_log_01 ON infra_api_access_log (create_time); + +COMMENT ON COLUMN infra_api_access_log.id IS '日志主键'; +COMMENT ON COLUMN infra_api_access_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN infra_api_access_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_access_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_access_log.application_name IS '应用名'; +COMMENT ON COLUMN infra_api_access_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_access_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_access_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_access_log.response_body IS '响应结果'; +COMMENT ON COLUMN infra_api_access_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_access_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_access_log.operate_module IS '操作模块'; +COMMENT ON COLUMN infra_api_access_log.operate_name IS '操作名'; +COMMENT ON COLUMN infra_api_access_log.operate_type IS '操作分类'; +COMMENT ON COLUMN infra_api_access_log.begin_time IS '开始请求时间'; +COMMENT ON COLUMN infra_api_access_log.end_time IS '结束请求时间'; +COMMENT ON COLUMN infra_api_access_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_api_access_log.result_code IS '结果码'; +COMMENT ON COLUMN infra_api_access_log.result_msg IS '结果提示'; +COMMENT ON COLUMN infra_api_access_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_access_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_access_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_access_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_access_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_access_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_access_log IS 'API 访问日志表'; + +DROP SEQUENCE IF EXISTS infra_api_access_log_seq; +CREATE SEQUENCE infra_api_access_log_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_error_log; +CREATE TABLE infra_api_error_log +( + id int4 NOT NULL, + trace_id varchar(64) NOT NULL, + user_id int4 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + application_name varchar(50) NOT NULL, + request_method varchar(16) NOT NULL, + request_url varchar(255) NOT NULL, + request_params varchar(8000) NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + exception_time timestamp NOT NULL, + exception_name varchar(128) NULL DEFAULT '', + exception_message text NOT NULL, + exception_root_cause_message text NOT NULL, + exception_stack_trace text NOT NULL, + exception_class_name varchar(512) NOT NULL, + exception_file_name varchar(512) NOT NULL, + exception_method_name varchar(512) NOT NULL, + exception_line_number int4 NOT NULL, + process_status int2 NOT NULL, + process_time timestamp NULL DEFAULT NULL, + process_user_id int4 NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_api_error_log + ADD CONSTRAINT pk_infra_api_error_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_api_error_log.id IS '编号'; +COMMENT ON COLUMN infra_api_error_log.trace_id IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; +COMMENT ON COLUMN infra_api_error_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_error_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_error_log.application_name IS '应用名 + * + * 目前读取 spring.application.name'; +COMMENT ON COLUMN infra_api_error_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_error_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_error_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_error_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_error_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_error_log.exception_time IS '异常发生时间'; +COMMENT ON COLUMN infra_api_error_log.exception_name IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; +COMMENT ON COLUMN infra_api_error_log.exception_message IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_root_cause_message IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_stack_trace IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; +COMMENT ON COLUMN infra_api_error_log.exception_class_name IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_file_name IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_method_name IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_line_number IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; +COMMENT ON COLUMN infra_api_error_log.process_status IS '处理状态'; +COMMENT ON COLUMN infra_api_error_log.process_time IS '处理时间'; +COMMENT ON COLUMN infra_api_error_log.process_user_id IS '处理用户编号'; +COMMENT ON COLUMN infra_api_error_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_error_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_error_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_error_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_error_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_error_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_error_log IS '系统异常日志'; + +DROP SEQUENCE IF EXISTS infra_api_error_log_seq; +CREATE SEQUENCE infra_api_error_log_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_column; +CREATE TABLE infra_codegen_column +( + id int8 NOT NULL, + table_id int8 NOT NULL, + column_name varchar(200) NOT NULL, + data_type varchar(100) NOT NULL, + column_comment varchar(500) NOT NULL, + nullable bool NOT NULL, + primary_key bool NOT NULL, + ordinal_position int4 NOT NULL, + java_type varchar(32) NOT NULL, + java_field varchar(64) NOT NULL, + dict_type varchar(200) NULL DEFAULT '', + example varchar(64) NULL DEFAULT NULL, + create_operation bool NOT NULL, + update_operation bool NOT NULL, + list_operation bool NOT NULL, + list_operation_condition varchar(32) NOT NULL DEFAULT '=', + list_operation_result bool NOT NULL, + html_type varchar(32) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_codegen_column + ADD CONSTRAINT pk_infra_codegen_column PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_column.id IS '编号'; +COMMENT ON COLUMN infra_codegen_column.table_id IS '表编号'; +COMMENT ON COLUMN infra_codegen_column.column_name IS '字段名'; +COMMENT ON COLUMN infra_codegen_column.data_type IS '字段类型'; +COMMENT ON COLUMN infra_codegen_column.column_comment IS '字段描述'; +COMMENT ON COLUMN infra_codegen_column.nullable IS '是否允许为空'; +COMMENT ON COLUMN infra_codegen_column.primary_key IS '是否主键'; +COMMENT ON COLUMN infra_codegen_column.ordinal_position IS '排序'; +COMMENT ON COLUMN infra_codegen_column.java_type IS 'Java 属性类型'; +COMMENT ON COLUMN infra_codegen_column.java_field IS 'Java 属性名'; +COMMENT ON COLUMN infra_codegen_column.dict_type IS '字典类型'; +COMMENT ON COLUMN infra_codegen_column.example IS '数据示例'; +COMMENT ON COLUMN infra_codegen_column.create_operation IS '是否为 Create 创建操作的字段'; +COMMENT ON COLUMN infra_codegen_column.update_operation IS '是否为 Update 更新操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation IS '是否为 List 查询操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation_condition IS 'List 查询操作的条件类型'; +COMMENT ON COLUMN infra_codegen_column.list_operation_result IS '是否为 List 查询操作的返回字段'; +COMMENT ON COLUMN infra_codegen_column.html_type IS '显示类型'; +COMMENT ON COLUMN infra_codegen_column.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_column.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_column.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_column.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_column.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_column IS '代码生成表字段定义'; + +DROP SEQUENCE IF EXISTS infra_codegen_column_seq; +CREATE SEQUENCE infra_codegen_column_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_table; +CREATE TABLE infra_codegen_table +( + id int8 NOT NULL, + data_source_config_id int8 NOT NULL, + scene int2 NOT NULL DEFAULT 1, + table_name varchar(200) NULL DEFAULT '', + table_comment varchar(500) NULL DEFAULT '', + remark varchar(500) NULL DEFAULT NULL, + module_name varchar(30) NOT NULL, + business_name varchar(30) NOT NULL, + class_name varchar(100) NULL DEFAULT '', + class_comment varchar(50) NOT NULL, + author varchar(50) NOT NULL, + template_type int2 NOT NULL DEFAULT 1, + front_type int2 NOT NULL, + parent_menu_id int8 NULL DEFAULT NULL, + master_table_id int8 NULL DEFAULT NULL, + sub_join_column_id int8 NULL DEFAULT NULL, + sub_join_many bool NULL DEFAULT NULL, + tree_parent_column_id int8 NULL DEFAULT NULL, + tree_name_column_id int8 NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_codegen_table + ADD CONSTRAINT pk_infra_codegen_table PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_table.id IS '编号'; +COMMENT ON COLUMN infra_codegen_table.data_source_config_id IS '数据源配置的编号'; +COMMENT ON COLUMN infra_codegen_table.scene IS '生成场景'; +COMMENT ON COLUMN infra_codegen_table.table_name IS '表名称'; +COMMENT ON COLUMN infra_codegen_table.table_comment IS '表描述'; +COMMENT ON COLUMN infra_codegen_table.remark IS '备注'; +COMMENT ON COLUMN infra_codegen_table.module_name IS '模块名'; +COMMENT ON COLUMN infra_codegen_table.business_name IS '业务名'; +COMMENT ON COLUMN infra_codegen_table.class_name IS '类名称'; +COMMENT ON COLUMN infra_codegen_table.class_comment IS '类描述'; +COMMENT ON COLUMN infra_codegen_table.author IS '作者'; +COMMENT ON COLUMN infra_codegen_table.template_type IS '模板类型'; +COMMENT ON COLUMN infra_codegen_table.front_type IS '前端类型'; +COMMENT ON COLUMN infra_codegen_table.parent_menu_id IS '父菜单编号'; +COMMENT ON COLUMN infra_codegen_table.master_table_id IS '主表的编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_column_id IS '子表关联主表的字段编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_many IS '主表与子表是否一对多'; +COMMENT ON COLUMN infra_codegen_table.tree_parent_column_id IS '树表的父字段编号'; +COMMENT ON COLUMN infra_codegen_table.tree_name_column_id IS '树表的名字字段编号'; +COMMENT ON COLUMN infra_codegen_table.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_table.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_table.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_table.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_table.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_table IS '代码生成表定义'; + +DROP SEQUENCE IF EXISTS infra_codegen_table_seq; +CREATE SEQUENCE infra_codegen_table_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_config; +CREATE TABLE infra_config +( + id int4 NOT NULL, + category varchar(50) NOT NULL, + type int2 NOT NULL, + name varchar(100) NULL DEFAULT '', + config_key varchar(100) NULL DEFAULT '', + value varchar(500) NULL DEFAULT '', + visible bool NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_config + ADD CONSTRAINT pk_infra_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_config.id IS '参数主键'; +COMMENT ON COLUMN infra_config.category IS '参数分组'; +COMMENT ON COLUMN infra_config.type IS '参数类型'; +COMMENT ON COLUMN infra_config.name IS '参数名称'; +COMMENT ON COLUMN infra_config.config_key IS '参数键名'; +COMMENT ON COLUMN infra_config.value IS '参数键值'; +COMMENT ON COLUMN infra_config.visible IS '是否可见'; +COMMENT ON COLUMN infra_config.remark IS '备注'; +COMMENT ON COLUMN infra_config.creator IS '创建者'; +COMMENT ON COLUMN infra_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_config.updater IS '更新者'; +COMMENT ON COLUMN infra_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_config IS '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', '0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-04-03 17:22:28', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', '1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 'test2', 2, 'test3', 'test4', 'test5', '1', 'test6', '1', '2023-12-03 09:55:16', '1', '2023-12-03 09:55:27', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_config_seq; +CREATE SEQUENCE infra_config_seq + START 13; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_data_source_config; +CREATE TABLE infra_data_source_config +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + url varchar(1024) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_data_source_config + ADD CONSTRAINT pk_infra_data_source_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_data_source_config.id IS '主键编号'; +COMMENT ON COLUMN infra_data_source_config.name IS '参数名称'; +COMMENT ON COLUMN infra_data_source_config.url IS '数据源连接'; +COMMENT ON COLUMN infra_data_source_config.username IS '用户名'; +COMMENT ON COLUMN infra_data_source_config.password IS '密码'; +COMMENT ON COLUMN infra_data_source_config.creator IS '创建者'; +COMMENT ON COLUMN infra_data_source_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_data_source_config.updater IS '更新者'; +COMMENT ON COLUMN infra_data_source_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_data_source_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_data_source_config IS '数据源配置表'; + +DROP SEQUENCE IF EXISTS infra_data_source_config_seq; +CREATE SEQUENCE infra_data_source_config_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS infra_file; +CREATE TABLE infra_file +( + id int8 NOT NULL, + config_id int8 NULL DEFAULT NULL, + name varchar(256) NULL DEFAULT NULL, + path varchar(512) NOT NULL, + url varchar(1024) NOT NULL, + type varchar(128) NULL DEFAULT NULL, + size int4 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file + ADD CONSTRAINT pk_infra_file PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file.id IS '文件编号'; +COMMENT ON COLUMN infra_file.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file.name IS '文件名'; +COMMENT ON COLUMN infra_file.path IS '文件路径'; +COMMENT ON COLUMN infra_file.url IS '文件 URL'; +COMMENT ON COLUMN infra_file.type IS '文件类型'; +COMMENT ON COLUMN infra_file.size IS '文件大小'; +COMMENT ON COLUMN infra_file.creator IS '创建者'; +COMMENT ON COLUMN infra_file.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file.updater IS '更新者'; +COMMENT ON COLUMN infra_file.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file.deleted IS '是否删除'; +COMMENT ON TABLE infra_file IS '文件表'; + +DROP SEQUENCE IF EXISTS infra_file_seq; +CREATE SEQUENCE infra_file_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_config; +CREATE TABLE infra_file_config +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + storage int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + master bool NOT NULL, + config varchar(4096) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file_config + ADD CONSTRAINT pk_infra_file_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_config.id IS '编号'; +COMMENT ON COLUMN infra_file_config.name IS '配置名'; +COMMENT ON COLUMN infra_file_config.storage IS '存储器'; +COMMENT ON COLUMN infra_file_config.remark IS '备注'; +COMMENT ON COLUMN infra_file_config.master IS '是否为主配置'; +COMMENT ON COLUMN infra_file_config.config IS '存储配置'; +COMMENT ON COLUMN infra_file_config.creator IS '创建者'; +COMMENT ON COLUMN infra_file_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_config.updater IS '更新者'; +COMMENT ON COLUMN infra_file_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_config IS '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (4, '数据库', 1, '我是数据库', '0', '{"@class":"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', '0'); +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (22, '七牛存储器', 20, '', '1', '{"@class":"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3.cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS","accessSecret":"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY"}', '1', '2024-01-13 22:11:12', '1', '2024-04-03 19:38:34', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_file_config_seq; +CREATE SEQUENCE infra_file_config_seq + START 23; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_content; +CREATE TABLE infra_file_content +( + id int8 NOT NULL, + config_id int8 NOT NULL, + path varchar(512) NOT NULL, + content bytea NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file_content + ADD CONSTRAINT pk_infra_file_content PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_content.id IS '编号'; +COMMENT ON COLUMN infra_file_content.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file_content.path IS '文件路径'; +COMMENT ON COLUMN infra_file_content.content IS '文件内容'; +COMMENT ON COLUMN infra_file_content.creator IS '创建者'; +COMMENT ON COLUMN infra_file_content.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_content.updater IS '更新者'; +COMMENT ON COLUMN infra_file_content.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_content.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_content IS '文件表'; + +DROP SEQUENCE IF EXISTS infra_file_content_seq; +CREATE SEQUENCE infra_file_content_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS infra_job; +CREATE TABLE infra_job +( + id int8 NOT NULL, + name varchar(32) NOT NULL, + status int2 NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) NULL DEFAULT NULL, + cron_expression varchar(32) NOT NULL, + retry_count int4 NOT NULL DEFAULT 0, + retry_interval int4 NOT NULL DEFAULT 0, + monitor_timeout int4 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_job + ADD CONSTRAINT pk_infra_job PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job.id IS '任务编号'; +COMMENT ON COLUMN infra_job.name IS '任务名称'; +COMMENT ON COLUMN infra_job.status IS '任务状态'; +COMMENT ON COLUMN infra_job.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job.cron_expression IS 'CRON 表达式'; +COMMENT ON COLUMN infra_job.retry_count IS '重试次数'; +COMMENT ON COLUMN infra_job.retry_interval IS '重试间隔'; +COMMENT ON COLUMN infra_job.monitor_timeout IS '监控超时时间'; +COMMENT ON COLUMN infra_job.creator IS '创建者'; +COMMENT ON COLUMN infra_job.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job.updater IS '更新者'; +COMMENT ON COLUMN infra_job.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job.deleted IS '是否删除'; +COMMENT ON TABLE infra_job IS '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2023-07-09 20:51:41', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 14:36:26', '1', '2023-07-22 15:39:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 15:36:23', '1', '2023-07-22 15:39:54', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-23 21:03:44', '1', '2023-07-23 21:09:00', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (21, '交易订单的自动过期 Job', 2, 'tradeOrderAutoCancelJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-25 23:43:26', '1', '2023-09-26 19:23:30', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (22, '交易订单的自动收货 Job', 2, 'tradeOrderAutoReceiveJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 19:23:53', '1', '2023-09-26 23:38:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (23, '交易订单的自动评论 Job', 2, 'tradeOrderAutoCommentJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 23:38:29', '1', '2023-09-27 11:03:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (24, '佣金解冻 Job', 2, 'brokerageRecordUnfreezeJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-28 22:01:46', '1', '2023-09-28 22:01:56', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (25, '访问日志清理 Job', 2, 'accessLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 10:59:41', '1', '2023-10-03 11:01:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (26, '错误日志清理 Job', 2, 'errorLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:00:43', '1', '2023-10-03 11:01:12', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (27, '任务日志清理 Job', 2, 'jobLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:01:33', '1', '2023-10-03 11:01:42', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_job_seq; +CREATE SEQUENCE infra_job_seq + START 28; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_job_log; +CREATE TABLE infra_job_log +( + id int8 NOT NULL, + job_id int8 NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) NULL DEFAULT NULL, + execute_index int2 NOT NULL DEFAULT 1, + begin_time timestamp NOT NULL, + end_time timestamp NULL DEFAULT NULL, + duration int4 NULL DEFAULT NULL, + status int2 NOT NULL, + result varchar(4000) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_job_log + ADD CONSTRAINT pk_infra_job_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job_log.id IS '日志编号'; +COMMENT ON COLUMN infra_job_log.job_id IS '任务编号'; +COMMENT ON COLUMN infra_job_log.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job_log.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job_log.execute_index IS '第几次执行'; +COMMENT ON COLUMN infra_job_log.begin_time IS '开始执行时间'; +COMMENT ON COLUMN infra_job_log.end_time IS '结束执行时间'; +COMMENT ON COLUMN infra_job_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_job_log.status IS '任务状态'; +COMMENT ON COLUMN infra_job_log.result IS '结果数据'; +COMMENT ON COLUMN infra_job_log.creator IS '创建者'; +COMMENT ON COLUMN infra_job_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job_log.updater IS '更新者'; +COMMENT ON COLUMN infra_job_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job_log.deleted IS '是否删除'; +COMMENT ON TABLE infra_job_log IS '定时任务日志表'; + +DROP SEQUENCE IF EXISTS infra_job_log_seq; +CREATE SEQUENCE infra_job_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS system_dept; +CREATE TABLE system_dept +( + id int8 NOT NULL, + name varchar(30) NULL DEFAULT '', + parent_id int8 NOT NULL DEFAULT 0, + sort int4 NOT NULL DEFAULT 0, + leader_user_id int8 NULL DEFAULT NULL, + phone varchar(11) NULL DEFAULT NULL, + email varchar(50) NULL DEFAULT NULL, + status int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_dept + ADD CONSTRAINT pk_system_dept PRIMARY KEY (id); + +COMMENT ON COLUMN system_dept.id IS '部门id'; +COMMENT ON COLUMN system_dept.name IS '部门名称'; +COMMENT ON COLUMN system_dept.parent_id IS '父部门id'; +COMMENT ON COLUMN system_dept.sort IS '显示顺序'; +COMMENT ON COLUMN system_dept.leader_user_id IS '负责人'; +COMMENT ON COLUMN system_dept.phone IS '联系电话'; +COMMENT ON COLUMN system_dept.email IS '邮箱'; +COMMENT ON COLUMN system_dept.status IS '部门状态(0正常 1停用)'; +COMMENT ON COLUMN system_dept.creator IS '创建者'; +COMMENT ON COLUMN system_dept.create_time IS '创建时间'; +COMMENT ON COLUMN system_dept.updater IS '更新者'; +COMMENT ON COLUMN system_dept.update_time IS '更新时间'; +COMMENT ON COLUMN system_dept.deleted IS '是否删除'; +COMMENT ON COLUMN system_dept.tenant_id IS '租户编号'; +COMMENT ON TABLE system_dept IS '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-11-14 23:30:36', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:53:35', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2024-03-24 20:56:04', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:15', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, '运维部门', 101, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:28:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-02-16 08:35:45', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', '0', 121); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', '0', 122); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, '产品部门', 101, 100, 1, NULL, NULL, 1, '1', '2023-12-02 09:45:13', '1', '2023-12-02 09:45:31', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, '支持部门', 102, 3, 104, NULL, NULL, 1, '1', '2023-12-02 09:47:38', '1', '2023-12-02 09:47:38', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dept_seq; +CREATE SEQUENCE system_dept_seq + START 114; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_data; +CREATE TABLE system_dict_data +( + id int8 NOT NULL, + sort int4 NOT NULL DEFAULT 0, + label varchar(100) NULL DEFAULT '', + value varchar(100) NULL DEFAULT '', + dict_type varchar(100) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + color_type varchar(100) NULL DEFAULT '', + css_class varchar(100) NULL DEFAULT '', + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_dict_data + ADD CONSTRAINT pk_system_dict_data PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_data.id IS '字典编码'; +COMMENT ON COLUMN system_dict_data.sort IS '字典排序'; +COMMENT ON COLUMN system_dict_data.label IS '字典标签'; +COMMENT ON COLUMN system_dict_data.value IS '字典键值'; +COMMENT ON COLUMN system_dict_data.dict_type IS '字典类型'; +COMMENT ON COLUMN system_dict_data.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_data.color_type IS '颜色类型'; +COMMENT ON COLUMN system_dict_data.css_class IS 'css 样式'; +COMMENT ON COLUMN system_dict_data.remark IS '备注'; +COMMENT ON COLUMN system_dict_data.creator IS '创建者'; +COMMENT ON COLUMN system_dict_data.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_data.updater IS '更新者'; +COMMENT ON COLUMN system_dict_data.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_data.deleted IS '是否删除'; +COMMENT ON TABLE system_dict_data IS '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', '2022-03-29 00:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 2, '女', '2', 'system_user_sex', 0, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 23:30:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:05:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:06:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (16, 0, '其它', '0', 'infra_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (17, 1, '查询', '1', 'infra_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (18, 2, '新增', '2', 'infra_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (19, 3, '修改', '3', 'infra_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (20, 4, '删除', '4', 'infra_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (22, 5, '导出', '5', 'infra_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (23, 6, '导入', '6', 'infra_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', '2022-02-16 13:23:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:09:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', '2022-03-10 16:33:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', '2022-03-10 16:33:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', '2022-02-16 19:33:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', '2022-02-16 19:07:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', '2022-02-16 19:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', '2022-02-16 19:07:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', '2021-02-26 00:16:27', '1', '2022-02-16 10:22:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', '2021-02-26 00:16:34', '1', '2022-02-16 10:22:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2022-02-16 10:09:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-16 10:26:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-16 10:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-16 10:26:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-16 10:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-16 10:28:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-16 10:28:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-16 10:28:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-16 13:11:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-16 13:11:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-16 13:11:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-16 13:11:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', '2022-02-16 10:00:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', '2022-02-16 10:00:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', '2022-02-16 10:00:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', '2021-12-03 10:40:24', '1', '2023-07-19 20:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2023-07-19 20:08:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2023-07-19 20:08:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2023-07-19 20:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2023-07-19 20:09:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', '2021-12-03 10:42:55', '1', '2023-07-19 20:09:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2023-07-19 20:09:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', '1', '2023-07-19 10:08:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', '1', '2023-07-19 10:08:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', '2023-07-19 10:08:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', '2023-07-19 18:04:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', '2023-07-19 18:05:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', '2023-07-19 18:04:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (600, 5, '首页', '1', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (601, 4, '秒杀活动页', '2', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (602, 3, '砍价活动页', '3', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (603, 2, '限时折扣页', '4', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (604, 1, '满减送页', '5', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', '2021-12-10 16:44:59', '1', '2023-07-19 10:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', '1', '2023-07-19 10:15:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:46:26', '1', '2023-07-19 10:15:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1127, 1, '审批中', '1', 'bpm_process_instance_status', 0, 'default', '', '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2024-03-16 16:11:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1128, 2, '审批通过', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2024-03-16 16:11:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1129, 1, '审批中', '1', 'bpm_task_status', 0, 'primary', '', '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2024-03-08 22:41:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1130, 2, '审批通过', '2', 'bpm_task_status', 0, 'success', '', '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1131, 3, '审批不通过', '3', 'bpm_task_status', 0, 'danger', '', '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1132, 4, '已取消', '4', 'bpm_task_status', 0, 'info', '', '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2024-03-08 22:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1135, 10, '角色', '10', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '1', '2024-03-06 02:53:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '1', '2024-03-06 02:53:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2024-03-06 02:53:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1138, 30, '用户', '30', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '1', '2024-03-06 02:53:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1139, 40, '用户组', '40', 'bpm_task_candidate_strategy', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1140, 60, '流程表达式', '60', 'bpm_task_candidate_strategy', 0, 'danger', '', '任务分配规则的类型 - 流程表达式', '103', '2022-01-12 23:34:43', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1141, 22, '岗位', '22', 'bpm_task_candidate_strategy', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '1', '2024-03-06 02:53:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', '2022-03-15 00:25:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', '2022-03-15 00:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', '2022-03-15 00:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', '2022-03-15 00:26:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', '2022-03-15 00:26:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', '2022-05-09 23:58:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', '2022-10-24 21:19:47', '1', '2022-10-24 21:20:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', '2022-10-24 21:20:54', '1', '2022-10-24 21:21:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', '2022-10-24 21:21:11', '1', '2022-10-24 21:21:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', '2022-11-01 12:46:41', '1', '2022-11-01 12:50:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', '2022-11-01 12:46:51', '1', '2022-11-01 12:50:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', '2022-11-02 00:07:34', '1', '2022-11-04 00:07:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', '2022-11-02 00:07:54', '1', '2022-11-04 00:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1169, 1, '通用劵', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', '2022-11-02 00:28:22', '1', '2023-09-28 00:27:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1170, 2, '商品劵', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', '2022-11-02 00:28:34', '1', '2023-09-28 00:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1171, 1, '未使用', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', '2022-11-04 00:15:08', '1', '2023-10-03 12:54:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', '2022-11-04 00:15:21', '1', '2022-11-04 19:16:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', '2022-11-04 00:15:43', '1', '2022-11-04 19:16:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', '2022-11-04 19:13:00', '1', '2022-11-04 19:13:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', '2022-11-04 19:13:13', '1', '2022-11-04 19:14:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', '2022-11-04 22:54:49', '1', '2022-11-04 22:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', '2022-11-04 22:55:06', '1', '2022-11-04 22:55:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', '2022-11-04 22:55:41', '1', '2022-11-04 22:55:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', '2022-11-04 22:56:10', '1', '2022-11-04 22:56:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', '2022-11-04 22:59:45', '1', '2022-11-04 22:59:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', '2022-11-04 23:00:02', '1', '2022-11-04 23:00:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', '2022-11-19 20:53:33', '1', '2022-11-19 20:54:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', '2022-11-19 20:54:36', '1', '2022-11-19 20:58:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', '2022-11-19 20:56:56', '1', '2022-11-19 20:59:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', '2022-11-19 20:59:54', '1', '2022-11-19 21:00:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', '2022-11-19 21:00:33', '1', '2022-11-19 21:00:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', '2022-11-19 21:01:29', '1', '2022-11-19 21:01:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', '2022-11-19 21:02:17', '1', '2022-11-19 21:02:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', '2022-11-19 21:02:37', '1', '2022-11-19 21:03:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', '2022-11-19 21:05:05', '1', '2022-11-19 21:38:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', '2022-11-19 21:05:32', '1', '2022-11-19 21:38:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', '2022-11-19 21:39:19', '1', '2022-11-19 21:39:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', '2022-11-19 21:39:38', '1', '2022-11-19 21:39:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', '2022-12-10 10:51:11', '1', '2022-12-10 10:51:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', '2022-12-10 10:51:30', '1', '2022-12-10 10:51:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', '2022-12-10 10:54:16', '1', '2022-12-10 10:52:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', '2022-12-10 10:54:42', '1', '2022-12-10 10:52:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', '2022-12-10 10:55:02', '1', '2022-12-10 10:59:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', '2022-12-10 16:34:14', '1', '2022-12-10 16:34:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', '2022-12-10 16:34:26', '1', '2022-12-10 16:34:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1201, 2, '拼团订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', '2022-12-10 16:34:36', '1', '2022-12-10 16:34:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1202, 3, '砍价订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', '2022-12-10 16:34:48', '1', '2022-12-10 16:34:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', '2022-12-10 16:49:29', '1', '2022-12-10 16:49:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', '2022-12-10 16:49:53', '1', '2022-12-10 16:51:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', '2022-12-10 16:50:13', '1', '2022-12-10 16:51:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1209, 1, '售后中', '1', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2022-12-10 20:59:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1210, 2, '已退款', '2', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2022-12-10 20:59:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:20:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:21:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:23:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', '2023-01-26 09:53:49', '1', '2023-01-26 16:36:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', '2023-01-26 09:54:28', '1', '2023-01-26 16:36:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', '2023-01-26 09:54:50', '1', '2023-01-26 16:36:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', '2023-01-26 09:55:06', '1', '2023-01-26 16:36:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', '2023-01-28 10:35:59', '1', '2023-01-28 10:35:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', '2023-01-28 10:36:20', '1', '2023-01-28 10:36:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', '2023-02-18 23:32:24', '1', '2023-07-19 20:09:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:03:55', '1', '2023-04-13 00:03:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1335, 11, '订单积分抵扣', '11', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-10-11 07:41:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-08-20 11:59:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', '2023-07-19 18:05:37', '1', '2023-07-19 18:05:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', '2023-07-19 18:10:47', '1', '2023-07-19 18:11:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', '2023-07-19 18:11:05', '1', '2023-07-19 18:11:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', '2023-07-19 20:07:47', '1', '2023-07-19 20:09:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', '2023-07-19 20:08:06', '1', '2023-07-19 20:09:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', '2023-07-20 12:23:17', '1', '2023-07-20 12:23:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', '2023-07-20 12:23:26', '1', '2023-07-20 12:23:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', '2023-07-29 11:10:51', '1', '2023-07-29 03:14:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1349, 12, '订单积分抵扣(整单取消)', '12', 'member_point_biz_type', 0, '', '', '', '1', '2023-08-20 12:00:03', '1', '2023-10-11 07:42:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1352, 11, '下单奖励', '11', 'member_experience_biz_type', 0, 'success', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1353, 12, '下单奖励(整单取消)', '12', 'member_experience_biz_type', 0, 'warning', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:04:55', '1', '2023-08-23 00:04:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:05:05', '1', '2023-08-23 00:05:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1358, 3, '品类劵', '3', 'promotion_product_scope', 0, 'default', '', '', '1', '2023-09-01 23:43:07', '1', '2023-09-28 00:27:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1359, 1, '人人分销', '1', 'brokerage_enabled_condition', 0, '', '', '所有用户都可以分销', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1360, 2, '指定分销', '2', 'brokerage_enabled_condition', 0, '', '', '仅可后台手动设置推广员', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1361, 1, '首次绑定', '1', 'brokerage_bind_mode', 0, '', '', '只要用户没有推广人,随时都可以绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1362, 2, '注册绑定', '2', 'brokerage_bind_mode', 0, '', '', '仅新用户注册时才能绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1363, 3, '覆盖绑定', '3', 'brokerage_bind_mode', 0, '', '', '如果用户已经有推广人,推广人会被变更', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1364, 1, '钱包', '1', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1365, 2, '银行卡', '2', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1366, 3, '微信', '3', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1367, 4, '支付宝', '4', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1368, 1, '订单返佣', '1', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1369, 2, '申请提现', '2', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1370, 3, '申请提现驳回', '3', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1371, 0, '待结算', '0', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1372, 1, '已结算', '1', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1373, 2, '已取消', '2', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1374, 0, '审核中', '0', 'brokerage_withdraw_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1375, 10, '审核通过', '10', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1376, 11, '提现成功', '11', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1377, 20, '审核不通过', '20', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1378, 21, '提现失败', '21', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1379, 0, '工商银行', '0', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1380, 1, '建设银行', '1', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1381, 2, '农业银行', '2', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1382, 3, '中国银行', '3', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1383, 4, '交通银行', '4', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1384, 5, '招商银行', '5', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1385, 21, '钱包', 'wallet', 'pay_channel_code', 0, 'primary', '', '', '1', '2023-10-01 21:46:19', '1', '2023-10-01 21:48:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1386, 1, '砍价中', '1', 'promotion_bargain_record_status', 0, 'default', '', '', '1', '2023-10-05 10:41:26', '1', '2023-10-05 10:41:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1387, 2, '砍价成功', '2', 'promotion_bargain_record_status', 0, 'success', '', '', '1', '2023-10-05 10:41:39', '1', '2023-10-05 10:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1388, 3, '砍价失败', '3', 'promotion_bargain_record_status', 0, 'warning', '', '', '1', '2023-10-05 10:41:57', '1', '2023-10-05 10:41:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1389, 1, '拼团中', '1', 'promotion_combination_record_status', 0, '', '', '', '1', '2023-10-08 07:24:44', '1', '2023-10-08 07:24:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1390, 2, '拼团成功', '2', 'promotion_combination_record_status', 0, 'success', '', '', '1', '2023-10-08 07:24:56', '1', '2023-10-08 07:24:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1391, 3, '拼团失败', '3', 'promotion_combination_record_status', 0, 'warning', '', '', '1', '2023-10-08 07:25:11', '1', '2023-10-08 07:25:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1392, 2, '管理员修改', '2', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:41:34', '1', '2023-10-11 07:41:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1393, 13, '订单积分抵扣(单个退款)', '13', 'member_point_biz_type', 0, '', '', '', '1', '2023-10-11 07:42:29', '1', '2023-10-11 07:42:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1394, 21, '订单积分奖励', '21', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:44', '1', '2023-10-11 07:42:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1395, 22, '订单积分奖励(整单取消)', '22', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:55', '1', '2023-10-11 07:43:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1396, 23, '订单积分奖励(单个退款)', '23', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:43:16', '1', '2023-10-11 07:43:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1397, 13, '下单奖励(单个退款)', '13', 'member_experience_biz_type', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1398, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1399, 6, '支付宝', '6', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:38', '1', '2023-10-18 21:55:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1400, 7, '微信支付', '7', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:53', '1', '2023-10-18 21:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1401, 8, '其他', '8', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1402, 1, 'IT', '1', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:15', '1', '2024-02-18 23:30:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1403, 2, '金融业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:29', '1', '2024-02-18 23:30:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1404, 3, '房地产', '3', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:41', '1', '2024-02-18 23:30:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1405, 4, '商业服务', '4', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:54', '1', '2024-02-18 23:30:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1406, 5, '运输/物流', '5', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:03', '1', '2024-02-18 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1407, 6, '生产', '6', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:13', '1', '2024-02-18 23:31:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1408, 7, '政府', '7', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:27', '1', '2024-02-18 23:31:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1409, 8, '文化传媒', '8', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:37', '1', '2024-02-18 23:31:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', '2023-10-28 23:07:13', '1', '2023-10-28 23:07:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', '2023-10-28 23:07:35', '1', '2023-10-28 23:07:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', '2023-10-28 23:07:53', '1', '2023-10-28 23:07:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:29', '1', '2023-10-28 23:08:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:39', '1', '2023-10-28 23:08:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:47', '1', '2023-10-28 23:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:58', '1', '2023-10-28 23:08:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:12', '1', '2023-10-28 23:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:22', '1', '2023-10-28 23:09:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:39', '1', '2023-10-28 23:09:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:04', '1', '2023-10-28 23:10:04', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:18', '1', '2023-10-28 23:10:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:33', '1', '2023-10-28 23:10:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1435, 10, 'Gitee', '10', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:42', '1', '2023-11-04 13:04:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1436, 20, '钉钉', '20', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:54', '1', '2023-11-04 13:04:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1437, 30, '企业微信', '30', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:09', '1', '2023-11-04 13:05:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1438, 31, '微信公众平台', '31', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:18', '1', '2023-11-04 13:05:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1439, 32, '微信开放平台', '32', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:30', '1', '2023-11-04 13:05:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1440, 34, '微信小程序', '34', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:38', '1', '2023-11-04 13:07:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1441, 1, '上架', '1', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:34', '1', '2023-10-30 21:49:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1442, 0, '下架', '0', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:13', '1', '2023-10-30 21:49:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1443, 15, '子表', '15', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-13 23:06:16', '1', '2023-11-13 23:06:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1444, 10, '主表(标准模式)', '10', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:32:49', '1', '2023-11-14 12:32:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1445, 11, '主表(ERP 模式)', '11', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:33:05', '1', '2023-11-14 12:33:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1446, 12, '主表(内嵌模式)', '12', 'infra_codegen_template_type', 0, '', '', '', '1', '2023-11-14 12:33:31', '1', '2023-11-14 12:33:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1447, 1, '负责人', '1', 'crm_permission_level', 0, 'default', '', '', '1', '2023-11-30 09:53:12', '1', '2023-11-30 09:53:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1448, 2, '只读', '2', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:29', '1', '2023-11-30 09:53:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1449, 3, '读写', '3', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:36', '1', '2023-11-30 09:53:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1450, 0, '未提交', '0', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:56:59', '1', '2023-11-30 18:56:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1451, 10, '审批中', '10', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:10', '1', '2023-11-30 18:57:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1452, 20, '审核通过', '20', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:24', '1', '2023-11-30 18:57:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1453, 30, '审核不通过', '30', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:32', '1', '2023-11-30 18:57:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1454, 40, '已取消', '40', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:42', '1', '2023-11-30 18:57:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1456, 1, '支票', '1', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:29', '1', '2023-10-18 21:54:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1460, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1464, 4, '把', '4', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:05', '1', '2023-12-05 23:03:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1465, 5, '枚', '5', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:14', '1', '2023-12-05 23:03:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1466, 6, '瓶', '6', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:20', '1', '2023-12-05 23:03:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1467, 7, '盒', '7', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:30', '1', '2023-12-05 23:03:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1468, 8, '台', '8', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:41', '1', '2023-12-05 23:03:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1469, 9, '吨', '9', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:48', '1', '2023-12-05 23:03:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1470, 10, '千克', '10', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:03', '1', '2023-12-05 23:04:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1471, 11, '米', '11', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:12', '1', '2023-12-05 23:04:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1472, 12, '箱', '12', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:25', '1', '2023-12-05 23:04:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1473, 13, '套', '13', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:34', '1', '2023-12-05 23:04:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1474, 1, '打电话', '1', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:20', '1', '2024-01-15 20:48:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1475, 2, '发短信', '2', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:31', '1', '2024-01-15 20:48:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1476, 3, '上门拜访', '3', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:07', '1', '2024-01-15 20:49:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1477, 4, '微信沟通', '4', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:15', '1', '2024-01-15 20:49:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1478, 4, '钱包余额', '4', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:37', '1', '2023-10-28 16:28:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1479, 3, '银行卡', '3', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:28:21', '1', '2023-10-28 16:28:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1480, 2, '微信余额', '2', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:07', '1', '2023-10-28 16:28:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1481, 1, '支付宝余额', '1', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:27:44', '1', '2023-10-28 16:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1482, 4, '转账失败', '30', 'pay_transfer_status', 0, 'warning', '', '', '1', '2023-10-28 16:24:16', '1', '2023-10-28 16:24:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1483, 3, '转账成功', '20', 'pay_transfer_status', 0, 'success', '', '', '1', '2023-10-28 16:23:50', '1', '2023-10-28 16:23:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1484, 2, '转账进行中', '10', 'pay_transfer_status', 0, 'info', '', '', '1', '2023-10-28 16:23:12', '1', '2023-10-28 16:23:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1485, 1, '等待转账', '0', 'pay_transfer_status', 0, 'default', '', '', '1', '2023-10-28 16:21:43', '1', '2023-10-28 16:23:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1486, 10, '其它入库', '10', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:07:25', '1', '2024-02-05 18:07:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1487, 11, '其它入库(作废)', '11', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:08:07', '1', '2024-02-05 19:20:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1488, 20, '其它出库', '20', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:08:51', '1', '2024-02-05 18:08:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1489, 21, '其它出库(作废)', '21', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:09:00', '1', '2024-02-05 19:20:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1490, 10, '未审核', '10', 'erp_audit_status', 0, 'default', '', '', '1', '2024-02-06 00:00:21', '1', '2024-02-06 00:00:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1491, 20, '已审核', '20', 'erp_audit_status', 0, 'success', '', '', '1', '2024-02-06 00:00:35', '1', '2024-02-06 00:00:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1492, 30, '调拨入库', '30', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:19', '1', '2024-02-07 12:36:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1493, 31, '调拨入库(作废)', '31', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:29', '1', '2024-02-07 20:37:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1494, 32, '调拨出库', '32', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:38', '1', '2024-02-07 12:36:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1495, 33, '调拨出库(作废)', '33', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:49', '1', '2024-02-07 20:37:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1496, 40, '盘盈入库', '40', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:53:00', '1', '2024-02-08 08:53:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1497, 41, '盘盈入库(作废)', '41', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:53:39', '1', '2024-02-16 19:40:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1498, 42, '盘亏出库', '42', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:54:16', '1', '2024-02-08 08:54:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1499, 43, '盘亏出库(作废)', '43', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:54:31', '1', '2024-02-16 19:40:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1500, 50, '销售出库', '50', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-11 21:47:25', '1', '2024-02-11 21:50:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1501, 51, '销售出库(作废)', '51', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-11 21:47:37', '1', '2024-02-11 21:51:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1502, 60, '销售退货入库', '60', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-12 06:51:05', '1', '2024-02-12 06:51:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1503, 61, '销售退货入库(作废)', '61', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-12 06:51:18', '1', '2024-02-12 06:51:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1504, 70, '采购入库', '70', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:02', '1', '2024-02-16 13:10:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1505, 71, '采购入库(作废)', '71', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:10', '1', '2024-02-16 19:40:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1506, 80, '采购退货出库', '80', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:17', '1', '2024-02-16 13:10:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1507, 81, '采购退货出库(作废)', '81', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:26', '1', '2024-02-16 19:40:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1509, 3, '审批不通过', '3', 'bpm_process_instance_status', 0, 'danger', '', '', '1', '2024-03-16 16:12:06', '1', '2024-03-16 16:12:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1510, 4, '已取消', '4', 'bpm_process_instance_status', 0, 'warning', '', '', '1', '2024-03-16 16:12:22', '1', '2024-03-16 16:12:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1511, 5, '已退回', '5', 'bpm_task_status', 0, 'warning', '', '', '1', '2024-03-16 19:10:46', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1512, 6, '委派中', '6', 'bpm_task_status', 0, 'primary', '', '', '1', '2024-03-17 10:06:22', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1513, 7, '审批通过中', '7', 'bpm_task_status', 0, 'success', '', '', '1', '2024-03-17 10:06:47', '1', '2024-03-08 22:41:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1514, 0, '待审批', '0', 'bpm_task_status', 0, 'info', '', '', '1', '2024-03-17 10:07:11', '1', '2024-03-08 22:41:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1515, 35, '发起人自选', '35', 'bpm_task_candidate_strategy', 0, '', '', '', '1', '2024-03-22 19:45:16', '1', '2024-03-22 19:45:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1516, 1, '执行监听器', 'execution', 'bpm_process_listener_type', 0, 'primary', '', '', '1', '2024-03-23 12:54:03', '1', '2024-03-23 19:14:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1517, 1, '任务监听器', 'task', 'bpm_process_listener_type', 0, 'success', '', '', '1', '2024-03-23 12:54:13', '1', '2024-03-23 19:14:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1526, 1, 'Java 类', 'class', 'bpm_process_listener_value_type', 0, 'primary', '', '', '1', '2024-03-23 15:08:45', '1', '2024-03-23 19:14:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1527, 2, '表达式', 'expression', 'bpm_process_listener_value_type', 0, 'success', '', '', '1', '2024-03-23 15:09:06', '1', '2024-03-23 19:14:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1528, 3, '代理表达式', 'delegateExpression', 'bpm_process_listener_value_type', 0, 'info', '', '', '1', '2024-03-23 15:11:23', '1', '2024-03-23 19:14:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1529, 1, '天', '1', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:26', '1', '2024-03-29 22:50:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1530, 2, '周', '2', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:36', '1', '2024-03-29 22:50:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1531, 3, '月', '3', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:46', '1', '2024-03-29 22:50:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1532, 4, '季度', '4', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:01', '1', '2024-03-29 22:51:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1533, 5, '年', '5', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:07', '1', '2024-03-29 22:51:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1534, 1, '赢单', '1', 'crm_business_end_status_type', 0, 'success', '', '', '1', '2024-04-13 23:26:57', '1', '2024-04-13 23:26:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1535, 2, '输单', '2', 'crm_business_end_status_type', 0, 'primary', '', '', '1', '2024-04-13 23:27:31', '1', '2024-04-13 23:27:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1536, 3, '无效', '3', 'crm_business_end_status_type', 0, 'info', '', '', '1', '2024-04-13 23:27:59', '1', '2024-04-13 23:27:59', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dict_data_seq; +CREATE SEQUENCE system_dict_data_seq + START 1537; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_type; +CREATE TABLE system_dict_type +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + type varchar(100) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + deleted_time timestamp NULL DEFAULT NULL +); + +ALTER TABLE system_dict_type + ADD CONSTRAINT pk_system_dict_type PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_type.id IS '字典主键'; +COMMENT ON COLUMN system_dict_type.name IS '字典名称'; +COMMENT ON COLUMN system_dict_type.type IS '字典类型'; +COMMENT ON COLUMN system_dict_type.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_type.remark IS '备注'; +COMMENT ON COLUMN system_dict_type.creator IS '创建者'; +COMMENT ON COLUMN system_dict_type.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_type.updater IS '更新者'; +COMMENT ON COLUMN system_dict_type.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_type.deleted IS '是否删除'; +COMMENT ON COLUMN system_dict_type.deleted_time IS '删除时间'; +COMMENT ON TABLE system_dict_type IS '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-05-16 20:29:32', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (9, '操作类型', 'infra_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '1', '2022-05-16 20:26:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2023-07-10 10:11:39', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', '2021-12-03 10:53:29', '1', '2023-07-19 18:09:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2023-07-19 10:13:17', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (140, '流程实例的结果', 'bpm_task_status', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2024-03-08 22:42:03', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (142, '任务分配规则的类型', 'bpm_task_candidate_strategy', 0, 'BPM 任务的候选人的策略', '103', '2022-01-12 23:21:04', '103', '2024-03-06 02:53:59', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', '2022-03-10 16:33:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', '2022-03-15 00:24:38', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', '2022-10-24 21:19:04', '1', '2022-10-24 21:19:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', '2022-11-01 12:46:06', '1', '2022-11-01 12:46:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', '2022-11-02 00:06:20', '1', '2022-11-04 00:08:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', '2022-11-02 00:28:01', '1', '2022-11-02 00:28:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', '2022-11-04 00:14:49', '1', '2022-11-04 00:14:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', '2022-11-04 19:12:27', '1', '2022-11-04 19:12:27', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', '2022-11-04 22:54:23', '1', '2022-11-04 22:54:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', '2022-11-04 22:59:23', '1', '2022-11-04 22:59:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', '2022-11-19 20:52:56', '1', '2022-11-19 20:52:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', '2022-11-19 21:04:09', '1', '2022-11-19 21:04:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', '2022-11-19 21:39:04', '1', '2022-11-19 21:39:04', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (160, '终端', 'terminal', 0, '终端', '1', '2022-12-10 10:50:50', '1', '2022-12-10 10:53:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', '2022-12-10 16:33:54', '1', '2022-12-10 16:33:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', '2022-12-10 16:48:44', '1', '2022-12-10 16:48:44', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', '2022-12-10 20:58:08', '1', '2022-12-10 20:58:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', '2023-01-16 23:29:56', '1', '2023-01-16 23:29:56', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', '2023-01-17 22:17:09', '1', '2023-01-17 22:17:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', '2023-07-20 12:23:03', '1', '2023-07-20 12:23:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', '2023-08-23 00:03:14', '1', '2023-08-23 00:03:14', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (176, '分佣模式', 'brokerage_enabled_condition', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (177, '分销关系绑定模式', 'brokerage_bind_mode', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (178, '佣金提现类型', 'brokerage_withdraw_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (179, '佣金记录业务类型', 'brokerage_record_biz_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (180, '佣金记录状态', 'brokerage_record_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (181, '佣金提现状态', 'brokerage_withdraw_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (182, '佣金提现银行', 'brokerage_bank_name', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (183, '砍价记录的状态', 'promotion_bargain_record_status', 0, '', '1', '2023-10-05 10:41:08', '1', '2023-10-05 10:41:08', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (184, '拼团记录的状态', 'promotion_combination_record_status', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-10-08 07:24:25', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (185, '回款-回款方式', 'crm_receivable_return_type', 0, '回款-回款方式', '1', '2023-10-18 21:54:10', '1', '2023-10-18 21:54:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (186, 'CRM 客户行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', '2023-10-28 22:57:07', '1', '2024-02-18 23:30:22', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', '2023-10-28 22:59:12', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', '2023-10-28 23:00:34', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (600, 'Banner 位置', 'promotion_banner_position', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-11-04 13:04:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (601, '社交类型', 'system_social_type', 0, '', '1', '2023-11-04 13:03:54', '1', '2023-11-04 13:03:54', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (604, '产品状态', 'crm_product_status', 0, '', '1', '2023-10-30 21:47:59', '1', '2023-10-30 21:48:45', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (605, 'CRM 数据权限的级别', 'crm_permission_level', 0, '', '1', '2023-11-30 09:51:59', '1', '2023-11-30 09:51:59', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (606, 'CRM 审批状态', 'crm_audit_status', 0, '', '1', '2023-11-30 18:56:23', '1', '2023-11-30 18:56:23', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (607, 'CRM 产品单位', 'crm_product_unit', 0, '', '1', '2023-12-05 23:01:51', '1', '2023-12-05 23:01:51', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (608, 'CRM 跟进方式', 'crm_follow_up_type', 0, '', '1', '2024-01-15 20:48:05', '1', '2024-01-15 20:48:05', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (609, '支付转账类型', 'pay_transfer_type', 0, '', '1', '2023-10-28 16:27:18', '1', '2023-10-28 16:27:18', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (610, '转账订单状态', 'pay_transfer_status', 0, '', '1', '2023-10-28 16:18:32', '1', '2023-10-28 16:18:32', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (611, 'ERP 库存明细的业务类型', 'erp_stock_record_biz_type', 0, 'ERP 库存明细的业务类型', '1', '2024-02-05 18:07:02', '1', '2024-02-05 18:07:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (612, 'ERP 审批状态', 'erp_audit_status', 0, '', '1', '2024-02-06 00:00:07', '1', '2024-02-06 00:00:07', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (613, 'BPM 监听器类型', 'bpm_process_listener_type', 0, '', '1', '2024-03-23 12:52:24', '1', '2024-03-09 15:54:28', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (615, 'BPM 监听器值类型', 'bpm_process_listener_value_type', 0, '', '1', '2024-03-23 13:00:31', '1', '2024-03-23 13:00:31', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (616, '时间间隔', 'date_interval', 0, '', '1', '2024-03-29 22:50:09', '1', '2024-03-29 22:50:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (619, 'CRM 商机结束状态类型', 'crm_business_end_status_type', 0, '', '1', '2024-04-13 23:23:00', '1', '2024-04-13 23:23:00', '0', '1970-01-01 00:00:00'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dict_type_seq; +CREATE SEQUENCE system_dict_type_seq + START 620; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS system_login_log; +CREATE TABLE system_login_log +( + id int8 NOT NULL, + log_type int8 NOT NULL, + trace_id varchar(64) NULL DEFAULT '', + user_id int8 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + username varchar(50) NULL DEFAULT '', + result int2 NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_login_log + ADD CONSTRAINT pk_system_login_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_login_log.id IS '访问ID'; +COMMENT ON COLUMN system_login_log.log_type IS '日志类型'; +COMMENT ON COLUMN system_login_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_login_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_login_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_login_log.username IS '用户账号'; +COMMENT ON COLUMN system_login_log.result IS '登陆结果'; +COMMENT ON COLUMN system_login_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_login_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_login_log.creator IS '创建者'; +COMMENT ON COLUMN system_login_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_login_log.updater IS '更新者'; +COMMENT ON COLUMN system_login_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_login_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_login_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_login_log IS '系统访问记录'; + +DROP SEQUENCE IF EXISTS system_login_log_seq; +CREATE SEQUENCE system_login_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_account; +CREATE TABLE system_mail_account +( + id int8 NOT NULL, + mail varchar(255) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NOT NULL, + host varchar(255) NOT NULL, + port int4 NOT NULL, + ssl_enable bool NOT NULL DEFAULT '0', + starttls_enable bool NOT NULL DEFAULT '0', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_account + ADD CONSTRAINT pk_system_mail_account PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_account.id IS '主键'; +COMMENT ON COLUMN system_mail_account.mail IS '邮箱'; +COMMENT ON COLUMN system_mail_account.username IS '用户名'; +COMMENT ON COLUMN system_mail_account.password IS '密码'; +COMMENT ON COLUMN system_mail_account.host IS 'SMTP 服务器域名'; +COMMENT ON COLUMN system_mail_account.port IS 'SMTP 服务器端口'; +COMMENT ON COLUMN system_mail_account.ssl_enable IS '是否开启 SSL'; +COMMENT ON COLUMN system_mail_account.starttls_enable IS '是否开启 STARTTLS'; +COMMENT ON COLUMN system_mail_account.creator IS '创建者'; +COMMENT ON COLUMN system_mail_account.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_account.updater IS '更新者'; +COMMENT ON COLUMN system_mail_account.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_account.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_account IS '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, '0', '0', '1', '2023-01-25 17:39:52', '1', '2024-04-24 09:13:56', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, '1', '0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, '0', '0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', '1'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, '1', '0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', '1'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_mail_account_seq; +CREATE SEQUENCE system_mail_account_seq + START 5; + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_log; +CREATE TABLE system_mail_log +( + id int8 NOT NULL, + user_id int8 NULL DEFAULT NULL, + user_type int2 NULL DEFAULT NULL, + to_mail varchar(255) NOT NULL, + account_id int8 NOT NULL, + from_mail varchar(255) NOT NULL, + template_id int8 NOT NULL, + template_code varchar(63) NOT NULL, + template_nickname varchar(255) NULL DEFAULT NULL, + template_title varchar(255) NOT NULL, + template_content varchar(10240) NOT NULL, + template_params varchar(255) NOT NULL, + send_status int2 NOT NULL DEFAULT 0, + send_time timestamp NULL DEFAULT NULL, + send_message_id varchar(255) NULL DEFAULT NULL, + send_exception varchar(4096) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_log + ADD CONSTRAINT pk_system_mail_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_log.id IS '编号'; +COMMENT ON COLUMN system_mail_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_mail_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_mail_log.to_mail IS '接收邮箱地址'; +COMMENT ON COLUMN system_mail_log.account_id IS '邮箱账号编号'; +COMMENT ON COLUMN system_mail_log.from_mail IS '发送邮箱地址'; +COMMENT ON COLUMN system_mail_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_mail_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_mail_log.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_mail_log.template_title IS '邮件标题'; +COMMENT ON COLUMN system_mail_log.template_content IS '邮件内容'; +COMMENT ON COLUMN system_mail_log.template_params IS '邮件参数'; +COMMENT ON COLUMN system_mail_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_mail_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_mail_log.send_message_id IS '发送返回的消息 ID'; +COMMENT ON COLUMN system_mail_log.send_exception IS '发送异常'; +COMMENT ON COLUMN system_mail_log.creator IS '创建者'; +COMMENT ON COLUMN system_mail_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_log.updater IS '更新者'; +COMMENT ON COLUMN system_mail_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_log.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_log IS '邮件日志表'; + +DROP SEQUENCE IF EXISTS system_mail_log_seq; +CREATE SEQUENCE system_mail_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_template; +CREATE TABLE system_mail_template +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + code varchar(63) NOT NULL, + account_id int8 NOT NULL, + nickname varchar(255) NULL DEFAULT NULL, + title varchar(255) NOT NULL, + content varchar(10240) NOT NULL, + params varchar(255) NOT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_template + ADD CONSTRAINT pk_system_mail_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_template.id IS '编号'; +COMMENT ON COLUMN system_mail_template.name IS '模板名称'; +COMMENT ON COLUMN system_mail_template.code IS '模板编码'; +COMMENT ON COLUMN system_mail_template.account_id IS '发送的邮箱账号编号'; +COMMENT ON COLUMN system_mail_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_mail_template.title IS '模板标题'; +COMMENT ON COLUMN system_mail_template.content IS '模板内容'; +COMMENT ON COLUMN system_mail_template.params IS '参数数组'; +COMMENT ON COLUMN system_mail_template.status IS '开启状态'; +COMMENT ON COLUMN system_mail_template.remark IS '备注'; +COMMENT ON COLUMN system_mail_template.creator IS '创建者'; +COMMENT ON COLUMN system_mail_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_template.updater IS '更新者'; +COMMENT ON COLUMN system_mail_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_template.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_template IS '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '["code","name"]', 0, '3', '1', '2021-10-11 08:10:00', '1', '2023-12-02 19:51:14', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '["key01","key02"]', 0, NULL, '1', '2023-01-26 01:27:40', '1', '2023-01-27 10:32:16', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', '2023-01-27 15:50:35', '1', '2023-01-27 16:34:49', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_mail_template_seq; +CREATE SEQUENCE system_mail_template_seq + START 16; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_menu; +CREATE TABLE system_menu +( + id int8 NOT NULL, + name varchar(50) NOT NULL, + permission varchar(100) NULL DEFAULT '', + type int2 NOT NULL, + sort int4 NOT NULL DEFAULT 0, + parent_id int8 NOT NULL DEFAULT 0, + path varchar(200) NULL DEFAULT '', + icon varchar(100) NULL DEFAULT '#', + component varchar(255) NULL DEFAULT NULL, + component_name varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL DEFAULT 0, + visible bool NOT NULL DEFAULT '1', + keep_alive bool NOT NULL DEFAULT '1', + always_show bool NOT NULL DEFAULT '1', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_menu + ADD CONSTRAINT pk_system_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_menu.id IS '菜单ID'; +COMMENT ON COLUMN system_menu.name IS '菜单名称'; +COMMENT ON COLUMN system_menu.permission IS '权限标识'; +COMMENT ON COLUMN system_menu.type IS '菜单类型'; +COMMENT ON COLUMN system_menu.sort IS '显示顺序'; +COMMENT ON COLUMN system_menu.parent_id IS '父菜单ID'; +COMMENT ON COLUMN system_menu.path IS '路由地址'; +COMMENT ON COLUMN system_menu.icon IS '菜单图标'; +COMMENT ON COLUMN system_menu.component IS '组件路径'; +COMMENT ON COLUMN system_menu.component_name IS '组件名'; +COMMENT ON COLUMN system_menu.status IS '菜单状态'; +COMMENT ON COLUMN system_menu.visible IS '是否可见'; +COMMENT ON COLUMN system_menu.keep_alive IS '是否缓存'; +COMMENT ON COLUMN system_menu.always_show IS '是否总是显示'; +COMMENT ON COLUMN system_menu.creator IS '创建者'; +COMMENT ON COLUMN system_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_menu.updater IS '更新者'; +COMMENT ON COLUMN system_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_menu.deleted IS '是否删除'; +COMMENT ON TABLE system_menu IS '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:04:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-03-01 08:28:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-09-20 16:26:19', '1', '2024-02-29 12:38:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:02:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:07:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:02:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (107, '通知公告', '', 2, 4, 2739, 'notice', 'ep:takeaway-box', 'system/notice/index', 'SystemNotice', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-22 23:56:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:08:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:13:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (110, '定时任务', '', 2, 7, 2, 'job', 'fa-solid:tasks', 'infra/job/index', 'InfraJob', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:57:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:05:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:document-copy', 'infra/codegen/index', 'InfraCodegen', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:01:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:09:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:10:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, '1', '1', '1', '', '2021-02-06 12:42:49', '1', '2023-11-15 23:45:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, '1', '1', '1', '', '2021-02-08 20:41:31', '1', '2024-04-23 00:07:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2024-02-29 08:54:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '', '2021-02-26 02:18:24', '1', '2024-04-22 23:58:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2024-02-29 08:55:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, '1', '1', '1', '', '2021-03-12 20:16:20', '1', '2024-02-29 08:53:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1093, '短信管理', '', 1, 1, 2739, 'sms', 'ep:message', NULL, NULL, 0, '1', '1', '1', '1', '2021-04-05 01:10:16', '1', '2024-04-22 23:56:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'fa:stack-exchange', 'system/sms/channel/index', 'SystemSmsChannel', 0, '1', '1', '1', '', '2021-04-01 11:07:15', '1', '2024-02-29 01:15:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'ep:connection', 'system/sms/template/index', 'SystemSmsTemplate', 0, '1', '1', '1', '', '2021-04-01 17:35:17', '1', '2024-02-29 01:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'fa:edit', 'system/sms/log/index', 'SystemSmsLog', 0, '1', '1', '1', '', '2021-04-11 08:37:05', '1', '2024-02-29 08:49:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1117, '支付管理', '', 1, 30, 0, '/pay', 'ep:money', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-25 16:43:41', '1', '2024-02-29 08:58:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2024-02-29 12:38:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'fa:apple', 'pay/app/index', 'PayApp', 0, '1', '1', '1', '', '2021-11-10 01:13:30', '1', '2024-02-29 08:59:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'ep:house', 'system/tenant/index', 'SystemTenant', 0, '1', '1', '1', '', '2021-12-14 12:31:43', '1', '2024-02-29 01:01:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'fa:registered', 'pay/refund/index', 'PayRefund', 0, '1', '1', '1', '', '2021-12-25 08:29:07', '1', '2024-02-29 08:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'fa:cc-paypal', 'pay/order/index', 'PayOrder', 0, '1', '1', '1', '', '2021-12-25 08:49:43', '1', '2024-02-29 08:59:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:26:36', '1', '2024-02-29 12:43:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:28:30', '1', '2024-02-29 12:36:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2024-03-19 12:25:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, '1', '1', '1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:35', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '1', '2022-01-07 23:51:48', '1', '2024-03-21 00:33:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2024-03-21 23:52:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, '1', '1', '1', '1', '2022-01-08 10:33:37', '1', '2024-02-29 12:37:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, '1', '1', '1', '1', '2022-01-08 10:34:13', '1', '2024-02-29 12:37:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, '1', '1', '1', '', '2022-01-14 02:14:20', '1', '2024-03-21 23:55:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'fa-solid:house-user', NULL, NULL, 0, '1', '1', '1', '1', '2022-02-20 01:41:13', '1', '2024-02-29 00:59:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'fa:bars', 'system/tenantPackage/index', 'SystemTenantPackage', 0, '1', '1', '1', '', '2022-02-19 17:44:06', '1', '2024-02-29 01:01:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, '1', '1', '1', '', '2022-03-15 14:35:28', '1', '2024-02-29 08:52:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, '1', '1', '1', '1', '2022-03-16 23:47:40', '1', '2024-04-23 00:02:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:avatar', NULL, NULL, 0, '1', '1', '1', '1', '2022-04-23 01:03:15', '1', '2023-12-08 23:40:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:data-analysis', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, '1', '1', '1', '', '2022-04-27 14:37:32', '1', '2024-02-29 08:51:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, '1', '1', '1', '1', '2022-05-09 23:38:17', '1', '2024-02-29 01:12:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2024-02-29 01:13:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1281, '报表管理', '', 2, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, '1', '1', '1', '1', '2022-07-10 20:22:15', '1', '2024-02-29 12:33:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'GoView', 0, '1', '1', '1', '1', '2022-07-10 20:26:36', '1', '2024-02-29 12:33:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2000, '商品中心', '', 1, 60, 2362, 'product', 'fa:product-hunt', NULL, NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-09-30 11:52:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2002, '商品分类', '', 2, 2, 2000, 'category', 'ep:cellphone', 'mall/product/category/index', 'ProductCategory', 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-08-21 10:27:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2003, '分类查询', 'product:category:query', 3, 1, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2004, '分类创建', 'product:category:create', 3, 2, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2005, '分类更新', 'product:category:update', 3, 3, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2006, '分类删除', 'product:category:delete', 3, 4, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2008, '商品品牌', '', 2, 3, 2000, 'brand', 'ep:chicken', 'mall/product/brand/index', 'ProductBrand', 0, '1', '1', '1', '', '2022-07-30 13:52:44', '1', '2023-08-21 10:27:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2009, '品牌查询', 'product:brand:query', 3, 1, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2010, '品牌创建', 'product:brand:create', 3, 2, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2011, '品牌更新', 'product:brand:update', 3, 3, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2012, '品牌删除', 'product:brand:delete', 3, 4, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2014, '商品列表', '', 2, 1, 2000, 'spu', 'ep:apple', 'mall/product/spu/index', 'ProductSpu', 0, '1', '1', '1', '', '2022-07-30 14:22:58', '1', '2023-08-21 10:27:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2015, '商品查询', 'product:spu:query', 3, 1, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2016, '商品创建', 'product:spu:create', 3, 2, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2017, '商品更新', 'product:spu:update', 3, 3, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2018, '商品删除', 'product:spu:delete', 3, 4, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2019, '商品属性', '', 2, 4, 2000, 'property', 'ep:cold-drink', 'mall/product/property/index', 'ProductProperty', 0, '1', '1', '1', '', '2022-08-01 14:55:35', '1', '2023-08-26 11:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2020, '规格查询', 'product:property:query', 3, 1, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2021, '规格创建', 'product:property:create', 3, 2, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2022, '规格更新', 'product:property:update', 3, 3, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2023, '规格删除', 'product:property:delete', 3, 4, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2025, 'Banner', '', 2, 100, 2387, 'banner', 'fa:bandcamp', 'mall/promotion/banner/index', NULL, 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2026, 'Banner查询', 'promotion:banner:query', 3, 1, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2027, 'Banner创建', 'promotion:banner:create', 3, 2, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2028, 'Banner更新', 'promotion:banner:update', 3, 3, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2029, 'Banner删除', 'promotion:banner:delete', 3, 4, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2030, '营销中心', '', 1, 70, 2362, 'promotion', 'ep:present', NULL, NULL, 0, '1', '1', '1', '1', '2022-10-31 21:25:09', '1', '2023-09-30 11:54:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2032, '优惠劵列表', '', 2, 1, 2365, 'template', 'ep:discount', 'mall/promotion/coupon/template/index', 'PromotionCouponTemplate', 0, '1', '1', '1', '', '2022-10-31 22:27:14', '1', '2023-10-03 12:40:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2033, '优惠劵模板查询', 'promotion:coupon-template:query', 3, 1, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2034, '优惠劵模板创建', 'promotion:coupon-template:create', 3, 2, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2035, '优惠劵模板更新', 'promotion:coupon-template:update', 3, 3, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2036, '优惠劵模板删除', 'promotion:coupon-template:delete', 3, 4, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2038, '领取记录', '', 2, 2, 2365, 'list', 'ep:collection-tag', 'mall/promotion/coupon/index', 'PromotionCoupon', 0, '1', '1', '1', '', '2022-11-03 23:21:31', '1', '2023-10-03 12:55:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2039, '优惠劵查询', 'promotion:coupon:query', 3, 1, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2040, '优惠劵删除', 'promotion:coupon:delete', 3, 4, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2041, '满减送', '', 2, 10, 2390, 'reward-activity', 'ep:goblet-square-full', 'mall/promotion/rewardActivity/index', 'PromotionRewardActivity', 0, '1', '1', '1', '', '2022-11-04 23:47:49', '1', '2023-10-21 19:24:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2042, '满减送活动查询', 'promotion:reward-activity:query', 3, 1, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2043, '满减送活动创建', 'promotion:reward-activity:create', 3, 2, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2044, '满减送活动更新', 'promotion:reward-activity:update', 3, 3, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2045, '满减送活动删除', 'promotion:reward-activity:delete', 3, 4, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2047, '限时折扣', '', 2, 7, 2390, 'discount-activity', 'ep:timer', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, '1', '1', '1', '', '2022-11-05 17:12:15', '1', '2023-10-21 19:24:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, '1', '1', '1', '', '2022-11-06 22:24:49', '1', '2023-06-24 18:57:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, '1', '1', '1', '', '2022-11-15 19:46:50', '1', '2023-06-24 18:57:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:48:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2072, '订单中心', '', 1, 65, 2362, 'trade', 'ep:eleme', NULL, NULL, 0, '1', '1', '1', '1', '2022-11-19 18:57:19', '1', '2023-09-30 11:54:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2073, '售后退款', '', 2, 2, 2072, 'after-sale', 'ep:refrigerator', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, '1', '1', '1', '', '2022-11-19 20:15:32', '1', '2023-10-01 21:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2075, '秒杀活动关闭', 'promotion:seckill-activity:close', 3, 5, 2059, '', '', '', '', 0, '1', '1', '1', '1', '2022-11-28 20:20:15', '1', '2023-10-03 18:34:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2076, '订单列表', '', 2, 1, 2072, 'order', 'ep:list', 'mall/trade/order/index', 'TradeOrder', 0, '1', '1', '1', '1', '2022-12-10 21:05:44', '1', '2023-10-01 21:42:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, '1', '1', '1', '1', '2022-12-23 17:35:05', '1', '2024-02-29 08:50:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'ep:compass', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-01 20:11:04', '1', '2024-02-29 12:39:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'fa:user', 'mp/account/index', 'MpAccount', 0, '1', '1', '1', '1', '2023-01-01 20:13:31', '1', '2024-02-29 12:42:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2086, '新增账号', 'mp:account:create', 3, 1, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-01 20:21:40', '1', '2023-01-07 17:32:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2087, '修改账号', 'mp:account:update', 3, 2, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:32:46', '1', '2023-01-07 17:32:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2088, '查询账号', 'mp:account:query', 3, 0, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:07', '1', '2023-01-07 17:33:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2089, '删除账号', 'mp:account:delete', 3, 3, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:21', '1', '2023-01-07 17:33:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2090, '生成二维码', 'mp:account:qr-code', 3, 4, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:58', '1', '2023-01-07 17:33:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2091, '清空 API 配额', 'mp:account:clear-quota', 3, 5, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 18:20:32', '1', '2023-01-07 18:20:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2092, '数据统计', 'mp:statistics:query', 2, 2, 2084, 'statistics', 'ep:trend-charts', 'mp/statistics/index', 'MpStatistics', 0, '1', '1', '1', '1', '2023-01-07 20:17:36', '1', '2024-02-29 12:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2093, '标签管理', '', 2, 3, 2084, 'tag', 'ep:collection-tag', 'mp/tag/index', 'MpTag', 0, '1', '1', '1', '1', '2023-01-08 11:37:32', '1', '2024-02-29 12:42:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2094, '查询标签', 'mp:tag:query', 3, 0, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:03', '1', '2023-01-08 11:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2095, '新增标签', 'mp:tag:create', 3, 1, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:23', '1', '2023-01-08 11:59:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2096, '修改标签', 'mp:tag:update', 3, 2, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:41', '1', '2023-01-08 11:59:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2097, '删除标签', 'mp:tag:delete', 3, 3, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:04', '1', '2023-01-08 12:00:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2098, '同步标签', 'mp:tag:sync', 3, 4, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:29', '1', '2023-01-08 12:00:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2099, '粉丝管理', '', 2, 4, 2084, 'user', 'fa:user-secret', 'mp/user/index', 'MpUser', 0, '1', '1', '1', '1', '2023-01-08 16:51:20', '1', '2024-02-29 12:42:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2100, '查询粉丝', 'mp:user:query', 3, 0, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:16:59', '1', '2023-01-08 17:17:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2101, '修改粉丝', 'mp:user:update', 3, 1, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:11', '1', '2023-01-08 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2102, '同步粉丝', 'mp:user:sync', 3, 2, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:40', '1', '2023-01-08 17:17:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2103, '消息管理', '', 2, 5, 2084, 'message', 'ep:message', 'mp/message/index', 'MpMessage', 0, '1', '1', '1', '1', '2023-01-08 18:44:19', '1', '2024-02-29 12:42:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2104, '图文发表记录', '', 2, 10, 2084, 'free-publish', 'ep:edit-pen', 'mp/freePublish/index', 'MpFreePublish', 0, '1', '1', '1', '1', '2023-01-13 00:30:50', '1', '2024-02-29 12:43:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2105, '查询发布列表', 'mp:free-publish:query', 3, 1, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:17', '1', '2023-01-13 07:19:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2106, '发布草稿', 'mp:free-publish:submit', 3, 2, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:46', '1', '2023-01-13 07:19:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2107, '删除发布记录', 'mp:free-publish:delete', 3, 3, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:20:01', '1', '2023-01-13 07:20:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2108, '图文草稿箱', '', 2, 9, 2084, 'draft', 'ep:edit', 'mp/draft/index', 'MpDraft', 0, '1', '1', '1', '1', '2023-01-13 07:40:21', '1', '2024-02-29 12:43:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2109, '新建草稿', 'mp:draft:create', 3, 1, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 23:15:30', '1', '2023-01-13 23:15:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2110, '修改草稿', 'mp:draft:update', 3, 2, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:08:47', '1', '2023-01-14 10:08:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2111, '查询草稿', 'mp:draft:query', 3, 0, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:01', '1', '2023-01-14 10:09:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2112, '删除草稿', 'mp:draft:delete', 3, 3, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:19', '1', '2023-01-14 10:09:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2113, '素材管理', '', 2, 8, 2084, 'material', 'ep:basketball', 'mp/material/index', 'MpMaterial', 0, '1', '1', '1', '1', '2023-01-14 14:12:07', '1', '2024-02-29 12:43:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2114, '上传临时素材', 'mp:material:upload-temporary', 3, 1, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:33:55', '1', '2023-01-14 15:33:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2115, '上传永久素材', 'mp:material:upload-permanent', 3, 2, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:34:14', '1', '2023-01-14 15:34:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2116, '删除素材', 'mp:material:delete', 3, 3, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:35:37', '1', '2023-01-14 15:35:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2117, '上传图文图片', 'mp:material:upload-news-image', 3, 4, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:36:31', '1', '2023-01-14 15:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2118, '查询素材', 'mp:material:query', 3, 5, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:39:22', '1', '2023-01-14 15:39:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2119, '菜单管理', '', 2, 6, 2084, 'menu', 'ep:menu', 'mp/menu/index', 'MpMenu', 0, '1', '1', '1', '1', '2023-01-14 17:43:54', '1', '2024-02-29 12:42:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2120, '自动回复', '', 2, 7, 2084, 'auto-reply', 'fa-solid:republican', 'mp/autoReply/index', 'MpAutoReply', 0, '1', '1', '1', '1', '2023-01-15 22:13:09', '1', '2024-02-29 12:43:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2121, '查询回复', 'mp:auto-reply:query', 3, 0, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:41', '1', '2023-01-16 22:28:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2122, '新增回复', 'mp:auto-reply:create', 3, 1, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:54', '1', '2023-01-16 22:28:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2123, '修改回复', 'mp:auto-reply:update', 3, 2, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:05', '1', '2023-01-16 22:29:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2124, '删除回复', 'mp:auto-reply:delete', 3, 3, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:34', '1', '2023-01-16 22:29:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2125, '查询菜单', 'mp:menu:query', 3, 0, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:05:41', '1', '2023-01-17 23:05:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2126, '保存菜单', 'mp:menu:save', 3, 1, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:01', '1', '2023-01-17 23:06:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2127, '删除菜单', 'mp:menu:delete', 3, 2, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:16', '1', '2023-01-17 23:06:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2128, '查询消息', 'mp:message:query', 3, 0, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:14', '1', '2023-01-17 23:07:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2129, '发送消息', 'mp:message:send', 3, 1, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:26', '1', '2023-01-17 23:07:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2130, '邮箱管理', '', 2, 2, 2739, 'mail', 'fa-solid:mail-bulk', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-25 17:27:44', '1', '2024-04-22 23:56:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'fa:universal-access', 'system/mail/account/index', 'SystemMailAccount', 0, '1', '1', '1', '', '2023-01-25 09:33:48', '1', '2024-02-29 08:48:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'fa:tag', 'system/mail/template/index', 'SystemMailTemplate', 0, '1', '1', '1', '', '2023-01-25 12:05:31', '1', '2024-02-29 08:48:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'fa:edit', 'system/mail/log/index', 'SystemMailLog', 0, '1', '1', '1', '', '2023-01-26 02:16:50', '1', '2024-02-29 08:48:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-26 02:16:50', '', '2023-01-26 02:16:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-26 23:29:15', '1', '2023-01-26 23:29:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2144, '站内信管理', '', 1, 3, 2739, 'notify', 'ep:message-box', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-28 10:25:18', '1', '2024-04-22 23:56:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'fa:archive', 'system/notify/template/index', 'SystemNotifyTemplate', 0, '1', '1', '1', '', '2023-01-28 02:26:42', '1', '2024-02-29 08:49:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-28 10:54:43', '1', '2023-01-28 10:54:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'fa:edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, '1', '1', '1', '', '2023-01-28 04:28:22', '1', '2024-02-29 08:49:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 04:28:22', '', '2023-01-28 04:28:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'JimuReport', 0, '1', '1', '1', '1', '2023-02-07 00:03:19', '1', '2024-02-29 12:34:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:14', '1', '2023-02-07 19:25:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2155, '更新项目', 'report:go-view-project:update', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2023-02-07 19:25:34', '1', '2024-04-24 20:01:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:46:28', '1', '2023-12-02 21:32:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, '1', '1', '1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2164, '配送管理', '', 1, 3, 2072, 'delivery', 'ep:shopping-cart', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:18:02', '1', '2023-09-28 10:58:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', 'ep:bicycle', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:22:06', '1', '2023-08-30 21:02:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', 'ep:add-location', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:23:14', '1', '2023-08-30 21:03:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', 'ep:compass', 'mall/trade/delivery/express/index', 'Express', 0, '1', '1', '1', '1', '2023-05-18 09:27:21', '1', '2023-08-30 21:02:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', 'ep:coordinate', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, '1', '1', '1', '1', '2023-05-20 06:48:10', '1', '2023-08-30 21:03:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', 'ep:basketball', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, '1', '1', '1', '1', '2023-05-25 10:50:00', '1', '2023-08-30 21:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, '1', '1', '1', '1', '2023-06-24 17:39:13', '1', '2023-06-24 18:55:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'ep:bicycle', NULL, NULL, 0, '1', '1', '1', '1', '2023-06-10 00:42:03', '1', '2023-08-20 09:23:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2275, '会员配置', '', 2, 0, 2262, 'config', 'fa:archive', 'member/config/index', 'MemberConfig', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2023-10-01 23:41:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2276, '会员配置查询', 'member:config:query', 3, 1, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:48:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2277, '会员配置保存', 'member:config:save', 3, 2, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:49:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2281, '签到配置', '', 2, 2, 2300, 'config', 'ep:calendar', 'member/signin/config/index', 'SignInConfig', 0, '1', '1', '1', '', '2023-06-10 03:26:12', '1', '2023-08-20 19:25:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2287, '会员积分', '', 2, 10, 2262, 'record', 'fa:asterisk', 'member/point/record/index', 'PointRecord', 0, '1', '1', '1', '', '2023-06-10 04:18:50', '1', '2023-10-01 23:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:18:50', '', '2023-06-10 04:18:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2293, '签到记录', '', 2, 3, 2300, 'record', 'ep:chicken', 'member/signin/record/index', 'SignInRecord', 0, '1', '1', '1', '', '2023-06-10 04:48:22', '1', '2023-08-20 19:26:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2300, '会员签到', '', 1, 11, 2262, 'signin', 'ep:alarm-clock', '', '', 0, '1', '1', '1', '1', '2023-06-27 22:49:53', '1', '2023-08-20 09:23:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2301, '回调通知', '', 2, 5, 1117, 'notify', 'ep:mute-notification', 'pay/notify/index', 'PayNotify', 0, '1', '1', '1', '', '2023-07-20 04:41:32', '1', '2024-01-18 23:56:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2302, '支付通知查询', 'pay:notify:query', 3, 1, 2301, '', '', '', NULL, 0, '1', '1', '1', '', '2023-07-20 04:41:32', '', '2023-07-20 04:41:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2303, '拼团活动', '', 2, 3, 2030, 'combination', 'fa:group', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:19:54', '1', '2023-08-12 17:20:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2304, '拼团商品', '', 2, 1, 2303, 'acitivity', 'ep:apple', 'mall/promotion/combination/activity/index', 'PromotionCombinationActivity', 0, '1', '1', '1', '1', '2023-08-12 17:22:03', '1', '2023-08-12 17:22:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2305, '拼团活动查询', 'promotion:combination-activity:query', 3, 1, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:32', '1', '2023-11-24 11:57:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2306, '拼团活动创建', 'promotion:combination-activity:create', 3, 2, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:49', '1', '2023-08-12 17:54:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2307, '拼团活动更新', 'promotion:combination-activity:update', 3, 3, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:04', '1', '2023-08-12 17:55:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2308, '拼团活动删除', 'promotion:combination-activity:delete', 3, 4, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:23', '1', '2023-08-12 17:55:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2309, '拼团活动关闭', 'promotion:combination-activity:close', 3, 5, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:37', '1', '2023-10-06 10:51:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2310, '砍价活动', '', 2, 4, 2030, 'bargain', 'ep:box', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:27:25', '1', '2023-08-13 00:27:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2311, '砍价商品', '', 2, 1, 2310, 'activity', 'ep:burger', 'mall/promotion/bargain/activity/index', 'PromotionBargainActivity', 0, '1', '1', '1', '1', '2023-08-13 00:28:49', '1', '2023-10-05 01:16:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2312, '砍价活动查询', 'promotion:bargain-activity:query', 3, 1, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:30', '1', '2023-08-13 00:32:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2313, '砍价活动创建', 'promotion:bargain-activity:create', 3, 2, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:44', '1', '2023-08-13 00:32:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2314, '砍价活动更新', 'promotion:bargain-activity:update', 3, 3, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:55', '1', '2023-08-13 00:32:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2315, '砍价活动删除', 'promotion:bargain-activity:delete', 3, 4, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:34:50', '1', '2023-08-13 00:34:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2316, '砍价活动关闭', 'promotion:bargain-activity:close', 3, 5, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:35:02', '1', '2023-08-13 00:35:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2317, '会员管理', '', 2, 0, 2262, 'user', 'ep:avatar', 'member/user/index', 'MemberUser', 0, '1', '1', '1', '', '2023-08-19 04:12:15', '1', '2023-08-24 00:50:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2318, '会员用户查询', 'member:user:query', 3, 1, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2319, '会员用户更新', 'member:user:update', 3, 3, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2320, '会员标签', '', 2, 1, 2262, 'tag', 'ep:collection-tag', 'member/tag/index', 'MemberTag', 0, '1', '1', '1', '', '2023-08-20 01:03:08', '1', '2023-08-20 09:23:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2321, '会员标签查询', 'member:tag:query', 3, 1, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2322, '会员标签创建', 'member:tag:create', 3, 2, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2323, '会员标签更新', 'member:tag:update', 3, 3, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2324, '会员标签删除', 'member:tag:delete', 3, 4, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2325, '会员等级', '', 2, 2, 2262, 'level', 'fa:level-up', 'member/level/index', 'MemberLevel', 0, '1', '1', '1', '', '2023-08-22 12:41:01', '1', '2023-08-22 21:47:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2326, '会员等级查询', 'member:level:query', 3, 1, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2327, '会员等级创建', 'member:level:create', 3, 2, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2328, '会员等级更新', 'member:level:update', 3, 3, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2329, '会员等级删除', 'member:level:delete', 3, 4, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2330, '会员分组', '', 2, 3, 2262, 'group', 'fa:group', 'member/group/index', 'MemberGroup', 0, '1', '1', '1', '', '2023-08-22 13:50:06', '1', '2023-10-01 23:42:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2331, '用户分组查询', 'member:group:query', 3, 1, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2332, '用户分组创建', 'member:group:create', 3, 2, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2333, '用户分组更新', 'member:group:update', 3, 3, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2334, '用户分组删除', 'member:group:delete', 3, 4, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2335, '用户等级修改', 'member:user:update-level', 3, 5, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-23 16:49:05', '', '2023-08-23 16:50:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2336, '商品评论', '', 2, 5, 2000, 'comment', 'ep:comment', 'mall/product/comment/index', 'ProductComment', 0, '1', '1', '1', '1', '2023-08-26 11:03:00', '1', '2023-08-26 11:03:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2337, '评论查询', 'product:comment:query', 3, 1, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:01', '1', '2023-08-26 11:04:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2338, '添加自评', 'product:comment:create', 3, 2, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:23', '1', '2023-08-26 11:08:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2339, '商家回复', 'product:comment:update', 3, 3, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:37', '1', '2023-08-26 11:04:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2340, '显隐评论', 'product:comment:update', 3, 4, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:55', '1', '2023-08-26 11:04:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2341, '优惠劵发送', 'promotion:coupon:send', 3, 2, 2038, '', '', '', '', 0, '1', '1', '1', '1', '2023-09-02 00:03:14', '1', '2023-09-02 00:03:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2342, '交易配置', '', 2, 0, 2072, 'config', 'ep:setting', 'mall/trade/config/index', 'TradeConfig', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:30:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2343, '交易中心配置查询', 'trade:config:query', 3, 1, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2344, '交易中心配置保存', 'trade:config:save', 3, 2, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2345, '分销管理', '', 1, 4, 2072, 'brokerage', 'fa-solid:project-diagram', '', '', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2023-09-28 10:58:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2346, '分销用户', '', 2, 0, 2345, 'brokerage-user', 'fa-solid:user-tie', 'mall/trade/brokerage/user/index', 'TradeBrokerageUser', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2347, '分销用户查询', 'trade:brokerage-user:query', 3, 1, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2348, '分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2349, '分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2350, '分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2351, '分销用户修改推广员', 'trade:brokerage-user:update-bind-user', 3, 5, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2352, '分销用户清除推广员', 'trade:brokerage-user:clear-bind-user', 3, 6, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2353, '佣金记录', '', 2, 1, 2345, 'brokerage-record', 'fa:money', 'mall/trade/brokerage/record/index', 'TradeBrokerageRecord', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2354, '佣金记录查询', 'trade:brokerage-record:query', 3, 1, 2353, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2355, '佣金提现', '', 2, 2, 2345, 'brokerage-withdraw', 'fa:credit-card', 'mall/trade/brokerage/withdraw/index', 'TradeBrokerageWithdraw', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2356, '佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2357, '佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2358, '统计中心', '', 1, 75, 2362, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2023-09-30 11:54:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2359, '交易统计', '', 2, 4, 2358, 'trade', 'fa-solid:credit-card', 'mall/statistics/trade/index', 'TradeStatistics', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2024-02-26 20:42:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2360, '交易统计查询', 'statistics:trade:query', 3, 1, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2361, '交易统计导出', 'statistics:trade:export', 3, 2, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2362, '商城系统', '', 1, 59, 0, '/mall', 'ep:shop', '', '', 0, '1', '1', '1', '1', '2023-09-30 11:52:02', '1', '2023-09-30 11:52:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2363, '用户积分修改', 'member:user:update-point', 3, 6, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-01 14:39:43', '', '2023-10-01 14:39:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2364, '用户余额修改', 'member:user:update-balance', 3, 7, 2317, '', '', '', '', 0, '1', '1', '1', '', '2023-10-01 14:39:43', '1', '2023-10-01 22:42:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2365, '优惠劵', '', 1, 2, 2030, 'coupon', 'fa-solid:disease', '', '', 0, '1', '1', '1', '1', '2023-10-03 12:39:15', '1', '2023-10-05 00:16:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2366, '砍价记录', '', 2, 2, 2310, 'record', 'ep:list', 'mall/promotion/bargain/record/index', 'PromotionBargainRecord', 0, '1', '1', '1', '', '2023-10-05 02:49:06', '1', '2023-10-05 10:50:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2367, '砍价记录查询', 'promotion:bargain-record:query', 3, 1, 2366, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-05 02:49:06', '', '2023-10-05 02:49:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2368, '助力记录查询', 'promotion:bargain-help:query', 3, 2, 2366, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-05 12:27:49', '1', '2023-10-05 12:27:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2369, '拼团记录', 'promotion:combination-record:query', 2, 2, 2303, 'record', 'ep:avatar', 'mall/promotion/combination/record/index.vue', 'PromotionCombinationRecord', 0, '1', '1', '1', '1', '2023-10-08 07:10:22', '1', '2023-10-08 07:34:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2374, '会员统计', '', 2, 2, 2358, 'member', 'ep:avatar', 'mall/statistics/member/index', 'MemberStatistics', 0, '1', '1', '1', '', '2023-10-11 04:39:24', '1', '2024-02-26 20:41:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2375, '会员统计查询', 'statistics:member:query', 3, 1, 2374, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-11 04:39:24', '', '2023-10-11 04:39:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2376, '订单核销', 'trade:order:pick-up', 3, 10, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-14 17:11:58', '1', '2023-10-14 17:11:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2377, '文章分类', '', 2, 0, 2387, 'article/category', 'fa:certificate', 'mall/promotion/article/category/index', 'ArticleCategory', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:38:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2378, '分类查询', 'promotion:article-category:query', 3, 1, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2379, '分类创建', 'promotion:article-category:create', 3, 2, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2380, '分类更新', 'promotion:article-category:update', 3, 3, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2381, '分类删除', 'promotion:article-category:delete', 3, 4, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2382, '文章列表', '', 2, 2, 2387, 'article', 'ep:connection', 'mall/promotion/article/index', 'Article', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:41:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2383, '文章管理查询', 'promotion:article:query', 3, 1, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2384, '文章管理创建', 'promotion:article:create', 3, 2, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2385, '文章管理更新', 'promotion:article:update', 3, 3, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2386, '文章管理删除', 'promotion:article:delete', 3, 4, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2387, '内容管理', '', 1, 1, 2030, 'content', 'ep:collection', '', '', 0, '1', '1', '1', '1', '2023-10-16 09:37:31', '1', '2023-10-16 09:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2388, '商城首页', '', 2, 1, 2362, 'home', 'ep:home-filled', 'mall/home/index', 'MallHome', 0, '1', '1', '1', '', '2023-10-16 12:10:33', '', '2023-10-16 12:10:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2389, '核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder', 0, '1', '1', '1', '', '2023-10-19 16:09:51', '', '2023-10-19 16:09:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2390, '优惠活动', '', 1, 99, 2030, 'youhui', 'ep:aim', '', '', 0, '1', '1', '1', '1', '2023-10-21 19:23:49', '1', '2023-10-21 19:23:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2391, '客户管理', '', 2, 10, 2397, 'customer', 'fa:address-book-o', 'crm/customer/index', 'CrmCustomer', 0, '1', '1', '1', '', '2023-10-29 09:04:21', '1', '2024-02-17 17:13:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2392, '客户查询', 'crm:customer:query', 3, 1, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2393, '客户创建', 'crm:customer:create', 3, 2, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2394, '客户更新', 'crm:customer:update', 3, 3, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2395, '客户删除', 'crm:customer:delete', 3, 4, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2396, '客户导出', 'crm:customer:export', 3, 5, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2397, 'CRM 系统', '', 1, 200, 0, '/crm', 'ep:avatar', '', '', 0, '1', '1', '1', '1', '2023-10-29 17:08:30', '1', '2024-02-04 15:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2398, '合同管理', '', 2, 50, 2397, 'contract', 'ep:notebook', 'crm/contract/index', 'CrmContract', 0, '1', '1', '1', '', '2023-10-29 10:50:41', '1', '2024-02-17 17:15:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2399, '合同查询', 'crm:contract:query', 3, 1, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2400, '合同创建', 'crm:contract:create', 3, 2, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2401, '合同更新', 'crm:contract:update', 3, 3, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2402, '合同删除', 'crm:contract:delete', 3, 4, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2403, '合同导出', 'crm:contract:export', 3, 5, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2404, '线索管理', '', 2, 8, 2397, 'clue', 'fa:pagelines', 'crm/clue/index', 'CrmClue', 0, '1', '1', '1', '', '2023-10-29 11:06:29', '1', '2024-02-17 17:15:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2405, '线索查询', 'crm:clue:query', 3, 1, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2406, '线索创建', 'crm:clue:create', 3, 2, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2407, '线索更新', 'crm:clue:update', 3, 3, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2408, '线索删除', 'crm:clue:delete', 3, 4, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2409, '线索导出', 'crm:clue:export', 3, 5, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2410, '商机管理', '', 2, 40, 2397, 'business', 'fa:bus', 'crm/business/index', 'CrmBusiness', 0, '1', '1', '1', '', '2023-10-29 11:12:35', '1', '2024-02-17 17:14:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2411, '商机查询', 'crm:business:query', 3, 1, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2412, '商机创建', 'crm:business:create', 3, 2, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2413, '商机更新', 'crm:business:update', 3, 3, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2414, '商机删除', 'crm:business:delete', 3, 4, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2415, '商机导出', 'crm:business:export', 3, 5, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2416, '联系人管理', '', 2, 20, 2397, 'contact', 'fa:address-book-o', 'crm/contact/index', 'CrmContact', 0, '1', '1', '1', '', '2023-10-29 11:14:56', '1', '2024-02-17 17:13:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2417, '联系人查询', 'crm:contact:query', 3, 1, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2418, '联系人创建', 'crm:contact:create', 3, 2, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2419, '联系人更新', 'crm:contact:update', 3, 3, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2420, '联系人删除', 'crm:contact:delete', 3, 4, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2421, '联系人导出', 'crm:contact:export', 3, 5, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2422, '回款管理', '', 2, 60, 2397, 'receivable', 'ep:money', 'crm/receivable/index', 'CrmReceivable', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2423, '回款管理查询', 'crm:receivable:query', 3, 1, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2424, '回款管理创建', 'crm:receivable:create', 3, 2, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2425, '回款管理更新', 'crm:receivable:update', 3, 3, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2426, '回款管理删除', 'crm:receivable:delete', 3, 4, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2427, '回款管理导出', 'crm:receivable:export', 3, 5, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2428, '回款计划', '', 2, 61, 2397, 'receivable-plan', 'fa:money', 'crm/receivable/plan/index', 'CrmReceivablePlan', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2429, '回款计划查询', 'crm:receivable-plan:query', 3, 1, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2430, '回款计划创建', 'crm:receivable-plan:create', 3, 2, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2431, '回款计划更新', 'crm:receivable-plan:update', 3, 3, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2432, '回款计划删除', 'crm:receivable-plan:delete', 3, 4, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2433, '回款计划导出', 'crm:receivable-plan:export', 3, 5, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2435, '商城装修', '', 2, 20, 2030, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2436, '装修模板', '', 2, 1, 2435, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2437, '装修模板查询', 'promotion:diy-template:query', 3, 1, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2438, '装修模板创建', 'promotion:diy-template:create', 3, 2, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2439, '装修模板更新', 'promotion:diy-template:update', 3, 3, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2440, '装修模板删除', 'promotion:diy-template:delete', 3, 4, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2441, '装修模板使用', 'promotion:diy-template:use', 3, 5, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2442, '装修页面', '', 2, 2, 2435, 'diy-page', 'foundation:page-edit', 'mall/promotion/diy/page/index', 'DiyPage', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2443, '装修页面查询', 'promotion:diy-page:query', 3, 1, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2444, '装修页面创建', 'promotion:diy-page:create', 3, 2, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2445, '装修页面更新', 'promotion:diy-page:update', 3, 3, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2446, '装修页面删除', 'promotion:diy-page:delete', 3, 4, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2447, '三方登录', '', 1, 10, 1, 'social', 'fa:rocket', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:12:01', '1', '2024-02-29 01:14:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2448, '三方应用', '', 2, 1, 2447, 'client', 'ep:set-up', 'views/system/social/client/index.vue', 'SocialClient', 0, '1', '1', '1', '1', '2023-11-04 12:17:19', '1', '2023-11-04 12:17:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2449, '三方应用查询', 'system:social-client:query', 3, 1, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:12', '1', '2023-11-04 12:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2450, '三方应用创建', 'system:social-client:create', 3, 2, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:58', '1', '2023-11-04 12:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2451, '三方应用更新', 'system:social-client:update', 3, 3, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:27', '1', '2023-11-04 12:44:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2452, '三方应用删除', 'system:social-client:delete', 3, 4, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:43', '1', '2023-11-04 12:44:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2453, '三方用户', 'system:social-user:query', 2, 2, 2447, 'user', 'ep:avatar', 'system/social/user/index.vue', 'SocialUser', 0, '1', '1', '1', '1', '2023-11-04 14:01:05', '1', '2023-11-04 14:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, '1', '1', '1', '', '2023-11-13 04:39:51', '1', '2023-11-16 23:53:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, '1', '1', '1', '', '2023-11-15 14:42:30', '1', '2023-11-16 20:34:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, '1', '1', '1', '', '2023-11-16 12:18:27', '1', '2023-11-16 20:35:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, '1', '1', '1', '', '2023-11-16 12:53:37', '1', '2023-11-16 23:10:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2497, '主子表(ERP)', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, '1', '1', '1', '', '2023-11-16 15:50:59', '1', '2023-11-17 13:19:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2516, '客户公海配置', '', 2, 0, 2524, 'customer-pool-config', 'ep:data-analysis', 'crm/customer/poolConfig/index', 'CrmCustomerPoolConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:31', '1', '2024-01-03 19:52:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2517, '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, 2516, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:31', '', '2023-11-18 13:33:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2518, '客户限制配置', '', 2, 1, 2524, 'customer-limit-config', 'ep:avatar', 'crm/customer/limitConfig/index', 'CrmCustomerLimitConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:53', '1', '2024-02-24 16:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2519, '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2520, '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2521, '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2522, '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2523, '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2524, '系统配置', '', 1, 999, 2397, 'config', 'ep:connection', '', '', 0, '1', '1', '1', '1', '2023-11-18 21:58:00', '1', '2024-02-17 17:14:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, '1', '1', '1', '1', '2023-11-23 19:41:55', '1', '2024-04-23 00:02:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2526, '产品管理', '', 2, 80, 2397, 'product', 'fa:product-hunt', 'crm/product/index', 'CrmProduct', 0, '1', '1', '1', '1', '2023-12-05 22:45:26', '1', '2024-02-20 20:36:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2527, '产品查询', 'crm:product:query', 3, 1, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:16', '1', '2023-12-05 22:47:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2528, '产品创建', 'crm:product:create', 3, 2, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:41', '1', '2023-12-05 22:47:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2529, '产品更新', 'crm:product:update', 3, 3, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:03', '1', '2023-12-05 22:48:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2530, '产品删除', 'crm:product:delete', 3, 4, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:17', '1', '2023-12-05 22:48:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2531, '产品导出', 'crm:product:export', 3, 5, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:29', '1', '2023-12-05 22:48:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2532, '产品分类配置', '', 2, 3, 2524, 'product/category', 'fa-solid:window-restore', 'crm/product/category/index', 'CrmProductCategory', 0, '1', '1', '1', '1', '2023-12-06 12:52:36', '1', '2023-12-06 12:52:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2533, '产品分类查询', 'crm:product-category:query', 3, 1, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:23', '1', '2023-12-06 12:53:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2534, '产品分类创建', 'crm:product-category:create', 3, 2, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:41', '1', '2023-12-06 12:53:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2535, '产品分类更新', 'crm:product-category:update', 3, 3, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:59', '1', '2023-12-06 12:53:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2536, '产品分类删除', 'crm:product-category:delete', 3, 4, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:54:14', '1', '2023-12-06 12:54:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2543, '关联商机', 'crm:contact:create-business', 3, 10, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:25', '1', '2024-01-02 17:28:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2544, '取关商机', 'crm:contact:delete-business', 3, 11, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:43', '1', '2024-01-02 17:28:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2545, '商品统计', '', 2, 3, 2358, 'product', 'fa:product-hunt', 'mall/statistics/product/index', 'ProductStatistics', 0, '1', '1', '1', '', '2023-12-15 18:54:28', '1', '2024-02-26 20:41:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2546, '客户公海', '', 2, 30, 2397, 'customer/pool', 'fa-solid:swimming-pool', 'crm/customer/pool/index', 'CrmCustomerPool', 0, '1', '1', '1', '1', '2024-01-15 21:29:34', '1', '2024-02-17 17:14:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2547, '订单查询', 'trade:order:query', 3, 1, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:00', '1', '2024-01-16 08:52:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2548, '订单更新', 'trade:order:update', 3, 2, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:21', '1', '2024-01-16 08:52:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2549, '支付&退款案例', '', 2, 1, 2161, 'order', 'fa:paypal', 'pay/demo/order/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:45:00', '1', '2024-01-18 23:47:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2550, '转账案例', '', 2, 2, 2161, 'transfer', 'fa:transgender-alt', 'pay/demo/transfer/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:51:16', '1', '2024-01-18 23:51:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2551, '钱包管理', '', 1, 4, 1117, 'wallet', 'ep:wallet', '', '', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '1', '2024-02-29 08:58:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2552, '充值套餐', '', 2, 2, 2551, 'wallet-recharge-package', 'fa:leaf', 'pay/wallet/rechargePackage/index', 'WalletRechargePackage', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2553, '钱包充值套餐查询', 'pay:wallet-recharge-package:query', 3, 1, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2554, '钱包充值套餐创建', 'pay:wallet-recharge-package:create', 3, 2, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2555, '钱包充值套餐更新', 'pay:wallet-recharge-package:update', 3, 3, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2556, '钱包充值套餐删除', 'pay:wallet-recharge-package:delete', 3, 4, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2557, '钱包余额', '', 2, 1, 2551, 'wallet-balance', 'fa:leaf', 'pay/wallet/balance/index', 'WalletBalance', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2558, '钱包余额查询', 'pay:wallet:query', 3, 1, 2557, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2559, '转账订单', '', 2, 3, 1117, 'transfer', 'ep:credit-card', 'pay/transfer/index', 'PayTransfer', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2560, '数据统计', '', 1, 200, 2397, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '1', '2024-01-26 22:50:35', '1', '2024-02-24 20:10:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2561, '排行榜', 'crm:statistics-rank:query', 2, 1, 2560, 'ranking', 'fa:area-chart', 'crm/statistics/rank/index', 'CrmStatisticsRank', 0, '1', '1', '1', '1', '2024-01-26 22:52:09', '1', '2024-04-24 19:39:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2562, '客户导入', 'crm:customer:import', 3, 6, 2391, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-01 13:09:00', '1', '2024-02-01 13:09:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2563, 'ERP 系统', '', 1, 300, 0, '/erp', 'fa-solid:store', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:37:25', '1', '2024-02-04 15:37:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2564, '产品管理', '', 1, 40, 2563, 'product', 'fa:product-hunt', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:38:43', '1', '2024-02-04 15:38:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2565, '产品信息', '', 2, 0, 2564, 'product', 'fa-solid:apple-alt', 'erp/product/product/index', 'ErpProduct', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-05 14:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2566, '产品查询', 'erp:product:query', 3, 1, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:21:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2567, '产品创建', 'erp:product:create', 3, 2, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2568, '产品更新', 'erp:product:update', 3, 3, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2569, '产品删除', 'erp:product:delete', 3, 4, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2570, '产品导出', 'erp:product:export', 3, 5, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2571, '产品分类', '', 2, 1, 2564, 'product-category', 'fa:certificate', 'erp/product/category/index', 'ErpProductCategory', 0, '1', '1', '1', '', '2024-02-04 09:21:04', '1', '2024-02-04 17:24:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2572, '分类查询', 'erp:product-category:query', 3, 1, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2573, '分类创建', 'erp:product-category:create', 3, 2, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2574, '分类更新', 'erp:product-category:update', 3, 3, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2575, '分类删除', 'erp:product-category:delete', 3, 4, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2576, '分类导出', 'erp:product-category:export', 3, 5, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2577, '产品单位', '', 2, 2, 2564, 'unit', 'ep:opportunity', 'erp/product/unit/index', 'ErpProductUnit', 0, '1', '1', '1', '', '2024-02-04 11:54:08', '1', '2024-02-04 19:54:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2578, '单位查询', 'erp:product-unit:query', 3, 1, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2579, '单位创建', 'erp:product-unit:create', 3, 2, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2580, '单位更新', 'erp:product-unit:update', 3, 3, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2581, '单位删除', 'erp:product-unit:delete', 3, 4, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2582, '单位导出', 'erp:product-unit:export', 3, 5, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2583, '库存管理', '', 1, 30, 2563, 'stock', 'fa:window-restore', '', '', 0, '1', '1', '1', '1', '2024-02-05 00:29:37', '1', '2024-02-05 00:29:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2584, '仓库信息', '', 2, 0, 2583, 'warehouse', 'ep:house', 'erp/stock/warehouse/index', 'ErpWarehouse', 0, '1', '1', '1', '', '2024-02-04 17:12:09', '1', '2024-02-05 01:12:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2585, '仓库查询', 'erp:warehouse:query', 3, 1, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2586, '仓库创建', 'erp:warehouse:create', 3, 2, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2587, '仓库更新', 'erp:warehouse:update', 3, 3, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2588, '仓库删除', 'erp:warehouse:delete', 3, 4, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2589, '仓库导出', 'erp:warehouse:export', 3, 5, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2590, '产品库存', '', 2, 1, 2583, 'stock', 'ep:coffee', 'erp/stock/stock/index', 'ErpStock', 0, '1', '1', '1', '', '2024-02-05 06:40:50', '1', '2024-02-05 14:42:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2591, '库存查询', 'erp:stock:query', 3, 1, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2592, '库存导出', 'erp:stock:export', 3, 5, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2593, '出入库明细', '', 2, 2, 2583, 'record', 'fa-solid:blog', 'erp/stock/record/index', 'ErpStockRecord', 0, '1', '1', '1', '', '2024-02-05 10:27:21', '1', '2024-02-06 17:26:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2594, '库存明细查询', 'erp:stock-record:query', 3, 1, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2595, '库存明细导出', 'erp:stock-record:export', 3, 5, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2596, '其它入库', '', 2, 3, 2583, 'in', 'ep:zoom-in', 'erp/stock/in/index', 'ErpStockIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2597, '其它入库单查询', 'erp:stock-in:query', 3, 1, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2598, '其它入库单创建', 'erp:stock-in:create', 3, 2, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2599, '其它入库单更新', 'erp:stock-in:update', 3, 3, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2600, '其它入库单删除', 'erp:stock-in:delete', 3, 4, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2601, '其它入库单导出', 'erp:stock-in:export', 3, 5, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2602, '采购管理', '', 1, 10, 2563, 'purchase', 'fa:buysellads', '', '', 0, '1', '1', '1', '1', '2024-02-06 16:01:01', '1', '2024-02-06 16:01:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2603, '供应商信息', '', 2, 4, 2602, 'supplier', 'fa:superpowers', 'erp/purchase/supplier/index', 'ErpSupplier', 0, '1', '1', '1', '', '2024-02-06 08:21:55', '1', '2024-02-06 16:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2604, '供应商查询', 'erp:supplier:query', 3, 1, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2605, '供应商创建', 'erp:supplier:create', 3, 2, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2606, '供应商更新', 'erp:supplier:update', 3, 3, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2607, '供应商删除', 'erp:supplier:delete', 3, 4, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2608, '供应商导出', 'erp:supplier:export', 3, 5, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2609, '其它入库单审批', 'erp:stock-in:update-status', 3, 6, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2610, '其它出库', '', 2, 4, 2583, 'out', 'ep:zoom-out', 'erp/stock/out/index', 'ErpStockOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2611, '其它出库单查询', 'erp:stock-out:query', 3, 1, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2612, '其它出库单创建', 'erp:stock-out:create', 3, 2, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2613, '其它出库单更新', 'erp:stock-out:update', 3, 3, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2614, '其它出库单删除', 'erp:stock-out:delete', 3, 4, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2615, '其它出库单导出', 'erp:stock-out:export', 3, 5, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2616, '其它出库单审批', 'erp:stock-out:update-status', 3, 6, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2617, '销售管理', '', 1, 20, 2563, 'sale', 'fa:sellsy', '', '', 0, '1', '1', '1', '1', '2024-02-07 15:12:32', '1', '2024-02-07 15:12:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2618, '客户信息', '', 2, 4, 2617, 'customer', 'ep:avatar', 'erp/sale/customer/index', 'ErpCustomer', 0, '1', '1', '1', '', '2024-02-07 07:21:45', '1', '2024-02-07 15:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2619, '客户查询', 'erp:customer:query', 3, 1, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2620, '客户创建', 'erp:customer:create', 3, 2, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2621, '客户更新', 'erp:customer:update', 3, 3, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2622, '客户删除', 'erp:customer:delete', 3, 4, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2623, '客户导出', 'erp:customer:export', 3, 5, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2624, '库存调拨', '', 2, 5, 2583, 'move', 'ep:folder-remove', 'erp/stock/move/index', 'ErpStockMove', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-16 18:53:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2625, '库存调度单查询', 'erp:stock-move:query', 3, 1, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2626, '库存调度单创建', 'erp:stock-move:create', 3, 2, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2627, '库存调度单更新', 'erp:stock-move:update', 3, 3, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2628, '库存调度单删除', 'erp:stock-move:delete', 3, 4, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2629, '库存调度单导出', 'erp:stock-move:export', 3, 5, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2630, '库存调度单审批', 'erp:stock-move:update-status', 3, 6, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2631, '库存盘点', '', 2, 6, 2583, 'check', 'ep:circle-check-filled', 'erp/stock/check/index', 'ErpStockCheck', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-08 08:31:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2632, '库存盘点单查询', 'erp:stock-check:query', 3, 1, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2633, '库存盘点单创建', 'erp:stock-check:create', 3, 2, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2634, '库存盘点单更新', 'erp:stock-check:update', 3, 3, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2635, '库存盘点单删除', 'erp:stock-check:delete', 3, 4, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2636, '库存盘点单导出', 'erp:stock-check:export', 3, 5, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2637, '库存盘点单审批', 'erp:stock-check:update-status', 3, 6, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2638, '销售订单', '', 2, 1, 2617, 'order', 'fa:first-order', 'erp/sale/order/index', 'ErpSaleOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 21:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2639, '销售订单查询', 'erp:sale-order:query', 3, 1, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2640, '销售订单创建', 'erp:sale-order:create', 3, 2, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2641, '销售订单更新', 'erp:sale-order:update', 3, 3, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2642, '销售订单删除', 'erp:sale-order:delete', 3, 4, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2643, '销售订单导出', 'erp:sale-order:export', 3, 5, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2644, '销售订单审批', 'erp:sale-order:update-status', 3, 6, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2645, '财务管理', '', 1, 50, 2563, 'finance', 'ep:money', '', '', 0, '1', '1', '1', '1', '2024-02-10 08:05:58', '1', '2024-02-10 08:06:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2646, '结算账户', '', 2, 10, 2645, 'account', 'fa:universal-access', 'erp/finance/account/index', 'ErpAccount', 0, '1', '1', '1', '', '2024-02-10 00:15:07', '1', '2024-02-14 08:24:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2647, '结算账户查询', 'erp:account:query', 3, 1, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2648, '结算账户创建', 'erp:account:create', 3, 2, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2649, '结算账户更新', 'erp:account:update', 3, 3, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2650, '结算账户删除', 'erp:account:delete', 3, 4, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2651, '结算账户导出', 'erp:account:export', 3, 5, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2652, '销售出库', '', 2, 2, 2617, 'out', 'ep:sold-out', 'erp/sale/out/index', 'ErpSaleOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 22:02:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2653, '销售出库查询', 'erp:sale-out:query', 3, 1, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2654, '销售出库创建', 'erp:sale-out:create', 3, 2, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2655, '销售出库更新', 'erp:sale-out:update', 3, 3, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2656, '销售出库删除', 'erp:sale-out:delete', 3, 4, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2657, '销售出库导出', 'erp:sale-out:export', 3, 5, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2658, '销售出库审批', 'erp:sale-out:update-status', 3, 6, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2659, '销售退货', '', 2, 3, 2617, 'return', 'fa-solid:bone', 'erp/sale/return/index', 'ErpSaleReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 06:12:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2660, '销售退货查询', 'erp:sale-return:query', 3, 1, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2661, '销售退货创建', 'erp:sale-return:create', 3, 2, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2662, '销售退货更新', 'erp:sale-return:update', 3, 3, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2663, '销售退货删除', 'erp:sale-return:delete', 3, 4, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2664, '销售退货导出', 'erp:sale-return:export', 3, 5, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2665, '销售退货审批', 'erp:sale-return:update-status', 3, 6, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2666, '采购订单', '', 2, 1, 2602, 'order', 'fa-solid:border-all', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 08:51:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2667, '采购订单查询', 'erp:purchase-order:query', 3, 1, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2668, '采购订单创建', 'erp:purchase-order:create', 3, 2, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2669, '采购订单更新', 'erp:purchase-order:update', 3, 3, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2670, '采购订单删除', 'erp:purchase-order:delete', 3, 4, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2671, '采购订单导出', 'erp:purchase-order:export', 3, 5, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2672, '采购订单审批', 'erp:purchase-order:update-status', 3, 6, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2673, '采购入库', '', 2, 2, 2602, 'in', 'fa-solid:gopuram', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 11:19:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2674, '采购入库查询', 'erp:purchase-in:query', 3, 1, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2675, '采购入库创建', 'erp:purchase-in:create', 3, 2, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2676, '采购入库更新', 'erp:purchase-in:update', 3, 3, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2677, '采购入库删除', 'erp:purchase-in:delete', 3, 4, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2678, '采购入库导出', 'erp:purchase-in:export', 3, 5, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2679, '采购入库审批', 'erp:purchase-in:update-status', 3, 6, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2680, '采购退货', '', 2, 3, 2602, 'return', 'ep:minus', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 20:51:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2681, '采购退货查询', 'erp:purchase-return:query', 3, 1, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2682, '采购退货创建', 'erp:purchase-return:create', 3, 2, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2683, '采购退货更新', 'erp:purchase-return:update', 3, 3, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2684, '采购退货删除', 'erp:purchase-return:delete', 3, 4, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2685, '采购退货导出', 'erp:purchase-return:export', 3, 5, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2686, '采购退货审批', 'erp:purchase-return:update-status', 3, 6, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2687, '付款单', '', 2, 1, 2645, 'payment', 'ep:caret-right', 'erp/finance/payment/index', 'ErpFinancePayment', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-14 08:24:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2688, '付款单查询', 'erp:finance-payment:query', 3, 1, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2689, '付款单创建', 'erp:finance-payment:create', 3, 2, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2690, '付款单更新', 'erp:finance-payment:update', 3, 3, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2691, '付款单删除', 'erp:finance-payment:delete', 3, 4, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2692, '付款单导出', 'erp:finance-payment:export', 3, 5, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2693, '付款单审批', 'erp:finance-payment:update-status', 3, 6, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2694, '收款单', '', 2, 2, 2645, 'receipt', 'ep:expand', 'erp/finance/receipt/index', 'ErpFinanceReceipt', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-15 19:35:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2695, '收款单查询', 'erp:finance-receipt:query', 3, 1, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2696, '收款单创建', 'erp:finance-receipt:create', 3, 2, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2697, '收款单更新', 'erp:finance-receipt:update', 3, 3, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2698, '收款单删除', 'erp:finance-receipt:delete', 3, 4, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2699, '收款单导出', 'erp:finance-receipt:export', 3, 5, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2700, '收款单审批', 'erp:finance-receipt:update-status', 3, 6, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2701, '待办事项', '', 2, 0, 2397, 'backlog', 'fa-solid:tasks', 'crm/backlog/index', 'CrmBacklog', 0, '1', '1', '1', '1', '2024-02-17 17:17:11', '1', '2024-02-17 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2702, 'ERP 首页', 'erp:statistics:query', 2, 0, 2563, 'home', 'ep:home-filled', 'erp/home/index.vue', 'ErpHome', 0, '1', '1', '1', '1', '2024-02-18 16:49:40', '1', '2024-02-26 21:12:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2703, '商机状态配置', '', 2, 4, 2524, 'business-status', 'fa-solid:charging-station', 'crm/business/status/index', 'CrmBusinessStatus', 0, '1', '1', '1', '1', '2024-02-21 20:15:17', '1', '2024-02-21 20:15:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2704, '商机状态查询', 'crm:business-status:query', 3, 1, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:36', '1', '2024-02-21 20:36:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2705, '商机状态创建', 'crm:business-status:create', 3, 2, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:57', '1', '2024-02-21 20:35:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2706, '商机状态更新', 'crm:business-status:update', 3, 3, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:21', '1', '2024-02-21 20:36:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2707, '商机状态删除', 'crm:business-status:delete', 3, 4, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:36', '1', '2024-02-21 20:36:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2708, '合同配置', '', 2, 5, 2524, 'contract-config', 'ep:connection', 'crm/contract/config/index', 'CrmContractConfig', 0, '1', '1', '1', '1', '2024-02-24 16:44:40', '1', '2024-02-24 16:44:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2709, '客户公海配置查询', 'crm:customer-pool-config:query', 3, 2, 2516, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:19', '1', '2024-02-24 16:45:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2710, '合同配置更新', 'crm:contract-config:update', 3, 1, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:56', '1', '2024-02-24 16:45:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2711, '合同配置查询', 'crm:contract-config:query', 3, 2, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:46:16', '1', '2024-02-24 16:46:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2712, '客户分析', 'crm:statistics-customer:query', 2, 0, 2560, 'customer', 'ep:avatar', 'views/crm/statistics/customer/index.vue', 'CrmStatisticsCustomer', 0, '1', '1', '1', '1', '2024-03-09 16:43:56', '1', '2024-04-24 19:42:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, '1', '1', '1', '1', '2024-03-17 21:50:23', '1', '2024-04-24 19:55:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-21 23:51:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, '1', '0', '1', '1', '2024-03-19 19:46:05', '1', '2024-03-23 19:03:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, '1', '1', '1', '1', '2024-03-21 23:57:30', '1', '2024-03-21 23:57:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:18:27', '1', '2024-03-22 08:19:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:19:25', '1', '2024-03-22 08:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, '1', '1', '1', '1', '2024-03-22 08:43:22', '1', '2024-03-22 08:43:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:43:49', '1', '2024-03-22 08:43:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, '1', '1', '1', '', '2024-03-09 16:05:34', '1', '2024-03-23 13:13:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, '1', '1', '1', '', '2024-03-09 22:35:08', '1', '2024-03-23 19:43:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2736, '员工业绩', 'crm:statistics-performance:query', 2, 3, 2560, 'performance', 'ep:dish-dot', 'crm/statistics/performance/index', 'CrmStatisticsPerformance', 0, '1', '1', '1', '1', '2024-04-05 13:49:20', '1', '2024-04-24 19:42:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2737, '客户画像', 'crm:statistics-portrait:query', 2, 4, 2560, 'portrait', 'ep:picture', 'crm/statistics/portrait/index', 'CrmStatisticsPortrait', 0, '1', '1', '1', '1', '2024-04-05 13:57:40', '1', '2024-04-24 19:42:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2738, '销售漏斗', 'crm:statistics-funnel:query', 2, 5, 2560, 'funnel', 'ep:grape', 'crm/statistics/funnel/index', 'CrmStatisticsFunnel', 0, '1', '1', '1', '1', '2024-04-13 10:53:26', '1', '2024-04-24 19:39:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2739, '消息中心', '', 1, 7, 1, 'messages', 'ep:chat-dot-round', '', '', 0, '1', '1', '1', '1', '2024-04-22 23:54:30', '1', '2024-04-23 09:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, '1', '1', '1', '1', '2024-04-23 00:04:44', '1', '2024-04-23 00:04:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2741, '领取公海客户', 'crm:customer:receive', 3, 1, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:47:45', '1', '2024-04-24 19:47:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2742, '分配公海客户', 'crm:customer:distribute', 3, 2, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:48:05', '1', '2024-04-24 19:48:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2743, '商品统计查询', 'statistics:product:query', 3, 1, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:05', '1', '2024-04-24 19:50:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2744, '商品统计导出', 'statistics:product:export', 3, 2, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:26', '1', '2024-04-24 19:50:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2745, '支付渠道查询', 'pay:channel:query', 3, 10, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:01', '1', '2024-04-24 19:53:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2746, '支付渠道创建', 'pay:channel:create', 3, 11, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:18', '1', '2024-04-24 19:53:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2747, '支付渠道更新', 'pay:channel:update', 3, 12, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:32', '1', '2024-04-24 19:53:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2748, '支付渠道删除', 'pay:channel:delete', 3, 13, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:54:34', '1', '2024-04-24 19:54:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2749, '商品收藏查询', 'product:favorite:query', 3, 10, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:55:47', '1', '2024-04-24 19:55:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2750, '商品浏览查询', 'product:browse-history:query', 3, 20, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:57:43', '1', '2024-04-24 19:57:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2751, '售后同意', 'trade:after-sale:agree', 3, 2, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:58:40', '1', '2024-04-24 19:58:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2752, '售后不同意', 'trade:after-sale:disagree', 3, 3, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:59:03', '1', '2024-04-24 19:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2753, '售后确认退货', 'trade:after-sale:receive', 3, 4, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:07', '1', '2024-04-24 20:00:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2754, '售后确认退款', 'trade:after-sale:refund', 3, 5, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:24', '1', '2024-04-24 20:00:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2755, '删除项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:01:37', '1', '2024-04-24 20:01:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2756, '会员等级记录查询', 'member:level-record:query', 3, 10, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:32', '1', '2024-04-24 20:02:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2757, '会员经验记录查询', 'member:experience-record:query', 3, 11, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:51', '1', '2024-04-24 20:02:51', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_menu_seq; +CREATE SEQUENCE system_menu_seq + START 2758; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS system_notice; +CREATE TABLE system_notice +( + id int8 NOT NULL, + title varchar(50) NOT NULL, + content text NOT NULL, + type int2 NOT NULL, + status int2 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notice + ADD CONSTRAINT pk_system_notice PRIMARY KEY (id); + +COMMENT ON COLUMN system_notice.id IS '公告ID'; +COMMENT ON COLUMN system_notice.title IS '公告标题'; +COMMENT ON COLUMN system_notice.content IS '公告内容'; +COMMENT ON COLUMN system_notice.type IS '公告类型(1通知 2公告)'; +COMMENT ON COLUMN system_notice.status IS '公告状态(0正常 1关闭)'; +COMMENT ON COLUMN system_notice.creator IS '创建者'; +COMMENT ON COLUMN system_notice.create_time IS '创建时间'; +COMMENT ON COLUMN system_notice.updater IS '更新者'; +COMMENT ON COLUMN system_notice.update_time IS '更新时间'; +COMMENT ON COLUMN system_notice.deleted IS '是否删除'; +COMMENT ON COLUMN system_notice.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notice IS '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '芋道的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '维护通知:2018-07-01 系统凌晨维护', '

11112222

', 2, 1, 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 20:07:26', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', '0', 121); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_notice_seq; +CREATE SEQUENCE system_notice_seq + START 5; + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_message; +CREATE TABLE system_notify_message +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + template_id int8 NOT NULL, + template_code varchar(64) NOT NULL, + template_nickname varchar(63) NOT NULL, + template_content varchar(1024) NOT NULL, + template_type int4 NOT NULL, + template_params varchar(255) NOT NULL, + read_status bool NOT NULL, + read_time timestamp NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notify_message + ADD CONSTRAINT pk_system_notify_message PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_message.id IS '用户ID'; +COMMENT ON COLUMN system_notify_message.user_id IS '用户id'; +COMMENT ON COLUMN system_notify_message.user_type IS '用户类型'; +COMMENT ON COLUMN system_notify_message.template_id IS '模版编号'; +COMMENT ON COLUMN system_notify_message.template_code IS '模板编码'; +COMMENT ON COLUMN system_notify_message.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_notify_message.template_content IS '模版内容'; +COMMENT ON COLUMN system_notify_message.template_type IS '模版类型'; +COMMENT ON COLUMN system_notify_message.template_params IS '模版参数'; +COMMENT ON COLUMN system_notify_message.read_status IS '是否已读'; +COMMENT ON COLUMN system_notify_message.read_time IS '阅读时间'; +COMMENT ON COLUMN system_notify_message.creator IS '创建者'; +COMMENT ON COLUMN system_notify_message.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_message.updater IS '更新者'; +COMMENT ON COLUMN system_notify_message.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_message.deleted IS '是否删除'; +COMMENT ON COLUMN system_notify_message.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notify_message IS '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:44:08', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:45:04', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 103, 2, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{"name":"哈哈"}', '0', NULL, '1', '2023-01-28 21:02:20', '1', '2023-01-28 21:02:20', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 22:21:42', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 22:22:07', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 1, 2, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{"name":"2","what":"3"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:45:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 1, 2, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{"name":"123"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:50:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-28 08:35:46","price":"0.09"}', '0', NULL, '1', '2023-09-28 16:36:22', '1', '2023-09-28 16:36:22', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-30 20:59:40","price":"1.00"}', '0', NULL, '1', '2023-10-03 12:11:34', '1', '2023-10-03 12:11:34', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_notify_message_seq; +CREATE SEQUENCE system_notify_message_seq + START 11; + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_template; +CREATE TABLE system_notify_template +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + code varchar(64) NOT NULL, + nickname varchar(255) NOT NULL, + content varchar(1024) NOT NULL, + type int2 NOT NULL, + params varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notify_template + ADD CONSTRAINT pk_system_notify_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_template.id IS '主键'; +COMMENT ON COLUMN system_notify_template.name IS '模板名称'; +COMMENT ON COLUMN system_notify_template.code IS '模版编码'; +COMMENT ON COLUMN system_notify_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_notify_template.content IS '模版内容'; +COMMENT ON COLUMN system_notify_template.type IS '类型'; +COMMENT ON COLUMN system_notify_template.params IS '参数数组'; +COMMENT ON COLUMN system_notify_template.status IS '状态'; +COMMENT ON COLUMN system_notify_template.remark IS '备注'; +COMMENT ON COLUMN system_notify_template.creator IS '创建者'; +COMMENT ON COLUMN system_notify_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_template.updater IS '更新者'; +COMMENT ON COLUMN system_notify_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_template.deleted IS '是否删除'; +COMMENT ON TABLE system_notify_template IS '站内信模板表'; + +DROP SEQUENCE IF EXISTS system_notify_template_seq; +CREATE SEQUENCE system_notify_template_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_access_token; +CREATE TABLE system_oauth2_access_token +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + user_info varchar(512) NOT NULL, + access_token varchar(255) NOT NULL, + refresh_token varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_access_token + ADD CONSTRAINT pk_system_oauth2_access_token PRIMARY KEY (id); + +CREATE INDEX idx_system_oauth2_access_token_01 ON system_oauth2_access_token (access_token); +CREATE INDEX idx_system_oauth2_access_token_02 ON system_oauth2_access_token (refresh_token); + +COMMENT ON COLUMN system_oauth2_access_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_access_token.user_info IS '用户信息'; +COMMENT ON COLUMN system_oauth2_access_token.access_token IS '访问令牌'; +COMMENT ON COLUMN system_oauth2_access_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_access_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_access_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_access_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_access_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_access_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_access_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_access_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_access_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_access_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_access_token IS 'OAuth2 访问令牌'; + +DROP SEQUENCE IF EXISTS system_oauth2_access_token_seq; +CREATE SEQUENCE system_oauth2_access_token_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_approve; +CREATE TABLE system_oauth2_approve +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + scope varchar(255) NULL DEFAULT '', + approved bool NOT NULL DEFAULT '0', + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_approve + ADD CONSTRAINT pk_system_oauth2_approve PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_approve.id IS '编号'; +COMMENT ON COLUMN system_oauth2_approve.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_approve.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_approve.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_approve.scope IS '授权范围'; +COMMENT ON COLUMN system_oauth2_approve.approved IS '是否接受'; +COMMENT ON COLUMN system_oauth2_approve.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_approve.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_approve.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_approve.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_approve.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_approve.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_approve.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_approve IS 'OAuth2 批准表'; + +DROP SEQUENCE IF EXISTS system_oauth2_approve_seq; +CREATE SEQUENCE system_oauth2_approve_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_client; +CREATE TABLE system_oauth2_client +( + id int8 NOT NULL, + client_id varchar(255) NOT NULL, + secret varchar(255) NOT NULL, + name varchar(255) NOT NULL, + logo varchar(255) NOT NULL, + description varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + access_token_validity_seconds int4 NOT NULL, + refresh_token_validity_seconds int4 NOT NULL, + redirect_uris varchar(255) NOT NULL, + authorized_grant_types varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + auto_approve_scopes varchar(255) NULL DEFAULT NULL, + authorities varchar(255) NULL DEFAULT NULL, + resource_ids varchar(255) NULL DEFAULT NULL, + additional_information varchar(4096) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_client + ADD CONSTRAINT pk_system_oauth2_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_client.id IS '编号'; +COMMENT ON COLUMN system_oauth2_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_client.secret IS '客户端密钥'; +COMMENT ON COLUMN system_oauth2_client.name IS '应用名'; +COMMENT ON COLUMN system_oauth2_client.logo IS '应用图标'; +COMMENT ON COLUMN system_oauth2_client.description IS '应用描述'; +COMMENT ON COLUMN system_oauth2_client.status IS '状态'; +COMMENT ON COLUMN system_oauth2_client.access_token_validity_seconds IS '访问令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.refresh_token_validity_seconds IS '刷新令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.redirect_uris IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_client.authorized_grant_types IS '授权类型'; +COMMENT ON COLUMN system_oauth2_client.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_client.auto_approve_scopes IS '自动通过的授权范围'; +COMMENT ON COLUMN system_oauth2_client.authorities IS '权限'; +COMMENT ON COLUMN system_oauth2_client.resource_ids IS '资源'; +COMMENT ON COLUMN system_oauth2_client.additional_information IS '附加信息'; +COMMENT ON COLUMN system_oauth2_client.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_client.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_client.deleted IS '是否删除'; +COMMENT ON TABLE system_oauth2_client IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 2592000, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', '[]', '["user.read","user.write"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2024-02-22 16:31:52', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', '啦啦啦啦', 0, 1800, 43200, '["https://www.iocoder.cn"]', '["password","authorization_code","implicit"]', '["user_info","projects"]', '["user_info"]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2023-12-02 21:01:01', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["authorization_code","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-09-29 13:28:31', '1', '2022-09-29 13:28:31', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["password","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-10-04 17:40:16', '1', '2022-10-04 20:31:21', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_oauth2_client_seq; +CREATE SEQUENCE system_oauth2_client_seq + START 43; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_code; +CREATE TABLE system_oauth2_code +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + code varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT '', + expires_time timestamp NOT NULL, + redirect_uri varchar(255) NULL DEFAULT NULL, + state varchar(255) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_code + ADD CONSTRAINT pk_system_oauth2_code PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_code.id IS '编号'; +COMMENT ON COLUMN system_oauth2_code.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_code.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_code.code IS '授权码'; +COMMENT ON COLUMN system_oauth2_code.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_code.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_code.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_code.redirect_uri IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_code.state IS '状态'; +COMMENT ON COLUMN system_oauth2_code.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_code.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_code IS 'OAuth2 授权码表'; + +DROP SEQUENCE IF EXISTS system_oauth2_code_seq; +CREATE SEQUENCE system_oauth2_code_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_refresh_token; +CREATE TABLE system_oauth2_refresh_token +( + id int8 NOT NULL, + user_id int8 NOT NULL, + refresh_token varchar(32) NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_refresh_token + ADD CONSTRAINT pk_system_oauth2_refresh_token PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_refresh_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_refresh_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_refresh_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_refresh_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_refresh_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_refresh_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_refresh_token IS 'OAuth2 刷新令牌'; + +DROP SEQUENCE IF EXISTS system_oauth2_refresh_token_seq; +CREATE SEQUENCE system_oauth2_refresh_token_seq + START 1; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS system_operate_log; +CREATE TABLE system_operate_log +( + id int8 NOT NULL, + trace_id varchar(64) NULL DEFAULT '', + user_id int8 NOT NULL, + user_type int2 NOT NULL DEFAULT 0, + type varchar(50) NOT NULL, + sub_type varchar(50) NOT NULL, + biz_id int8 NOT NULL, + action varchar(2000) NULL DEFAULT '', + extra varchar(2000) NULL DEFAULT '', + request_method varchar(16) NULL DEFAULT '', + request_url varchar(255) NULL DEFAULT '', + user_ip varchar(50) NULL DEFAULT NULL, + user_agent varchar(200) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_operate_log + ADD CONSTRAINT pk_system_operate_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_operate_log.id IS '日志主键'; +COMMENT ON COLUMN system_operate_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_operate_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_operate_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_operate_log.type IS '操作模块类型'; +COMMENT ON COLUMN system_operate_log.sub_type IS '操作名'; +COMMENT ON COLUMN system_operate_log.biz_id IS '操作数据模块编号'; +COMMENT ON COLUMN system_operate_log.action IS '操作内容'; +COMMENT ON COLUMN system_operate_log.extra IS '拓展字段'; +COMMENT ON COLUMN system_operate_log.request_method IS '请求方法名'; +COMMENT ON COLUMN system_operate_log.request_url IS '请求地址'; +COMMENT ON COLUMN system_operate_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_operate_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_operate_log.creator IS '创建者'; +COMMENT ON COLUMN system_operate_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_operate_log.updater IS '更新者'; +COMMENT ON COLUMN system_operate_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_operate_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_operate_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_operate_log IS '操作日志记录 V2 版本'; + +DROP SEQUENCE IF EXISTS system_operate_log_seq; +CREATE SEQUENCE system_operate_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS system_post; +CREATE TABLE system_post +( + id int8 NOT NULL, + code varchar(64) NOT NULL, + name varchar(50) NOT NULL, + sort int4 NOT NULL, + status int2 NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_post + ADD CONSTRAINT pk_system_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_post.id IS '岗位ID'; +COMMENT ON COLUMN system_post.code IS '岗位编码'; +COMMENT ON COLUMN system_post.name IS '岗位名称'; +COMMENT ON COLUMN system_post.sort IS '显示顺序'; +COMMENT ON COLUMN system_post.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_post.remark IS '备注'; +COMMENT ON COLUMN system_post.creator IS '创建者'; +COMMENT ON COLUMN system_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_post.updater IS '更新者'; +COMMENT ON COLUMN system_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_post IS '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2023-02-11 15:19:04', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 09:18:20', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 10:04:37', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 'HR', '人力资源', 5, 0, '', '1', '2024-03-24 20:45:40', '1', '2024-03-24 20:45:40', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_post_seq; +CREATE SEQUENCE system_post_seq + START 6; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS system_role; +CREATE TABLE system_role +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + code varchar(100) NOT NULL, + sort int4 NOT NULL, + data_scope int2 NOT NULL DEFAULT 1, + data_scope_dept_ids varchar(500) NULL DEFAULT '', + status int2 NOT NULL, + type int2 NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_role + ADD CONSTRAINT pk_system_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_role.id IS '角色ID'; +COMMENT ON COLUMN system_role.name IS '角色名称'; +COMMENT ON COLUMN system_role.code IS '角色权限字符串'; +COMMENT ON COLUMN system_role.sort IS '显示顺序'; +COMMENT ON COLUMN system_role.data_scope IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT ON COLUMN system_role.data_scope_dept_ids IS '数据范围(指定部门数组)'; +COMMENT ON COLUMN system_role.status IS '角色状态(0正常 1停用)'; +COMMENT ON COLUMN system_role.type IS '角色类型'; +COMMENT ON COLUMN system_role.remark IS '备注'; +COMMENT ON COLUMN system_role.creator IS '创建者'; +COMMENT ON COLUMN system_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_role.updater IS '更新者'; +COMMENT ON COLUMN system_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role IS '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '我想测试', '', '2021-01-06 13:49:35', '1', '2024-03-24 22:22:45', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_role_seq; +CREATE SEQUENCE system_role_seq + START 112; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_role_menu; +CREATE TABLE system_role_menu +( + id int8 NOT NULL, + role_id int8 NOT NULL, + menu_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_role_menu + ADD CONSTRAINT pk_system_role_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_role_menu.id IS '自增编号'; +COMMENT ON COLUMN system_role_menu.role_id IS '角色ID'; +COMMENT ON COLUMN system_role_menu.menu_id IS '菜单ID'; +COMMENT ON COLUMN system_role_menu.creator IS '创建者'; +COMMENT ON COLUMN system_role_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_role_menu.updater IS '更新者'; +COMMENT ON COLUMN system_role_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_role_menu.deleted IS '是否删除'; +COMMENT ON COLUMN system_role_menu.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role_menu IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1626, 101, 1196, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1729, 109, 100, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1730, 109, 101, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1731, 109, 1063, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1732, 109, 1064, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1733, 109, 1001, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1734, 109, 1065, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1735, 109, 1002, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1736, 109, 1003, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1737, 109, 1004, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1738, 109, 1005, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1739, 109, 1006, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1740, 109, 1007, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1741, 109, 1008, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1742, 109, 1009, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1743, 109, 1010, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1744, 109, 1011, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1745, 109, 1012, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1746, 111, 100, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1747, 111, 101, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1748, 111, 1063, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1749, 111, 1064, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1750, 111, 1001, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1751, 111, 1065, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1752, 111, 1002, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1753, 111, 1003, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1754, 111, 1004, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1755, 111, 1005, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1756, 111, 1006, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1757, 111, 1007, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1758, 111, 1008, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1759, 111, 1009, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1760, 111, 1010, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1761, 111, 1011, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1762, 111, 1012, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1763, 109, 100, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1764, 109, 101, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1765, 109, 1063, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1766, 109, 1064, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1767, 109, 1001, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1768, 109, 1065, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1769, 109, 1002, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1770, 109, 1003, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1771, 109, 1004, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1772, 109, 1005, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1773, 109, 1006, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1774, 109, 1007, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1775, 109, 1008, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1776, 109, 1009, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1777, 109, 1010, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1778, 109, 1011, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1779, 109, 1012, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1780, 111, 100, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1781, 111, 101, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1782, 111, 1063, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1783, 111, 1064, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1784, 111, 1001, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1785, 111, 1065, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1786, 111, 1002, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1787, 111, 1003, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1788, 111, 1004, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1789, 111, 1005, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1790, 111, 1006, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1791, 111, 1007, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1792, 111, 1008, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1793, 111, 1009, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1794, 111, 1010, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1795, 111, 1011, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1796, 111, 1012, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1797, 109, 100, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1798, 109, 101, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1799, 109, 1063, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1800, 109, 1064, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1801, 109, 1001, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1802, 109, 1065, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1803, 109, 1002, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1804, 109, 1003, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1805, 109, 1004, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1806, 109, 1005, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1807, 109, 1006, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1808, 109, 1007, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1809, 109, 1008, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1810, 109, 1009, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1811, 109, 1010, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1812, 109, 1011, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1813, 109, 1012, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1814, 111, 100, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1815, 111, 101, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1816, 111, 1063, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1817, 111, 1064, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1818, 111, 1001, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1819, 111, 1065, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1820, 111, 1002, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1821, 111, 1003, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1822, 111, 1004, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1823, 111, 1005, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1824, 111, 1006, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1825, 111, 1007, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1826, 111, 1008, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1827, 111, 1009, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1828, 111, 1010, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1829, 111, 1011, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1830, 111, 1012, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1831, 109, 103, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1832, 109, 1017, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1833, 109, 1018, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1834, 109, 1019, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1835, 109, 1020, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1836, 111, 103, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1837, 111, 1017, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1838, 111, 1018, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1839, 111, 1019, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1840, 111, 1020, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1841, 109, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1842, 109, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1843, 109, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1844, 109, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1845, 109, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1846, 111, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1847, 111, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1848, 111, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1849, 111, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1850, 111, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2003, 2, 1036, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2004, 2, 1037, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2005, 2, 1038, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2006, 2, 1039, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2013, 2, 1050, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2014, 2, 1051, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2015, 2, 1052, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2016, 2, 1053, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2017, 2, 1054, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2018, 2, 1056, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2019, 2, 1057, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2020, 2, 1058, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2022, 2, 1059, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2023, 2, 1060, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2034, 2, 1075, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2039, 2, 1087, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2044, 2, 1095, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2045, 2, 1096, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2046, 2, 1097, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2047, 2, 1098, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2048, 2, 1101, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2049, 2, 1102, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2050, 2, 1103, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2051, 2, 1104, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2052, 2, 1105, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2053, 2, 1106, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2054, 2, 1108, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2055, 2, 1109, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2061, 2, 1127, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2069, 2, 1135, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2070, 2, 1136, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2071, 2, 1137, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2073, 2, 1139, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2074, 2, 115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2075, 2, 1140, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2077, 2, 1141, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2078, 2, 1142, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2079, 2, 1143, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2080, 2, 1150, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2081, 2, 1161, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2082, 2, 1162, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2083, 2, 1163, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2084, 2, 1164, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2085, 2, 1165, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2086, 2, 1166, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2087, 2, 1173, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2088, 2, 1174, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2089, 2, 1175, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2102, 2, 1229, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2116, 2, 1254, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2117, 2, 1255, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2118, 2, 1256, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2119, 2, 1257, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2120, 2, 1258, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2121, 2, 1259, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2122, 2, 1260, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2142, 2, 1014, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2144, 2, 1016, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2152, 2, 1281, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2153, 2, 1282, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2154, 2, 2000, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2155, 2, 2002, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2156, 2, 2003, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2157, 2, 2004, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2158, 2, 2005, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2159, 2, 2006, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2160, 2, 2008, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2161, 2, 2009, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2162, 2, 2010, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2163, 2, 2011, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2164, 2, 2012, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2170, 2, 2019, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2171, 2, 2020, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2172, 2, 2021, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2173, 2, 2022, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2174, 2, 2023, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2175, 2, 2025, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2177, 2, 2027, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2178, 2, 2028, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2179, 2, 2029, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2180, 2, 2014, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2181, 2, 2015, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2182, 2, 2016, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2183, 2, 2017, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2184, 2, 2018, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2188, 101, 1024, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2189, 101, 1, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2190, 101, 1025, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2191, 101, 1026, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2192, 101, 1027, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2193, 101, 1028, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2194, 101, 1029, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2195, 101, 1030, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2196, 101, 1036, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2197, 101, 1037, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2198, 101, 1038, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2199, 101, 1039, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2200, 101, 1040, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2201, 101, 1042, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2202, 101, 1043, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2203, 101, 1045, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2204, 101, 1046, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2205, 101, 1048, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2206, 101, 2083, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2207, 101, 1063, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2208, 101, 1064, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2209, 101, 1065, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2210, 101, 1093, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2211, 101, 1094, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2212, 101, 1095, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2213, 101, 1096, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2214, 101, 1097, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2215, 101, 1098, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2216, 101, 1100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2217, 101, 1101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2218, 101, 1102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2219, 101, 1103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2220, 101, 1104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2221, 101, 1105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2222, 101, 1106, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2223, 101, 2130, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2224, 101, 1107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2225, 101, 2131, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2226, 101, 1108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2227, 101, 2132, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2228, 101, 1109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2229, 101, 2133, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2230, 101, 2134, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2232, 101, 2135, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2234, 101, 2136, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2236, 101, 2137, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2238, 101, 2138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2240, 101, 2139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2242, 101, 2140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2243, 101, 2141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2244, 101, 2142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2245, 101, 2143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2246, 101, 2144, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2247, 101, 2145, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2248, 101, 2146, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2249, 101, 2147, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2250, 101, 100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2251, 101, 2148, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2252, 101, 101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2253, 101, 2149, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2254, 101, 102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2255, 101, 2150, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2256, 101, 103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2257, 101, 2151, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2258, 101, 104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2259, 101, 2152, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2260, 101, 105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2261, 101, 107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2262, 101, 108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2263, 101, 109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2264, 101, 1138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2265, 101, 1139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2266, 101, 1140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2267, 101, 1141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2268, 101, 1142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2269, 101, 1143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2270, 101, 1224, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2271, 101, 1225, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2272, 101, 1226, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2273, 101, 1227, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2274, 101, 1228, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2275, 101, 1229, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2282, 101, 1261, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2283, 101, 1263, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2284, 101, 1264, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2285, 101, 1265, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2286, 101, 1266, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2287, 101, 1267, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2288, 101, 1001, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2289, 101, 1002, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2290, 101, 1003, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2291, 101, 1004, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2292, 101, 1005, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2293, 101, 1006, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2294, 101, 1007, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2295, 101, 1008, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2296, 101, 1009, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2297, 101, 1010, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2298, 101, 1011, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2299, 101, 1012, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2300, 101, 500, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2301, 101, 1013, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2302, 101, 501, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2303, 101, 1014, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2304, 101, 1015, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2305, 101, 1016, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2306, 101, 1017, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2307, 101, 1018, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2308, 101, 1019, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2309, 101, 1020, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2310, 101, 1021, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2311, 101, 1022, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2312, 101, 1023, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2929, 109, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2930, 109, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2931, 109, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2932, 109, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2933, 109, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2934, 109, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2935, 109, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2936, 109, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2937, 109, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2938, 109, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2939, 109, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2940, 109, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2941, 111, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2942, 111, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2943, 111, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2944, 111, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2945, 111, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2946, 111, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2947, 111, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2948, 111, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2949, 111, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2950, 111, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2951, 111, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2952, 111, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2993, 109, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2994, 109, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2995, 109, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2996, 109, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2997, 109, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2998, 109, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2999, 109, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3000, 109, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3001, 109, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3002, 109, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3003, 109, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3004, 109, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3005, 109, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3006, 109, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3007, 109, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3008, 109, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3009, 109, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3013, 109, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3017, 109, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3018, 109, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3019, 109, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3020, 109, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3021, 109, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3022, 109, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3023, 109, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3024, 109, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3025, 109, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3026, 109, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3027, 109, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3028, 109, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3029, 109, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3030, 109, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3031, 109, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3032, 109, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3033, 109, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3034, 109, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3035, 109, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3036, 109, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3037, 109, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3038, 109, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3039, 109, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3040, 109, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3041, 109, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3042, 109, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3043, 109, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3044, 109, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3045, 109, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3046, 109, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3047, 109, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3048, 109, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3049, 109, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3050, 109, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3051, 109, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3052, 109, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3053, 109, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3054, 109, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3055, 109, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3056, 109, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3057, 109, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3058, 109, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3059, 109, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3060, 109, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3061, 109, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3062, 109, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3063, 109, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3064, 109, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3065, 109, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3066, 109, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3067, 109, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3068, 109, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3069, 111, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3070, 111, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3071, 111, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3072, 111, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3073, 111, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3074, 111, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3075, 111, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3076, 111, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3077, 111, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3078, 111, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3079, 111, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3080, 111, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3081, 111, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3082, 111, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3083, 111, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3084, 111, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3085, 111, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3089, 111, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3093, 111, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3094, 111, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3095, 111, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3096, 111, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3097, 111, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3098, 111, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3099, 111, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3100, 111, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3101, 111, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3102, 111, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3103, 111, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3104, 111, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3105, 111, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3106, 111, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3107, 111, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3108, 111, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3109, 111, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3110, 111, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3111, 111, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3112, 111, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3113, 111, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3114, 111, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3115, 111, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3116, 111, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3117, 111, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3118, 111, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3119, 111, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3120, 111, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3121, 111, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3122, 111, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3123, 111, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3124, 111, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3125, 111, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3126, 111, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3127, 111, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3128, 111, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3129, 111, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3130, 111, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3131, 111, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3132, 111, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3133, 111, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3134, 111, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3135, 111, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3136, 111, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3137, 111, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3138, 111, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3139, 111, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3140, 111, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3141, 111, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3142, 111, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3143, 111, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3144, 111, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3221, 109, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3222, 109, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3223, 109, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3224, 109, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3225, 109, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3226, 111, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3227, 111, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3228, 111, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3229, 111, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3230, 111, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4163, 109, 5, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4164, 109, 1118, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4165, 109, 1119, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4166, 109, 1120, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4167, 109, 2713, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4168, 109, 2714, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4169, 109, 2715, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4170, 109, 2716, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4171, 109, 2717, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4172, 109, 2718, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4173, 109, 2720, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4174, 109, 1185, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4175, 109, 2721, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4176, 109, 1186, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4177, 109, 2722, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4178, 109, 1187, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4179, 109, 2723, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4180, 109, 1188, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4181, 109, 2724, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4182, 109, 1189, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4183, 109, 2725, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4184, 109, 1190, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4185, 109, 2726, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4186, 109, 1191, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4187, 109, 2727, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4188, 109, 1192, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4189, 109, 2728, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4190, 109, 1193, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4191, 109, 2729, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4192, 109, 1194, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4193, 109, 2730, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4194, 109, 1195, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4195, 109, 2731, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4196, 109, 1196, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4197, 109, 2732, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4198, 109, 1197, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4199, 109, 2733, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4200, 109, 1198, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4201, 109, 2734, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4202, 109, 1199, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4203, 109, 2735, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4204, 109, 1200, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4205, 109, 1201, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4206, 109, 1202, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4207, 109, 1207, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4208, 109, 1208, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4209, 109, 1209, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4210, 109, 1210, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4211, 109, 1211, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4212, 109, 1212, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4213, 109, 1213, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4214, 109, 1215, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4215, 109, 1216, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4216, 109, 1217, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4217, 109, 1218, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4218, 109, 1219, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4219, 109, 1220, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4220, 109, 1221, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4221, 109, 1222, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4222, 111, 5, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4223, 111, 1118, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4224, 111, 1119, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4225, 111, 1120, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4226, 111, 2713, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4227, 111, 2714, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4228, 111, 2715, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4229, 111, 2716, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4230, 111, 2717, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4231, 111, 2718, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4232, 111, 2720, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4233, 111, 1185, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4234, 111, 2721, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4235, 111, 1186, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4236, 111, 2722, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4237, 111, 1187, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4238, 111, 2723, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4239, 111, 1188, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4240, 111, 2724, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4241, 111, 1189, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4242, 111, 2725, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4243, 111, 1190, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4244, 111, 2726, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4245, 111, 1191, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4246, 111, 2727, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4247, 111, 1192, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4248, 111, 2728, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4249, 111, 1193, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4250, 111, 2729, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4251, 111, 1194, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4252, 111, 2730, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4253, 111, 1195, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4254, 111, 2731, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4255, 111, 1196, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4256, 111, 2732, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4257, 111, 1197, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4258, 111, 2733, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4259, 111, 1198, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4260, 111, 2734, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4261, 111, 1199, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4262, 111, 2735, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4263, 111, 1200, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4264, 111, 1201, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4265, 111, 1202, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4266, 111, 1207, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4267, 111, 1208, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4268, 111, 1209, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4269, 111, 1210, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4270, 111, 1211, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4271, 111, 1212, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4272, 111, 1213, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4273, 111, 1215, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4274, 111, 1216, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4275, 111, 1217, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4276, 111, 1218, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4277, 111, 1219, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4278, 111, 1220, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4279, 111, 1221, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_role_menu_seq; +CREATE SEQUENCE system_role_menu_seq + START 5779; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_channel; +CREATE TABLE system_sms_channel +( + id int8 NOT NULL, + signature varchar(12) NOT NULL, + code varchar(63) NOT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + api_key varchar(128) NOT NULL, + api_secret varchar(128) NULL DEFAULT NULL, + callback_url varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_channel + ADD CONSTRAINT pk_system_sms_channel PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_channel.id IS '编号'; +COMMENT ON COLUMN system_sms_channel.signature IS '短信签名'; +COMMENT ON COLUMN system_sms_channel.code IS '渠道编码'; +COMMENT ON COLUMN system_sms_channel.status IS '开启状态'; +COMMENT ON COLUMN system_sms_channel.remark IS '备注'; +COMMENT ON COLUMN system_sms_channel.api_key IS '短信 API 的账号'; +COMMENT ON COLUMN system_sms_channel.api_secret IS '短信 API 的秘钥'; +COMMENT ON COLUMN system_sms_channel.callback_url IS '短信发送回调 URL'; +COMMENT ON COLUMN system_sms_channel.creator IS '创建者'; +COMMENT ON COLUMN system_sms_channel.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_channel.updater IS '更新者'; +COMMENT ON COLUMN system_sms_channel.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_channel.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_channel IS '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2023-12-02 22:10:17', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, '仅测试', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2022-04-10 23:07:59', '1', '2023-12-02 22:10:08', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_sms_channel_seq; +CREATE SEQUENCE system_sms_channel_seq + START 7; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_code; +CREATE TABLE system_sms_code +( + id int8 NOT NULL, + mobile varchar(11) NOT NULL, + code varchar(6) NOT NULL, + create_ip varchar(15) NOT NULL, + scene int2 NOT NULL, + today_index int2 NOT NULL, + used int2 NOT NULL, + used_time timestamp NULL DEFAULT NULL, + used_ip varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_code + ADD CONSTRAINT pk_system_sms_code PRIMARY KEY (id); + +CREATE INDEX idx_system_sms_code_01 ON system_sms_code (mobile); + +COMMENT ON COLUMN system_sms_code.id IS '编号'; +COMMENT ON COLUMN system_sms_code.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_code.code IS '验证码'; +COMMENT ON COLUMN system_sms_code.create_ip IS '创建 IP'; +COMMENT ON COLUMN system_sms_code.scene IS '发送场景'; +COMMENT ON COLUMN system_sms_code.today_index IS '今日发送的第几条'; +COMMENT ON COLUMN system_sms_code.used IS '是否使用'; +COMMENT ON COLUMN system_sms_code.used_time IS '使用时间'; +COMMENT ON COLUMN system_sms_code.used_ip IS '使用 IP'; +COMMENT ON COLUMN system_sms_code.creator IS '创建者'; +COMMENT ON COLUMN system_sms_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_code.updater IS '更新者'; +COMMENT ON COLUMN system_sms_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_sms_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_sms_code IS '手机验证码'; + +DROP SEQUENCE IF EXISTS system_sms_code_seq; +CREATE SEQUENCE system_sms_code_seq + START 1; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_log; +CREATE TABLE system_sms_log +( + id int8 NOT NULL, + channel_id int8 NOT NULL, + channel_code varchar(63) NOT NULL, + template_id int8 NOT NULL, + template_code varchar(63) NOT NULL, + template_type int2 NOT NULL, + template_content varchar(255) NOT NULL, + template_params varchar(255) NOT NULL, + api_template_id varchar(63) NOT NULL, + mobile varchar(11) NOT NULL, + user_id int8 NULL DEFAULT NULL, + user_type int2 NULL DEFAULT NULL, + send_status int2 NOT NULL DEFAULT 0, + send_time timestamp NULL DEFAULT NULL, + api_send_code varchar(63) NULL DEFAULT NULL, + api_send_msg varchar(255) NULL DEFAULT NULL, + api_request_id varchar(255) NULL DEFAULT NULL, + api_serial_no varchar(255) NULL DEFAULT NULL, + receive_status int2 NOT NULL DEFAULT 0, + receive_time timestamp NULL DEFAULT NULL, + api_receive_code varchar(63) NULL DEFAULT NULL, + api_receive_msg varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_log + ADD CONSTRAINT pk_system_sms_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_log.id IS '编号'; +COMMENT ON COLUMN system_sms_log.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_log.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_sms_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_sms_log.template_type IS '短信类型'; +COMMENT ON COLUMN system_sms_log.template_content IS '短信内容'; +COMMENT ON COLUMN system_sms_log.template_params IS '短信参数'; +COMMENT ON COLUMN system_sms_log.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_log.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_sms_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_sms_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_sms_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_sms_log.api_send_code IS '短信 API 发送结果的编码'; +COMMENT ON COLUMN system_sms_log.api_send_msg IS '短信 API 发送失败的提示'; +COMMENT ON COLUMN system_sms_log.api_request_id IS '短信 API 发送返回的唯一请求 ID'; +COMMENT ON COLUMN system_sms_log.api_serial_no IS '短信 API 发送返回的序号'; +COMMENT ON COLUMN system_sms_log.receive_status IS '接收状态'; +COMMENT ON COLUMN system_sms_log.receive_time IS '接收时间'; +COMMENT ON COLUMN system_sms_log.api_receive_code IS 'API 接收结果的编码'; +COMMENT ON COLUMN system_sms_log.api_receive_msg IS 'API 接收结果的说明'; +COMMENT ON COLUMN system_sms_log.creator IS '创建者'; +COMMENT ON COLUMN system_sms_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_log.updater IS '更新者'; +COMMENT ON COLUMN system_sms_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_log.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_log IS '短信日志'; + +DROP SEQUENCE IF EXISTS system_sms_log_seq; +CREATE SEQUENCE system_sms_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_template; +CREATE TABLE system_sms_template +( + id int8 NOT NULL, + type int2 NOT NULL, + status int2 NOT NULL, + code varchar(63) NOT NULL, + name varchar(63) NOT NULL, + content varchar(255) NOT NULL, + params varchar(255) NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + api_template_id varchar(63) NOT NULL, + channel_id int8 NOT NULL, + channel_code varchar(63) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_template + ADD CONSTRAINT pk_system_sms_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_template.id IS '编号'; +COMMENT ON COLUMN system_sms_template.type IS '模板类型'; +COMMENT ON COLUMN system_sms_template.status IS '开启状态'; +COMMENT ON COLUMN system_sms_template.code IS '模板编码'; +COMMENT ON COLUMN system_sms_template.name IS '模板名称'; +COMMENT ON COLUMN system_sms_template.content IS '模板内容'; +COMMENT ON COLUMN system_sms_template.params IS '参数数组'; +COMMENT ON COLUMN system_sms_template.remark IS '备注'; +COMMENT ON COLUMN system_sms_template.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_template.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_template.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_template.creator IS '创建者'; +COMMENT ON COLUMN system_sms_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_template.updater IS '更新者'; +COMMENT ON COLUMN system_sms_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_template.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_template IS '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', '测试备注', '4383920', 6, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2023-12-02 22:32:47', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', 6, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2022-12-10 21:26:09', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2023-12-02 22:35:34', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', 6, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2022-12-10 21:25:59', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2023-03-24 23:45:07', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_sms_template_seq; +CREATE SEQUENCE system_sms_template_seq + START 17; + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +DROP TABLE IF EXISTS system_social_client; +CREATE TABLE system_social_client +( + id int8 NOT NULL, + name varchar(255) NOT NULL, + social_type int2 NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + client_secret varchar(255) NOT NULL, + agent_id varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_client + ADD CONSTRAINT pk_system_social_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_client.id IS '编号'; +COMMENT ON COLUMN system_social_client.name IS '应用名'; +COMMENT ON COLUMN system_social_client.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_client.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_social_client.client_secret IS '客户端密钥'; +COMMENT ON COLUMN system_social_client.agent_id IS '代理编号'; +COMMENT ON COLUMN system_social_client.status IS '状态'; +COMMENT ON COLUMN system_social_client.creator IS '创建者'; +COMMENT ON COLUMN system_social_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_client.updater IS '更新者'; +COMMENT ON COLUMN system_social_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_client.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_client.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_client IS '社交客户端表'; + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '钉钉', 20, 2, 'dingvrnreaje3yqvzhxg', 'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, '', '2023-10-18 11:21:18', '1', '2023-12-20 21:28:26', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '钉钉(王土豆)', 20, 2, 'dingtsu9hpepjkbmthhw', 'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, '', '2023-10-18 11:21:18', '', '2023-12-20 21:28:26', '1', 121); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '微信公众号', 31, 1, 'wx5b23ba7a5589ecbb', '2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, '', '2023-10-18 16:07:46', '1', '2023-12-20 21:28:23', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (43, '微信小程序', 34, 1, 'wx63c280fe3248a3e7', '6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, '', '2023-10-19 13:37:41', '1', '2023-12-20 21:28:25', '1', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_social_client_seq; +CREATE SEQUENCE system_social_client_seq + START 44; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user; +CREATE TABLE system_social_user +( + id int8 NOT NULL, + type int2 NOT NULL, + openid varchar(32) NOT NULL, + token varchar(256) NULL DEFAULT NULL, + raw_token_info varchar(1024) NOT NULL, + nickname varchar(32) NOT NULL, + avatar varchar(255) NULL DEFAULT NULL, + raw_user_info varchar(1024) NOT NULL, + code varchar(256) NOT NULL, + state varchar(256) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_user + ADD CONSTRAINT pk_system_social_user PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user.type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user.openid IS '社交 openid'; +COMMENT ON COLUMN system_social_user.token IS '社交 token'; +COMMENT ON COLUMN system_social_user.raw_token_info IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.nickname IS '用户昵称'; +COMMENT ON COLUMN system_social_user.avatar IS '用户头像'; +COMMENT ON COLUMN system_social_user.raw_user_info IS '原始用户数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.code IS '最后一次的认证 code'; +COMMENT ON COLUMN system_social_user.state IS '最后一次的认证 state'; +COMMENT ON COLUMN system_social_user.creator IS '创建者'; +COMMENT ON COLUMN system_social_user.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user.updater IS '更新者'; +COMMENT ON COLUMN system_social_user.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user IS '社交用户表'; + +DROP SEQUENCE IF EXISTS system_social_user_seq; +CREATE SEQUENCE system_social_user_seq + START 1; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user_bind; +CREATE TABLE system_social_user_bind +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + social_type int2 NOT NULL, + social_user_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_user_bind + ADD CONSTRAINT pk_system_social_user_bind PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user_bind.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user_bind.user_id IS '用户编号'; +COMMENT ON COLUMN system_social_user_bind.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_user_bind.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user_bind.social_user_id IS '社交用户的编号'; +COMMENT ON COLUMN system_social_user_bind.creator IS '创建者'; +COMMENT ON COLUMN system_social_user_bind.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user_bind.updater IS '更新者'; +COMMENT ON COLUMN system_social_user_bind.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user_bind.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user_bind.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user_bind IS '社交绑定表'; + +DROP SEQUENCE IF EXISTS system_social_user_bind_seq; +CREATE SEQUENCE system_social_user_bind_seq + START 1; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant; +CREATE TABLE system_tenant +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + contact_user_id int8 NULL DEFAULT NULL, + contact_name varchar(30) NOT NULL, + contact_mobile varchar(500) NULL DEFAULT NULL, + status int2 NOT NULL DEFAULT 0, + website varchar(256) NULL DEFAULT '', + package_id int8 NOT NULL, + expire_time timestamp NOT NULL, + account_count int4 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_tenant + ADD CONSTRAINT pk_system_tenant PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant.id IS '租户编号'; +COMMENT ON COLUMN system_tenant.name IS '租户名'; +COMMENT ON COLUMN system_tenant.contact_user_id IS '联系人的用户编号'; +COMMENT ON COLUMN system_tenant.contact_name IS '联系人'; +COMMENT ON COLUMN system_tenant.contact_mobile IS '联系手机'; +COMMENT ON COLUMN system_tenant.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant.website IS '绑定域名'; +COMMENT ON COLUMN system_tenant.package_id IS '租户套餐编号'; +COMMENT ON COLUMN system_tenant.expire_time IS '过期时间'; +COMMENT ON COLUMN system_tenant.account_count IS '账号数量'; +COMMENT ON COLUMN system_tenant.creator IS '创建者'; +COMMENT ON COLUMN system_tenant.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant.updater IS '更新者'; +COMMENT ON COLUMN system_tenant.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant IS '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2023-11-06 11:41:47', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2023-11-06 11:41:53', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_tenant_seq; +CREATE SEQUENCE system_tenant_seq + START 123; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant_package; +CREATE TABLE system_tenant_package +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + status int2 NOT NULL DEFAULT 0, + remark varchar(256) NULL DEFAULT '', + menu_ids varchar(4096) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_tenant_package + ADD CONSTRAINT pk_system_tenant_package PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant_package.id IS '套餐编号'; +COMMENT ON COLUMN system_tenant_package.name IS '套餐名'; +COMMENT ON COLUMN system_tenant_package.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant_package.remark IS '备注'; +COMMENT ON COLUMN system_tenant_package.menu_ids IS '关联的菜单编号'; +COMMENT ON COLUMN system_tenant_package.creator IS '创建者'; +COMMENT ON COLUMN system_tenant_package.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant_package.updater IS '更新者'; +COMMENT ON COLUMN system_tenant_package.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant_package.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant_package IS '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_tenant_package (id, name, status, remark, menu_ids, creator, create_time, updater, update_time, deleted) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1076,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2484,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-03-30 17:53:17', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_tenant_package_seq; +CREATE SEQUENCE system_tenant_package_seq + START 112; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS system_user_post; +CREATE TABLE system_user_post +( + id int8 NOT NULL, + user_id int8 NOT NULL DEFAULT 0, + post_id int8 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_user_post + ADD CONSTRAINT pk_system_user_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_post.id IS 'id'; +COMMENT ON COLUMN system_user_post.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_post.post_id IS '岗位ID'; +COMMENT ON COLUMN system_user_post.creator IS '创建者'; +COMMENT ON COLUMN system_user_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_post.updater IS '更新者'; +COMMENT ON COLUMN system_user_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_post IS '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 104, 1, '1', '2022-05-16 19:36:28', '1', '2022-05-16 19:36:28', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (116, 117, 2, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 118, 1, '1', '2022-07-09 17:44:44', '1', '2022-07-09 17:44:44', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_user_post_seq; +CREATE SEQUENCE system_user_post_seq + START 125; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS system_user_role; +CREATE TABLE system_user_role +( + id int8 NOT NULL, + user_id int8 NOT NULL, + role_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_user_role + ADD CONSTRAINT pk_system_user_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_role.id IS '自增编号'; +COMMENT ON COLUMN system_user_role.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN system_user_role.creator IS '创建者'; +COMMENT ON COLUMN system_user_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_role.updater IS '更新者'; +COMMENT ON COLUMN system_user_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_role IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (20, 104, 101, '1', '2022-05-28 15:43:57', '1', '2022-05-28 15:43:57', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (22, 115, 2, '1', '2022-07-21 22:08:30', '1', '2022-07-21 22:08:30', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (35, 112, 1, '1', '2024-03-15 20:00:24', '1', '2024-03-15 20:00:24', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (36, 118, 1, '1', '2024-03-17 09:12:08', '1', '2024-03-17 09:12:08', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (38, 114, 101, '1', '2024-03-24 22:23:03', '1', '2024-03-24 22:23:03', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_user_role_seq; +CREATE SEQUENCE system_user_role_seq + START 39; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS system_users; +CREATE TABLE system_users +( + id int8 NOT NULL, + username varchar(30) NOT NULL, + password varchar(100) NULL DEFAULT '', + nickname varchar(30) NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + dept_id int8 NULL DEFAULT NULL, + post_ids varchar(255) NULL DEFAULT NULL, + email varchar(50) NULL DEFAULT '', + mobile varchar(11) NULL DEFAULT '', + sex int2 NULL DEFAULT 0, + avatar varchar(512) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + login_ip varchar(50) NULL DEFAULT '', + login_date timestamp NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_users + ADD CONSTRAINT pk_system_users PRIMARY KEY (id); + +COMMENT ON COLUMN system_users.id IS '用户ID'; +COMMENT ON COLUMN system_users.username IS '用户账号'; +COMMENT ON COLUMN system_users.password IS '密码'; +COMMENT ON COLUMN system_users.nickname IS '用户昵称'; +COMMENT ON COLUMN system_users.remark IS '备注'; +COMMENT ON COLUMN system_users.dept_id IS '部门ID'; +COMMENT ON COLUMN system_users.post_ids IS '岗位编号数组'; +COMMENT ON COLUMN system_users.email IS '用户邮箱'; +COMMENT ON COLUMN system_users.mobile IS '手机号码'; +COMMENT ON COLUMN system_users.sex IS '用户性别'; +COMMENT ON COLUMN system_users.avatar IS '头像地址'; +COMMENT ON COLUMN system_users.status IS '帐号状态(0正常 1停用)'; +COMMENT ON COLUMN system_users.login_ip IS '最后登录IP'; +COMMENT ON COLUMN system_users.login_date IS '最后登录时间'; +COMMENT ON COLUMN system_users.creator IS '创建者'; +COMMENT ON COLUMN system_users.create_time IS '创建时间'; +COMMENT ON COLUMN system_users.updater IS '更新者'; +COMMENT ON COLUMN system_users.update_time IS '更新时间'; +COMMENT ON COLUMN system_users.deleted IS '是否删除'; +COMMENT ON COLUMN system_users.tenant_id IS '租户编号'; +COMMENT ON TABLE system_users IS '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '18818260277', 2, 'http://test.win.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, '0:0:0:0:0:0:0:1', '2024-04-29 21:50:32', 'admin', '2021-01-05 17:03:47', NULL, '2024-04-29 21:50:32', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-03-18 21:09:04', '', '2021-01-13 23:50:35', NULL, '2024-03-18 21:09:04', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, 'test', '$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-26 07:11:35', '', '2021-01-21 02:13:53', NULL, '2024-03-26 07:11:35', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', '0', 118); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', '0', 119); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', '0', 120); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-09-25 22:47:33', '1', '2022-02-22 00:56:14', NULL, '2022-09-25 22:47:33', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', '0', 122); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-04-04 09:48:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_users_seq; +CREATE SEQUENCE system_users_seq + START 132; + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +DROP TABLE IF EXISTS win_demo01_contact; +CREATE TABLE win_demo01_contact +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + sex int2 NOT NULL, + birthday timestamp NOT NULL, + description varchar(255) NOT NULL, + avatar varchar(512) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo01_contact + ADD CONSTRAINT pk_win_demo01_contact PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo01_contact.id IS '编号'; +COMMENT ON COLUMN win_demo01_contact.name IS '名字'; +COMMENT ON COLUMN win_demo01_contact.sex IS '性别'; +COMMENT ON COLUMN win_demo01_contact.birthday IS '出生年'; +COMMENT ON COLUMN win_demo01_contact.description IS '简介'; +COMMENT ON COLUMN win_demo01_contact.avatar IS '头像'; +COMMENT ON COLUMN win_demo01_contact.creator IS '创建者'; +COMMENT ON COLUMN win_demo01_contact.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo01_contact.updater IS '更新者'; +COMMENT ON COLUMN win_demo01_contact.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo01_contact.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo01_contact.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo01_contact IS '示例联系人表'; + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo01_contact (id, name, sex, birthday, description, avatar, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 2, '2023-11-07 00:00:00', '

天蚕土豆!呀

', 'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', '1', '2023-11-15 23:34:30', '1', '2023-11-15 23:47:39', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo01_contact_seq; +CREATE SEQUENCE win_demo01_contact_seq + START 2; + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +DROP TABLE IF EXISTS win_demo02_category; +CREATE TABLE win_demo02_category +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + parent_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo02_category + ADD CONSTRAINT pk_win_demo02_category PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo02_category.id IS '编号'; +COMMENT ON COLUMN win_demo02_category.name IS '名字'; +COMMENT ON COLUMN win_demo02_category.parent_id IS '父级编号'; +COMMENT ON COLUMN win_demo02_category.creator IS '创建者'; +COMMENT ON COLUMN win_demo02_category.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo02_category.updater IS '更新者'; +COMMENT ON COLUMN win_demo02_category.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo02_category.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo02_category.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo02_category IS '示例分类表'; + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 0, '1', '2023-11-15 23:34:30', '1', '2023-11-16 20:24:23', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '番茄', 0, '1', '2023-11-16 20:24:00', '1', '2023-11-16 20:24:15', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '怪怪', 0, '1', '2023-11-16 20:24:32', '1', '2023-11-16 20:24:32', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '小番茄', 2, '1', '2023-11-16 20:24:39', '1', '2023-11-16 20:24:39', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大番茄', 2, '1', '2023-11-16 20:24:46', '1', '2023-11-16 20:24:46', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, '11', 3, '1', '2023-11-24 19:29:34', '1', '2023-11-24 19:29:34', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo02_category_seq; +CREATE SEQUENCE win_demo02_category_seq + START 7; + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_course; +CREATE TABLE win_demo03_course +( + id int8 NOT NULL, + student_id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + score int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_course + ADD CONSTRAINT pk_win_demo03_course PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_course.id IS '编号'; +COMMENT ON COLUMN win_demo03_course.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_course.name IS '名字'; +COMMENT ON COLUMN win_demo03_course.score IS '分数'; +COMMENT ON COLUMN win_demo03_course.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_course.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_course.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_course.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_course.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_course.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_course IS '学生课程表'; + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, '语文', 66, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 2, '数学', 22, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (11, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (12, 2, '电脑', 33, '1', '2023-11-17 00:20:42', '1', '2023-11-16 16:20:45', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (13, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2023-11-17 13:13:20', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_course_seq; +CREATE SEQUENCE win_demo03_course_seq + START 14; + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_grade; +CREATE TABLE win_demo03_grade +( + id int8 NOT NULL, + student_id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + teacher varchar(255) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_grade + ADD CONSTRAINT pk_win_demo03_grade PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_grade.id IS '编号'; +COMMENT ON COLUMN win_demo03_grade.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_grade.name IS '名字'; +COMMENT ON COLUMN win_demo03_grade.teacher IS '班主任'; +COMMENT ON COLUMN win_demo03_grade.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_grade.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_grade.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_grade.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_grade.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_grade.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_grade IS '学生班级表'; + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 2, '三年 2 班', '周杰伦', '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '华为', '遥遥领先', '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 9, '小图', '小娃111', '1', '2023-11-17 13:10:23', '1', '2023-11-17 13:10:23', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_grade_seq; +CREATE SEQUENCE win_demo03_grade_seq + START 10; + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_student; +CREATE TABLE win_demo03_student +( + id int8 NOT NULL, + name varchar(100) NULL DEFAULT '', + sex int2 NOT NULL, + birthday timestamp NOT NULL, + description varchar(255) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_student + ADD CONSTRAINT pk_win_demo03_student PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_student.id IS '编号'; +COMMENT ON COLUMN win_demo03_student.name IS '名字'; +COMMENT ON COLUMN win_demo03_student.sex IS '性别'; +COMMENT ON COLUMN win_demo03_student.birthday IS '出生日期'; +COMMENT ON COLUMN win_demo03_student.description IS '简介'; +COMMENT ON COLUMN win_demo03_student.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_student.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_student.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_student.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_student.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_student.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_student IS '学生表'; + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '小白', 1, '2023-11-16 00:00:00', '

厉害

', '1', '2023-11-16 23:21:49', '1', '2023-11-17 16:49:06', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大黑', 2, '2023-11-13 00:00:00', '

你在教我做事?

', '1', '2023-11-16 23:22:46', '1', '2023-11-17 16:49:07', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, '小花', 1, '2023-11-07 00:00:00', '

哈哈哈

', '1', '2023-11-17 00:04:47', '1', '2023-11-17 16:49:08', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_student_seq; +CREATE SEQUENCE win_demo03_student_seq + START 10; + diff --git a/sql/oracle/quartz.sql b/sql/oracle/quartz.sql new file mode 100644 index 0000000..c3ed175 --- /dev/null +++ b/sql/oracle/quartz.sql @@ -0,0 +1,845 @@ +/* + 注意:仅仅需要 Quartz 定时任务的场景,可选!!! + + Date: 15/06/2022 08:20:08 +*/ + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_BLOB_TRIGGERS"; +CREATE TABLE "QRTZ_BLOB_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "BLOB_DATA" BLOB +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +DROP TABLE "QRTZ_CALENDARS"; +CREATE TABLE "QRTZ_CALENDARS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "CALENDAR_NAME" VARCHAR2(200 BYTE) NOT NULL, + "CALENDAR" BLOB NOT NULL +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_CRON_TRIGGERS"; +CREATE TABLE "QRTZ_CRON_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "CRON_EXPRESSION" VARCHAR2(120 BYTE) NOT NULL, + "TIME_ZONE_ID" VARCHAR2(80 BYTE) +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_FIRED_TRIGGERS"; +CREATE TABLE "QRTZ_FIRED_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "ENTRY_ID" VARCHAR2(95 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "INSTANCE_NAME" VARCHAR2(200 BYTE) NOT NULL, + "FIRED_TIME" NUMBER(13,0) NOT NULL, + "SCHED_TIME" NUMBER(13,0) NOT NULL, + "PRIORITY" NUMBER(13,0) NOT NULL, + "STATE" VARCHAR2(16 BYTE) NOT NULL, + "JOB_NAME" VARCHAR2(200 BYTE), + "JOB_GROUP" VARCHAR2(200 BYTE), + "IS_NONCONCURRENT" VARCHAR2(1 BYTE), + "REQUESTS_RECOVERY" VARCHAR2(1 BYTE) +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +DROP TABLE "QRTZ_JOB_DETAILS"; +CREATE TABLE "QRTZ_JOB_DETAILS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "JOB_NAME" VARCHAR2(200 BYTE) NOT NULL, + "JOB_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "DESCRIPTION" VARCHAR2(250 BYTE), + "JOB_CLASS_NAME" VARCHAR2(250 BYTE) NOT NULL, + "IS_DURABLE" VARCHAR2(1 BYTE) NOT NULL, + "IS_NONCONCURRENT" VARCHAR2(1 BYTE) NOT NULL, + "IS_UPDATE_DATA" VARCHAR2(1 BYTE) NOT NULL, + "REQUESTS_RECOVERY" VARCHAR2(1 BYTE) NOT NULL, + "JOB_DATA" BLOB +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +DROP TABLE "QRTZ_LOCKS"; +CREATE TABLE "QRTZ_LOCKS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "LOCK_NAME" VARCHAR2(40 BYTE) NOT NULL +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +DROP TABLE "QRTZ_PAUSED_TRIGGER_GRPS"; +CREATE TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +DROP TABLE "QRTZ_SCHEDULER_STATE"; +CREATE TABLE "QRTZ_SCHEDULER_STATE" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "INSTANCE_NAME" VARCHAR2(200 BYTE) NOT NULL, + "LAST_CHECKIN_TIME" NUMBER(13,0) NOT NULL, + "CHECKIN_INTERVAL" NUMBER(13,0) NOT NULL +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_SIMPLE_TRIGGERS"; +CREATE TABLE "QRTZ_SIMPLE_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "REPEAT_COUNT" NUMBER(7,0) NOT NULL, + "REPEAT_INTERVAL" NUMBER(12,0) NOT NULL, + "TIMES_TRIGGERED" NUMBER(10,0) NOT NULL +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_SIMPROP_TRIGGERS"; +CREATE TABLE "QRTZ_SIMPROP_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "STR_PROP_1" VARCHAR2(512 BYTE), + "STR_PROP_2" VARCHAR2(512 BYTE), + "STR_PROP_3" VARCHAR2(512 BYTE), + "INT_PROP_1" NUMBER(10,0), + "INT_PROP_2" NUMBER(10,0), + "LONG_PROP_1" NUMBER(13,0), + "LONG_PROP_2" NUMBER(13,0), + "DEC_PROP_1" NUMBER(13,4), + "DEC_PROP_2" NUMBER(13,4), + "BOOL_PROP_1" VARCHAR2(1 BYTE), + "BOOL_PROP_2" VARCHAR2(1 BYTE) +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_TRIGGERS"; +CREATE TABLE "QRTZ_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "JOB_NAME" VARCHAR2(200 BYTE) NOT NULL, + "JOB_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "DESCRIPTION" VARCHAR2(250 BYTE), + "NEXT_FIRE_TIME" NUMBER(13,0), + "PREV_FIRE_TIME" NUMBER(13,0), + "PRIORITY" NUMBER(13,0), + "TRIGGER_STATE" VARCHAR2(16 BYTE) NOT NULL, + "TRIGGER_TYPE" VARCHAR2(8 BYTE) NOT NULL, + "START_TIME" NUMBER(13,0) NOT NULL, + "END_TIME" NUMBER(13,0), + "CALENDAR_NAME" VARCHAR2(200 BYTE), + "MISFIRE_INSTR" NUMBER(2,0), + "JOB_DATA" BLOB +) + LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "QRTZ_BLOB_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008266" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008267" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008268" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008653" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008654" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008655" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "QRTZ_CALENDARS_PK" PRIMARY KEY ("SCHED_NAME", "CALENDAR_NAME"); + +-- ---------------------------- +-- Checks structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008271" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008272" CHECK ("CALENDAR_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008273" CHECK ("CALENDAR" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008656" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008657" CHECK ("CALENDAR_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008658" CHECK ("CALENDAR" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "QRTZ_CRON_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008255" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008256" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008257" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008258" CHECK ("CRON_EXPRESSION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008659" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008660" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008661" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008662" CHECK ("CRON_EXPRESSION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "QRTZ_FIRED_TRIGGER_PK" PRIMARY KEY ("SCHED_NAME", "ENTRY_ID"); + +-- ---------------------------- +-- Checks structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008278" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008279" CHECK ("ENTRY_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008280" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008281" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008282" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008283" CHECK ("FIRED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008284" CHECK ("SCHED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008285" CHECK ("PRIORITY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008286" CHECK ("STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008663" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008664" CHECK ("ENTRY_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008665" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008666" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008667" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008668" CHECK ("FIRED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008669" CHECK ("SCHED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008670" CHECK ("PRIORITY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008671" CHECK ("STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Indexes structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_FT_INST_JOB_REQ_RCVRY" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "INSTANCE_NAME" ASC, "REQUESTS_RECOVERY" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_FT_JG" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_FT_J_G" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "JOB_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_FT_TG" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_GROUP" ASC) LOCAL + LOGGING + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "QRTZ_JOB_DETAILS_PK" PRIMARY KEY ("SCHED_NAME", "JOB_NAME", "JOB_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008228" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008229" CHECK ("JOB_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008230" CHECK ("JOB_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008231" CHECK ("JOB_CLASS_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008232" CHECK ("IS_DURABLE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008233" CHECK ("IS_NONCONCURRENT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008234" CHECK ("IS_UPDATE_DATA" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008235" CHECK ("REQUESTS_RECOVERY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Indexes structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_J_GRP" + ON "QRTZ_JOB_DETAILS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_J_REQ_RECOVERY" + ON "QRTZ_JOB_DETAILS" ("SCHED_NAME" ASC, "REQUESTS_RECOVERY" ASC) LOCAL + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "QRTZ_LOCKS_PK" PRIMARY KEY ("SCHED_NAME", "LOCK_NAME"); + +-- ---------------------------- +-- Checks structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008293" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008294" CHECK ("LOCK_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008672" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008673" CHECK ("LOCK_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "QRTZ_PAUSED_TRIG_GRPS_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008275" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008276" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008674" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008675" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "QRTZ_SCHEDULER_STATE_PK" PRIMARY KEY ("SCHED_NAME", "INSTANCE_NAME"); + +-- ---------------------------- +-- Checks structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008288" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008289" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008290" CHECK ("LAST_CHECKIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008291" CHECK ("CHECKIN_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008676" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008677" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008678" CHECK ("LAST_CHECKIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008679" CHECK ("CHECKIN_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPLE_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008247" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008248" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008249" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008250" CHECK ("REPEAT_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008251" CHECK ("REPEAT_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008252" CHECK ("TIMES_TRIGGERED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008680" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008681" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008682" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008683" CHECK ("REPEAT_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008684" CHECK ("REPEAT_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008685" CHECK ("TIMES_TRIGGERED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPROP_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008261" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008262" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008263" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008686" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008687" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008688" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "QRTZ_TRIGGERS_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008237" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008238" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008239" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008240" CHECK ("JOB_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008241" CHECK ("JOB_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008242" CHECK ("TRIGGER_STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008243" CHECK ("TRIGGER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008244" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008689" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008690" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008691" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008692" CHECK ("JOB_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008693" CHECK ("JOB_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008694" CHECK ("TRIGGER_STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008695" CHECK ("TRIGGER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008696" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Indexes structure for table QRTZ_TRIGGERS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_T_C" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "CALENDAR_NAME" ASC) LOCAL + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_J" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "JOB_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_JG" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) LOCAL + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_NEXT_FIRE_TIME" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "NEXT_FIRE_TIME" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_NFT_ST" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_STATE" ASC, "NEXT_FIRE_TIME" ASC) LOCAL + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_NFT_ST_MISFIRE" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "MISFIRE_INSTR" ASC, "NEXT_FIRE_TIME" ASC, "TRIGGER_STATE" ASC) LOCAL + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_STATE" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_STATE" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "QRTZ_BLOB_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "QRTZ_CRON_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPLE_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPROP_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; \ No newline at end of file diff --git a/sql/oracle/ruoyi-vue-pro.sql b/sql/oracle/ruoyi-vue-pro.sql new file mode 100644 index 0000000..80ad0ef --- /dev/null +++ b/sql/oracle/ruoyi-vue-pro.sql @@ -0,0 +1,4582 @@ +/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : Oracle + + Date: 2024-05-02 00:10:33 +*/ + + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +CREATE TABLE infra_api_access_log +( + id number NOT NULL, + trace_id varchar2(64) DEFAULT '' NULL, + user_id number DEFAULT 0 NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + application_name varchar2(50) NOT NULL, + request_method varchar2(16) DEFAULT '' NULL, + request_url varchar2(255) DEFAULT '' NULL, + request_params clob NULL, + response_body clob NULL, + user_ip varchar2(50) NOT NULL, + user_agent varchar2(512) NOT NULL, + operate_module varchar2(50) DEFAULT NULL NULL, + operate_name varchar2(50) DEFAULT NULL NULL, + operate_type smallint DEFAULT 0 NULL, + begin_time date NOT NULL, + end_time date NOT NULL, + duration number NOT NULL, + result_code number DEFAULT 0 NOT NULL, + result_msg varchar2(512) DEFAULT '' NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_api_access_log + ADD CONSTRAINT pk_infra_api_access_log PRIMARY KEY (id); + +CREATE INDEX idx_infra_api_access_log_01 ON infra_api_access_log (create_time); + +COMMENT ON COLUMN infra_api_access_log.id IS '日志主键'; +COMMENT ON COLUMN infra_api_access_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN infra_api_access_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_access_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_access_log.application_name IS '应用名'; +COMMENT ON COLUMN infra_api_access_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_access_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_access_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_access_log.response_body IS '响应结果'; +COMMENT ON COLUMN infra_api_access_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_access_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_access_log.operate_module IS '操作模块'; +COMMENT ON COLUMN infra_api_access_log.operate_name IS '操作名'; +COMMENT ON COLUMN infra_api_access_log.operate_type IS '操作分类'; +COMMENT ON COLUMN infra_api_access_log.begin_time IS '开始请求时间'; +COMMENT ON COLUMN infra_api_access_log.end_time IS '结束请求时间'; +COMMENT ON COLUMN infra_api_access_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_api_access_log.result_code IS '结果码'; +COMMENT ON COLUMN infra_api_access_log.result_msg IS '结果提示'; +COMMENT ON COLUMN infra_api_access_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_access_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_access_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_access_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_access_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_access_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_access_log IS 'API 访问日志表'; + +CREATE SEQUENCE infra_api_access_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +CREATE TABLE infra_api_error_log +( + id number NOT NULL, + trace_id varchar2(64) NOT NULL, + user_id number DEFAULT 0 NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + application_name varchar2(50) NOT NULL, + request_method varchar2(16) NOT NULL, + request_url varchar2(255) NOT NULL, + request_params varchar2(4000) NOT NULL, + user_ip varchar2(50) NOT NULL, + user_agent varchar2(512) NOT NULL, + exception_time date NOT NULL, + exception_name varchar2(128) DEFAULT '' NULL, + exception_message clob NOT NULL, + exception_root_cause_message clob NOT NULL, + exception_stack_trace clob NOT NULL, + exception_class_name varchar2(512) NOT NULL, + exception_file_name varchar2(512) NOT NULL, + exception_method_name varchar2(512) NOT NULL, + exception_line_number number NOT NULL, + process_status smallint NOT NULL, + process_time date DEFAULT NULL NULL, + process_user_id number DEFAULT 0 NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_api_error_log + ADD CONSTRAINT pk_infra_api_error_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_api_error_log.id IS '编号'; +COMMENT ON COLUMN infra_api_error_log.trace_id IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; +COMMENT ON COLUMN infra_api_error_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_error_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_error_log.application_name IS '应用名 + * + * 目前读取 spring.application.name'; +COMMENT ON COLUMN infra_api_error_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_error_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_error_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_error_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_error_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_error_log.exception_time IS '异常发生时间'; +COMMENT ON COLUMN infra_api_error_log.exception_name IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; +COMMENT ON COLUMN infra_api_error_log.exception_message IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_root_cause_message IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_stack_trace IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; +COMMENT ON COLUMN infra_api_error_log.exception_class_name IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_file_name IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_method_name IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_line_number IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; +COMMENT ON COLUMN infra_api_error_log.process_status IS '处理状态'; +COMMENT ON COLUMN infra_api_error_log.process_time IS '处理时间'; +COMMENT ON COLUMN infra_api_error_log.process_user_id IS '处理用户编号'; +COMMENT ON COLUMN infra_api_error_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_error_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_error_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_error_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_error_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_error_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_error_log IS '系统异常日志'; + +CREATE SEQUENCE infra_api_error_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +CREATE TABLE infra_codegen_column +( + id number NOT NULL, + table_id number NOT NULL, + column_name varchar2(200) NOT NULL, + data_type varchar2(100) NOT NULL, + column_comment varchar2(500) NOT NULL, + nullable number(1, 0) NOT NULL, + primary_key number(1, 0) NOT NULL, + ordinal_position number NOT NULL, + java_type varchar2(32) NOT NULL, + java_field varchar2(64) NOT NULL, + dict_type varchar2(200) DEFAULT '' NULL, + example varchar2(64) DEFAULT NULL NULL, + create_operation number(1, 0) NOT NULL, + update_operation number(1, 0) NOT NULL, + list_operation number(1, 0) NOT NULL, + list_operation_condition varchar2(32) DEFAULT '=' NOT NULL, + list_operation_result number(1, 0) NOT NULL, + html_type varchar2(32) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_codegen_column + ADD CONSTRAINT pk_infra_codegen_column PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_column.id IS '编号'; +COMMENT ON COLUMN infra_codegen_column.table_id IS '表编号'; +COMMENT ON COLUMN infra_codegen_column.column_name IS '字段名'; +COMMENT ON COLUMN infra_codegen_column.data_type IS '字段类型'; +COMMENT ON COLUMN infra_codegen_column.column_comment IS '字段描述'; +COMMENT ON COLUMN infra_codegen_column.nullable IS '是否允许为空'; +COMMENT ON COLUMN infra_codegen_column.primary_key IS '是否主键'; +COMMENT ON COLUMN infra_codegen_column.ordinal_position IS '排序'; +COMMENT ON COLUMN infra_codegen_column.java_type IS 'Java 属性类型'; +COMMENT ON COLUMN infra_codegen_column.java_field IS 'Java 属性名'; +COMMENT ON COLUMN infra_codegen_column.dict_type IS '字典类型'; +COMMENT ON COLUMN infra_codegen_column.example IS '数据示例'; +COMMENT ON COLUMN infra_codegen_column.create_operation IS '是否为 Create 创建操作的字段'; +COMMENT ON COLUMN infra_codegen_column.update_operation IS '是否为 Update 更新操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation IS '是否为 List 查询操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation_condition IS 'List 查询操作的条件类型'; +COMMENT ON COLUMN infra_codegen_column.list_operation_result IS '是否为 List 查询操作的返回字段'; +COMMENT ON COLUMN infra_codegen_column.html_type IS '显示类型'; +COMMENT ON COLUMN infra_codegen_column.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_column.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_column.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_column.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_column.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_column IS '代码生成表字段定义'; + +CREATE SEQUENCE infra_codegen_column_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +CREATE TABLE infra_codegen_table +( + id number NOT NULL, + data_source_config_id number NOT NULL, + scene smallint DEFAULT 1 NOT NULL, + table_name varchar2(200) DEFAULT '' NULL, + table_comment varchar2(500) DEFAULT '' NULL, + remark varchar2(500) DEFAULT NULL NULL, + module_name varchar2(30) NOT NULL, + business_name varchar2(30) NOT NULL, + class_name varchar2(100) DEFAULT '' NULL, + class_comment varchar2(50) NOT NULL, + author varchar2(50) NOT NULL, + template_type smallint DEFAULT 1 NOT NULL, + front_type smallint NOT NULL, + parent_menu_id number DEFAULT NULL NULL, + master_table_id number DEFAULT NULL NULL, + sub_join_column_id number DEFAULT NULL NULL, + sub_join_many number(1, 0) DEFAULT NULL NULL, + tree_parent_column_id number DEFAULT NULL NULL, + tree_name_column_id number DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_codegen_table + ADD CONSTRAINT pk_infra_codegen_table PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_table.id IS '编号'; +COMMENT ON COLUMN infra_codegen_table.data_source_config_id IS '数据源配置的编号'; +COMMENT ON COLUMN infra_codegen_table.scene IS '生成场景'; +COMMENT ON COLUMN infra_codegen_table.table_name IS '表名称'; +COMMENT ON COLUMN infra_codegen_table.table_comment IS '表描述'; +COMMENT ON COLUMN infra_codegen_table.remark IS '备注'; +COMMENT ON COLUMN infra_codegen_table.module_name IS '模块名'; +COMMENT ON COLUMN infra_codegen_table.business_name IS '业务名'; +COMMENT ON COLUMN infra_codegen_table.class_name IS '类名称'; +COMMENT ON COLUMN infra_codegen_table.class_comment IS '类描述'; +COMMENT ON COLUMN infra_codegen_table.author IS '作者'; +COMMENT ON COLUMN infra_codegen_table.template_type IS '模板类型'; +COMMENT ON COLUMN infra_codegen_table.front_type IS '前端类型'; +COMMENT ON COLUMN infra_codegen_table.parent_menu_id IS '父菜单编号'; +COMMENT ON COLUMN infra_codegen_table.master_table_id IS '主表的编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_column_id IS '子表关联主表的字段编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_many IS '主表与子表是否一对多'; +COMMENT ON COLUMN infra_codegen_table.tree_parent_column_id IS '树表的父字段编号'; +COMMENT ON COLUMN infra_codegen_table.tree_name_column_id IS '树表的名字字段编号'; +COMMENT ON COLUMN infra_codegen_table.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_table.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_table.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_table.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_table.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_table IS '代码生成表定义'; + +CREATE SEQUENCE infra_codegen_table_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +CREATE TABLE infra_config +( + id number NOT NULL, + category varchar2(50) NOT NULL, + type smallint NOT NULL, + name varchar2(100) DEFAULT '' NULL, + config_key varchar2(100) DEFAULT '' NULL, + value varchar2(500) DEFAULT '' NULL, + visible number(1, 0) NOT NULL, + remark varchar2(500) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_config + ADD CONSTRAINT pk_infra_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_config.id IS '参数主键'; +COMMENT ON COLUMN infra_config.category IS '参数分组'; +COMMENT ON COLUMN infra_config.type IS '参数类型'; +COMMENT ON COLUMN infra_config.name IS '参数名称'; +COMMENT ON COLUMN infra_config.config_key IS '参数键名'; +COMMENT ON COLUMN infra_config.value IS '参数键值'; +COMMENT ON COLUMN infra_config.visible IS '是否可见'; +COMMENT ON COLUMN infra_config.remark IS '备注'; +COMMENT ON COLUMN infra_config.creator IS '创建者'; +COMMENT ON COLUMN infra_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_config.updater IS '更新者'; +COMMENT ON COLUMN infra_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_config IS '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +-- @formatter:off +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', '0', '初始化密码 123456', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-03 17:22:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', '1', '', '1', to_date('2023-04-07 13:41:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-07 14:33:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', '1', '', '1', to_date('2023-04-07 13:41:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-07 14:57:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', '1', '', '1', to_date('2023-04-07 13:41:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-07 14:52:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', '1', '', '1', to_date('2023-04-07 13:41:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-07 14:59:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', '1', '腾讯地图 key', '1', to_date('2023-06-03 19:16:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-03 19:16:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 'test2', 2, 'test3', 'test4', 'test5', '1', 'test6', '1', to_date('2023-12-03 09:55:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-03 09:55:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE infra_config_seq + START WITH 13; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +CREATE TABLE infra_data_source_config +( + id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + url varchar2(1024) NOT NULL, + username varchar2(255) NOT NULL, + password varchar2(255) DEFAULT '' NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_data_source_config + ADD CONSTRAINT pk_infra_data_source_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_data_source_config.id IS '主键编号'; +COMMENT ON COLUMN infra_data_source_config.name IS '参数名称'; +COMMENT ON COLUMN infra_data_source_config.url IS '数据源连接'; +COMMENT ON COLUMN infra_data_source_config.username IS '用户名'; +COMMENT ON COLUMN infra_data_source_config.password IS '密码'; +COMMENT ON COLUMN infra_data_source_config.creator IS '创建者'; +COMMENT ON COLUMN infra_data_source_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_data_source_config.updater IS '更新者'; +COMMENT ON COLUMN infra_data_source_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_data_source_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_data_source_config IS '数据源配置表'; + +CREATE SEQUENCE infra_data_source_config_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +CREATE TABLE infra_file +( + id number NOT NULL, + config_id number DEFAULT NULL NULL, + name varchar2(256) DEFAULT NULL NULL, + path varchar2(512) NOT NULL, + url varchar2(1024) NOT NULL, + type varchar2(128) DEFAULT NULL NULL, + "size" number NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_file + ADD CONSTRAINT pk_infra_file PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file.id IS '文件编号'; +COMMENT ON COLUMN infra_file.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file.name IS '文件名'; +COMMENT ON COLUMN infra_file.path IS '文件路径'; +COMMENT ON COLUMN infra_file.url IS '文件 URL'; +COMMENT ON COLUMN infra_file.type IS '文件类型'; +COMMENT ON COLUMN infra_file.size IS '文件大小'; +COMMENT ON COLUMN infra_file.creator IS '创建者'; +COMMENT ON COLUMN infra_file.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file.updater IS '更新者'; +COMMENT ON COLUMN infra_file.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file.deleted IS '是否删除'; +COMMENT ON TABLE infra_file IS '文件表'; + +CREATE SEQUENCE infra_file_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +CREATE TABLE infra_file_config +( + id number NOT NULL, + name varchar2(63) NOT NULL, + storage smallint NOT NULL, + remark varchar2(255) DEFAULT NULL NULL, + master number(1, 0) NOT NULL, + config varchar2(4000) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_file_config + ADD CONSTRAINT pk_infra_file_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_config.id IS '编号'; +COMMENT ON COLUMN infra_file_config.name IS '配置名'; +COMMENT ON COLUMN infra_file_config.storage IS '存储器'; +COMMENT ON COLUMN infra_file_config.remark IS '备注'; +COMMENT ON COLUMN infra_file_config.master IS '是否为主配置'; +COMMENT ON COLUMN infra_file_config.config IS '存储配置'; +COMMENT ON COLUMN infra_file_config.creator IS '创建者'; +COMMENT ON COLUMN infra_file_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_config.updater IS '更新者'; +COMMENT ON COLUMN infra_file_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_config IS '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +-- @formatter:off +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (4, '数据库', 1, '我是数据库', '0', '{"@class":"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', '1', to_date('2022-03-15 23:56:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-28 22:54:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (22, '七牛存储器', 20, '', '1', '{"@class":"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3.cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS","accessSecret":"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY"}', '1', to_date('2024-01-13 22:11:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-03 19:38:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE infra_file_config_seq + START WITH 23; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +CREATE TABLE infra_file_content +( + id number NOT NULL, + config_id number NOT NULL, + path varchar2(512) NOT NULL, + content blob NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_file_content + ADD CONSTRAINT pk_infra_file_content PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_content.id IS '编号'; +COMMENT ON COLUMN infra_file_content.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file_content.path IS '文件路径'; +COMMENT ON COLUMN infra_file_content.content IS '文件内容'; +COMMENT ON COLUMN infra_file_content.creator IS '创建者'; +COMMENT ON COLUMN infra_file_content.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_content.updater IS '更新者'; +COMMENT ON COLUMN infra_file_content.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_content.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_content IS '文件表'; + +CREATE SEQUENCE infra_file_content_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +CREATE TABLE infra_job +( + id number NOT NULL, + name varchar2(32) NOT NULL, + status smallint NOT NULL, + handler_name varchar2(64) NOT NULL, + handler_param varchar2(255) DEFAULT NULL NULL, + cron_expression varchar2(32) NOT NULL, + retry_count number DEFAULT 0 NOT NULL, + retry_interval number DEFAULT 0 NOT NULL, + monitor_timeout number DEFAULT 0 NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_job + ADD CONSTRAINT pk_infra_job PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job.id IS '任务编号'; +COMMENT ON COLUMN infra_job.name IS '任务名称'; +COMMENT ON COLUMN infra_job.status IS '任务状态'; +COMMENT ON COLUMN infra_job.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job.cron_expression IS 'CRON 表达式'; +COMMENT ON COLUMN infra_job.retry_count IS '重试次数'; +COMMENT ON COLUMN infra_job.retry_interval IS '重试间隔'; +COMMENT ON COLUMN infra_job.monitor_timeout IS '监控超时时间'; +COMMENT ON COLUMN infra_job.creator IS '创建者'; +COMMENT ON COLUMN infra_job.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job.updater IS '更新者'; +COMMENT ON COLUMN infra_job.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job.deleted IS '是否删除'; +COMMENT ON TABLE infra_job IS '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +-- @formatter:off +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', to_date('2021-10-27 08:34:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-09 20:51:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', to_date('2023-07-22 14:36:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-22 15:39:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', to_date('2023-07-22 15:36:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-22 15:39:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', to_date('2023-07-23 21:03:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-23 21:09:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (21, '交易订单的自动过期 Job', 2, 'tradeOrderAutoCancelJob', '', '0 * * * * ?', 3, 0, 0, '1', to_date('2023-09-25 23:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-26 19:23:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (22, '交易订单的自动收货 Job', 2, 'tradeOrderAutoReceiveJob', '', '0 * * * * ?', 3, 0, 0, '1', to_date('2023-09-26 19:23:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-26 23:38:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (23, '交易订单的自动评论 Job', 2, 'tradeOrderAutoCommentJob', '', '0 * * * * ?', 3, 0, 0, '1', to_date('2023-09-26 23:38:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-27 11:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (24, '佣金解冻 Job', 2, 'brokerageRecordUnfreezeJob', '', '0 * * * * ?', 3, 0, 0, '1', to_date('2023-09-28 22:01:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 22:01:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (25, '访问日志清理 Job', 2, 'accessLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', to_date('2023-10-03 10:59:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 11:01:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (26, '错误日志清理 Job', 2, 'errorLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', to_date('2023-10-03 11:00:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 11:01:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (27, '任务日志清理 Job', 2, 'jobLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', to_date('2023-10-03 11:01:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 11:01:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE infra_job_seq + START WITH 28; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +CREATE TABLE infra_job_log +( + id number NOT NULL, + job_id number NOT NULL, + handler_name varchar2(64) NOT NULL, + handler_param varchar2(255) DEFAULT NULL NULL, + execute_index smallint DEFAULT 1 NOT NULL, + begin_time date NOT NULL, + end_time date DEFAULT NULL NULL, + duration number DEFAULT NULL NULL, + status smallint NOT NULL, + result varchar2(4000) DEFAULT '' NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE infra_job_log + ADD CONSTRAINT pk_infra_job_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job_log.id IS '日志编号'; +COMMENT ON COLUMN infra_job_log.job_id IS '任务编号'; +COMMENT ON COLUMN infra_job_log.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job_log.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job_log.execute_index IS '第几次执行'; +COMMENT ON COLUMN infra_job_log.begin_time IS '开始执行时间'; +COMMENT ON COLUMN infra_job_log.end_time IS '结束执行时间'; +COMMENT ON COLUMN infra_job_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_job_log.status IS '任务状态'; +COMMENT ON COLUMN infra_job_log.result IS '结果数据'; +COMMENT ON COLUMN infra_job_log.creator IS '创建者'; +COMMENT ON COLUMN infra_job_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job_log.updater IS '更新者'; +COMMENT ON COLUMN infra_job_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job_log.deleted IS '是否删除'; +COMMENT ON TABLE infra_job_log IS '定时任务日志表'; + +CREATE SEQUENCE infra_job_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +CREATE TABLE system_dept +( + id number NOT NULL, + name varchar2(30) DEFAULT '' NULL, + parent_id number DEFAULT 0 NOT NULL, + sort number DEFAULT 0 NOT NULL, + leader_user_id number DEFAULT NULL NULL, + phone varchar2(11) DEFAULT NULL NULL, + email varchar2(50) DEFAULT NULL NULL, + status smallint NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_dept + ADD CONSTRAINT pk_system_dept PRIMARY KEY (id); + +COMMENT ON COLUMN system_dept.id IS '部门id'; +COMMENT ON COLUMN system_dept.name IS '部门名称'; +COMMENT ON COLUMN system_dept.parent_id IS '父部门id'; +COMMENT ON COLUMN system_dept.sort IS '显示顺序'; +COMMENT ON COLUMN system_dept.leader_user_id IS '负责人'; +COMMENT ON COLUMN system_dept.phone IS '联系电话'; +COMMENT ON COLUMN system_dept.email IS '邮箱'; +COMMENT ON COLUMN system_dept.status IS '部门状态(0正常 1停用)'; +COMMENT ON COLUMN system_dept.creator IS '创建者'; +COMMENT ON COLUMN system_dept.create_time IS '创建时间'; +COMMENT ON COLUMN system_dept.updater IS '更新者'; +COMMENT ON COLUMN system_dept.update_time IS '更新时间'; +COMMENT ON COLUMN system_dept.deleted IS '是否删除'; +COMMENT ON COLUMN system_dept.tenant_id IS '租户编号'; +COMMENT ON TABLE system_dept IS '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +-- @formatter:off +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-14 23:30:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 09:53:35', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-12-15 05:01:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-24 20:56:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-12-15 05:01:38', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-16 20:25:15', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '103', to_date('2022-01-15 21:32:22', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, '运维部门', 101, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 09:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 08:35:45', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-12-15 05:01:29', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', to_date('2022-02-23 20:46:30', 'SYYYY-MM-DD HH24:MI:SS'), '110', to_date('2022-02-23 20:46:30', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', to_date('2022-03-07 21:44:50', 'SYYYY-MM-DD HH24:MI:SS'), '113', to_date('2022-03-07 21:44:50', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, '产品部门', 101, 100, 1, NULL, NULL, 1, '1', to_date('2023-12-02 09:45:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 09:45:31', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, '支持部门', 102, 3, 104, NULL, NULL, 1, '1', to_date('2023-12-02 09:47:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 09:47:38', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_dept_seq + START WITH 114; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +CREATE TABLE system_dict_data +( + id number NOT NULL, + sort number DEFAULT 0 NOT NULL, + label varchar2(100) DEFAULT '' NULL, + value varchar2(100) DEFAULT '' NULL, + dict_type varchar2(100) DEFAULT '' NULL, + status smallint DEFAULT 0 NOT NULL, + color_type varchar2(100) DEFAULT '' NULL, + css_class varchar2(100) DEFAULT '' NULL, + remark varchar2(500) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_dict_data + ADD CONSTRAINT pk_system_dict_data PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_data.id IS '字典编码'; +COMMENT ON COLUMN system_dict_data.sort IS '字典排序'; +COMMENT ON COLUMN system_dict_data.label IS '字典标签'; +COMMENT ON COLUMN system_dict_data.value IS '字典键值'; +COMMENT ON COLUMN system_dict_data.dict_type IS '字典类型'; +COMMENT ON COLUMN system_dict_data.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_data.color_type IS '颜色类型'; +COMMENT ON COLUMN system_dict_data.css_class IS 'css 样式'; +COMMENT ON COLUMN system_dict_data.remark IS '备注'; +COMMENT ON COLUMN system_dict_data.creator IS '创建者'; +COMMENT ON COLUMN system_dict_data.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_data.updater IS '更新者'; +COMMENT ON COLUMN system_dict_data.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_data.deleted IS '是否删除'; +COMMENT ON TABLE system_dict_data IS '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +-- @formatter:off +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-29 00:14:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 2, '女', '2', 'system_user_sex', 0, 'success', '', '性别女', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-15 23:30:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:33:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:33:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:06:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:06:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:05:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:06:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (16, 0, '其它', '0', 'infra_operate_type', 0, 'default', '', '其它操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (17, 1, '查询', '1', 'infra_operate_type', 0, 'info', '', '查询操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (18, 2, '新增', '2', 'infra_operate_type', 0, 'primary', '', '新增操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (19, 3, '修改', '3', 'infra_operate_type', 0, 'warning', '', '修改操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (20, 4, '删除', '4', 'infra_operate_type', 0, 'danger', '', '删除操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (22, 5, '导出', '5', 'infra_operate_type', 0, 'default', '', '导出操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (23, 6, '导入', '6', 'infra_operate_type', 0, 'default', '', '导入操作', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 08:00:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 08:00:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:43:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:43:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:43:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:02:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:02:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:47:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:47:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:47:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:47:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:47:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', to_date('2021-01-18 06:17:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:23:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', to_date('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:24:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', to_date('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:23:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', to_date('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:24:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', to_date('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:24:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', to_date('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:24:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', to_date('2021-01-19 03:20:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 23:01:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', to_date('2021-01-19 03:20:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 23:09:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', to_date('2021-02-05 07:09:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-03-10 16:33:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', to_date('2021-02-05 07:14:46', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-03-10 16:33:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', to_date('2021-02-07 07:46:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:33:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', to_date('2021-02-08 10:04:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:07:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', to_date('2021-02-08 10:06:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:07:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', to_date('2021-02-08 10:07:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 19:07:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', to_date('2021-02-26 00:16:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:22:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', to_date('2021-02-26 00:16:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:22:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', to_date('2021-02-26 07:07:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 20:14:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', to_date('2021-02-26 07:07:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 20:14:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', to_date('2021-02-26 07:07:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 20:14:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', to_date('2021-04-05 01:05:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:09:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', to_date('2021-04-05 21:50:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 12:48:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', to_date('2021-04-05 21:51:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 12:48:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', to_date('2021-04-05 21:51:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 12:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', to_date('2021-04-11 20:18:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:26:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', to_date('2021-04-11 20:18:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:25:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', to_date('2021-04-11 20:18:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:26:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', to_date('2021-04-11 20:19:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:26:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', to_date('2021-04-11 20:27:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:28:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', to_date('2021-04-11 20:29:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:28:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', to_date('2021-04-11 20:29:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:28:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', to_date('2021-04-13 00:20:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', to_date('2021-10-06 00:52:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', to_date('2021-10-06 00:52:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:11:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', to_date('2021-10-06 00:52:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:11:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', to_date('2021-10-06 00:53:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:11:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', to_date('2021-09-21 22:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:00:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', to_date('2021-09-21 22:36:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:00:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', to_date('2021-09-21 22:36:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 10:00:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', to_date('2021-12-03 10:40:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:08:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', to_date('2021-12-03 10:41:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:08:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', to_date('2021-12-03 10:41:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', to_date('2021-12-03 10:42:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', to_date('2021-12-03 10:42:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', to_date('2021-12-03 10:42:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', to_date('2021-12-03 10:43:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', to_date('2021-12-03 11:02:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:08:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', to_date('2021-12-03 11:02:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:08:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', to_date('2021-12-03 11:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:08:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', to_date('2021-12-03 11:18:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:04:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', to_date('2021-12-03 11:18:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:05:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', to_date('2021-12-03 11:18:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:04:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (600, 5, '首页', '1', 'promotion_banner_position', 0, 'warning', '', '', '1', to_date('2023-10-11 07:45:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (601, 4, '秒杀活动页', '2', 'promotion_banner_position', 0, 'warning', '', '', '1', to_date('2023-10-11 07:45:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (602, 3, '砍价活动页', '3', 'promotion_banner_position', 0, 'warning', '', '', '1', to_date('2023-10-11 07:45:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (603, 2, '限时折扣页', '4', 'promotion_banner_position', 0, 'warning', '', '', '1', to_date('2023-10-11 07:45:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (604, 1, '满减送页', '5', 'promotion_banner_position', 0, 'warning', '', '', '1', to_date('2023-10-11 07:45:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', to_date('2021-12-10 16:44:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:14:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', to_date('2021-12-10 16:45:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:15:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', to_date('2021-12-10 16:46:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:15:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1127, 1, '审批中', '1', 'bpm_process_instance_status', 0, 'default', '', '流程实例的状态 - 进行中', '1', to_date('2022-01-07 23:47:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-16 16:11:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1128, 2, '审批通过', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', to_date('2022-01-07 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-16 16:11:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1129, 1, '审批中', '1', 'bpm_task_status', 0, 'primary', '', '流程实例的结果 - 处理中', '1', to_date('2022-01-07 23:48:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1130, 2, '审批通过', '2', 'bpm_task_status', 0, 'success', '', '流程实例的结果 - 通过', '1', to_date('2022-01-07 23:48:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1131, 3, '审批不通过', '3', 'bpm_task_status', 0, 'danger', '', '流程实例的结果 - 不通过', '1', to_date('2022-01-07 23:48:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1132, 4, '已取消', '4', 'bpm_task_status', 0, 'info', '', '流程实例的结果 - 撤销', '1', to_date('2022-01-07 23:49:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', to_date('2022-01-11 23:51:30', 'SYYYY-MM-DD HH24:MI:SS'), '103', to_date('2022-01-11 23:51:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', to_date('2022-01-11 23:51:47', 'SYYYY-MM-DD HH24:MI:SS'), '103', to_date('2022-01-11 23:51:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1135, 10, '角色', '10', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 角色', '103', to_date('2022-01-12 23:21:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', to_date('2022-01-12 23:21:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', to_date('2022-01-12 23:33:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1138, 30, '用户', '30', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 用户', '103', to_date('2022-01-12 23:34:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1139, 40, '用户组', '40', 'bpm_task_candidate_strategy', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', to_date('2022-01-12 23:34:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1140, 60, '流程表达式', '60', 'bpm_task_candidate_strategy', 0, 'danger', '', '任务分配规则的类型 - 流程表达式', '103', to_date('2022-01-12 23:34:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1141, 22, '岗位', '22', 'bpm_task_candidate_strategy', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', to_date('2022-01-14 18:41:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-06 02:53:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', to_date('2022-02-02 13:15:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-10 16:32:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', to_date('2022-02-02 13:15:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-10 16:33:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', to_date('2022-03-15 00:25:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 00:25:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', to_date('2022-03-15 00:25:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 00:25:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', to_date('2022-03-15 00:26:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 00:26:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', to_date('2022-03-15 00:26:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 00:26:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', to_date('2022-03-15 00:26:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 00:26:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', to_date('2022-05-09 23:57:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-09 23:58:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', to_date('2022-05-12 00:22:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 16:26:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', to_date('2022-05-12 00:22:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 16:26:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', to_date('2022-05-12 00:23:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 16:26:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', to_date('2022-05-12 00:23:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 16:26:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', to_date('2022-05-12 00:24:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 16:26:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', to_date('2022-10-24 21:19:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-10-24 21:20:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', to_date('2022-10-24 21:20:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-10-24 21:21:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', to_date('2022-10-24 21:21:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-10-24 21:21:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', to_date('2022-11-01 12:46:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-01 12:50:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', to_date('2022-11-01 12:46:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-01 12:50:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', to_date('2022-11-02 00:07:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 00:07:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', to_date('2022-11-02 00:07:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 00:07:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1169, 1, '通用劵', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', to_date('2022-11-02 00:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 00:27:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1170, 2, '商品劵', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', to_date('2022-11-02 00:28:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 00:27:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1171, 1, '未使用', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', to_date('2022-11-04 00:15:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 12:54:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', to_date('2022-11-04 00:15:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 19:16:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', to_date('2022-11-04 00:15:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 19:16:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', to_date('2022-11-04 19:13:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 19:13:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', to_date('2022-11-04 19:13:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 19:14:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', to_date('2022-11-04 22:54:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:55:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', to_date('2022-11-04 22:55:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:55:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', to_date('2022-11-04 22:55:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:55:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', to_date('2022-11-04 22:56:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:56:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', to_date('2022-11-04 22:59:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:59:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', to_date('2022-11-04 23:00:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 23:00:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', to_date('2022-11-19 20:53:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 20:54:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', to_date('2022-11-19 20:54:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 20:58:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', to_date('2022-11-19 20:56:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 20:59:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', to_date('2022-11-19 20:59:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:00:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', to_date('2022-11-19 21:00:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:00:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', to_date('2022-11-19 21:01:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:01:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', to_date('2022-11-19 21:02:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:02:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', to_date('2022-11-19 21:02:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:03:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', to_date('2022-11-19 21:05:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:38:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', to_date('2022-11-19 21:05:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:38:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', to_date('2022-11-19 21:39:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:39:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', to_date('2022-11-19 21:39:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:39:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', to_date('2022-12-10 10:51:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 10:51:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', to_date('2022-12-10 10:51:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 10:51:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', to_date('2022-12-10 10:54:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 10:52:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', to_date('2022-12-10 10:54:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 10:52:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', to_date('2022-12-10 10:55:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 10:59:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', to_date('2022-12-10 16:34:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:34:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', to_date('2022-12-10 16:34:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:34:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1201, 2, '拼团订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', to_date('2022-12-10 16:34:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:34:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1202, 3, '砍价订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', to_date('2022-12-10 16:34:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:34:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', to_date('2022-12-10 16:49:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:49:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', to_date('2022-12-10 16:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:51:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', to_date('2022-12-10 16:50:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:51:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', to_date('2022-12-10 16:50:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:51:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', to_date('2022-12-10 16:50:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:51:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', to_date('2022-12-10 20:58:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 20:59:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1209, 1, '售后中', '1', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', to_date('2022-12-10 20:59:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 20:59:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1210, 2, '已退款', '2', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', to_date('2022-12-10 20:59:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 20:59:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', to_date('2023-01-16 23:30:39', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 23:31:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', to_date('2023-01-16 23:30:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 23:31:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 22:17:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:19:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:20:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:21:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:19:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:22:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:22:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:23:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', to_date('2023-01-17 22:17:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 14:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', to_date('2023-01-26 09:53:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-26 16:36:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', to_date('2023-01-26 09:54:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-26 16:36:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', to_date('2023-01-26 09:54:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-26 16:36:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', to_date('2023-01-26 09:55:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-26 16:36:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', to_date('2023-01-28 10:35:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 10:35:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', to_date('2023-01-28 10:36:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 10:36:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', to_date('2023-02-18 23:32:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', to_date('2023-04-13 00:03:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-13 00:03:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', to_date('2023-04-13 00:04:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-13 00:04:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', to_date('2023-04-13 00:04:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-13 00:04:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', to_date('2023-04-13 00:04:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-13 00:04:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', to_date('2023-05-21 22:46:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-05-21 22:46:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', to_date('2023-05-21 22:46:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-05-21 22:46:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', to_date('2023-05-21 22:47:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-05-21 22:47:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1335, 11, '订单积分抵扣', '11', 'member_point_biz_type', 0, '', '', '', '1', to_date('2023-06-10 12:15:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:41:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', to_date('2023-06-10 12:15:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-20 11:59:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', to_date('2023-07-19 18:05:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:05:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', to_date('2023-07-19 18:10:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:11:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', to_date('2023-07-19 18:11:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:11:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', to_date('2023-07-19 20:07:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', to_date('2023-07-19 20:08:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 20:09:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', to_date('2023-07-20 12:23:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-20 12:23:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', to_date('2023-07-20 12:23:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-20 12:23:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', to_date('2023-07-29 11:10:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-29 03:14:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1349, 12, '订单积分抵扣(整单取消)', '12', 'member_point_biz_type', 0, '', '', '', '1', to_date('2023-08-20 12:00:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:42:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1352, 11, '下单奖励', '11', 'member_experience_biz_type', 0, 'success', '', NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1353, 12, '下单奖励(整单取消)', '12', 'member_experience_biz_type', 0, 'warning', '', NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', to_date('2023-08-23 00:04:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-23 00:04:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', to_date('2023-08-23 00:05:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-23 00:05:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1358, 3, '品类劵', '3', 'promotion_product_scope', 0, 'default', '', '', '1', to_date('2023-09-01 23:43:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 00:27:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1359, 1, '人人分销', '1', 'brokerage_enabled_condition', 0, '', '', '所有用户都可以分销', '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1360, 2, '指定分销', '2', 'brokerage_enabled_condition', 0, '', '', '仅可后台手动设置推广员', '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1361, 1, '首次绑定', '1', 'brokerage_bind_mode', 0, '', '', '只要用户没有推广人,随时都可以绑定推广关系', '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1362, 2, '注册绑定', '2', 'brokerage_bind_mode', 0, '', '', '仅新用户注册时才能绑定推广关系', '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1363, 3, '覆盖绑定', '3', 'brokerage_bind_mode', 0, '', '', '如果用户已经有推广人,推广人会被变更', '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1364, 1, '钱包', '1', 'brokerage_withdraw_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1365, 2, '银行卡', '2', 'brokerage_withdraw_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1366, 3, '微信', '3', 'brokerage_withdraw_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1367, 4, '支付宝', '4', 'brokerage_withdraw_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1368, 1, '订单返佣', '1', 'brokerage_record_biz_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1369, 2, '申请提现', '2', 'brokerage_record_biz_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1370, 3, '申请提现驳回', '3', 'brokerage_record_biz_type', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1371, 0, '待结算', '0', 'brokerage_record_status', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1372, 1, '已结算', '1', 'brokerage_record_status', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1373, 2, '已取消', '2', 'brokerage_record_status', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1374, 0, '审核中', '0', 'brokerage_withdraw_status', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1375, 10, '审核通过', '10', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1376, 11, '提现成功', '11', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1377, 20, '审核不通过', '20', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1378, 21, '提现失败', '21', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1379, 0, '工商银行', '0', 'brokerage_bank_name', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1380, 1, '建设银行', '1', 'brokerage_bank_name', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1381, 2, '农业银行', '2', 'brokerage_bank_name', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1382, 3, '中国银行', '3', 'brokerage_bank_name', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1383, 4, '交通银行', '4', 'brokerage_bank_name', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1384, 5, '招商银行', '5', 'brokerage_bank_name', 0, '', '', NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1385, 21, '钱包', 'wallet', 'pay_channel_code', 0, 'primary', '', '', '1', to_date('2023-10-01 21:46:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 21:48:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1386, 1, '砍价中', '1', 'promotion_bargain_record_status', 0, 'default', '', '', '1', to_date('2023-10-05 10:41:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 10:41:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1387, 2, '砍价成功', '2', 'promotion_bargain_record_status', 0, 'success', '', '', '1', to_date('2023-10-05 10:41:39', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 10:41:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1388, 3, '砍价失败', '3', 'promotion_bargain_record_status', 0, 'warning', '', '', '1', to_date('2023-10-05 10:41:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 10:41:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1389, 1, '拼团中', '1', 'promotion_combination_record_status', 0, '', '', '', '1', to_date('2023-10-08 07:24:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-08 07:24:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1390, 2, '拼团成功', '2', 'promotion_combination_record_status', 0, 'success', '', '', '1', to_date('2023-10-08 07:24:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-08 07:24:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1391, 3, '拼团失败', '3', 'promotion_combination_record_status', 0, 'warning', '', '', '1', to_date('2023-10-08 07:25:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-08 07:25:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1392, 2, '管理员修改', '2', 'member_point_biz_type', 0, 'default', '', '', '1', to_date('2023-10-11 07:41:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:41:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1393, 13, '订单积分抵扣(单个退款)', '13', 'member_point_biz_type', 0, '', '', '', '1', to_date('2023-10-11 07:42:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:42:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1394, 21, '订单积分奖励', '21', 'member_point_biz_type', 0, 'default', '', '', '1', to_date('2023-10-11 07:42:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:42:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1395, 22, '订单积分奖励(整单取消)', '22', 'member_point_biz_type', 0, 'default', '', '', '1', to_date('2023-10-11 07:42:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:43:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1396, 23, '订单积分奖励(单个退款)', '23', 'member_point_biz_type', 0, 'default', '', '', '1', to_date('2023-10-11 07:43:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:43:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1397, 13, '下单奖励(单个退款)', '13', 'member_experience_biz_type', 0, 'warning', '', '', '1', to_date('2023-10-11 07:45:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-11 07:45:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1398, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:55:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:55:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1399, 6, '支付宝', '6', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:55:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:55:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1400, 7, '微信支付', '7', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:55:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:55:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1401, 8, '其他', '8', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:56:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:56:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1402, 1, 'IT', '1', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:02:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:30:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1403, 2, '金融业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:02:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:30:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1404, 3, '房地产', '3', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:02:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:30:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1405, 4, '商业服务', '4', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:02:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:30:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1406, 5, '运输/物流', '5', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:03:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:31:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1407, 6, '生产', '6', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:03:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:31:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1408, 7, '政府', '7', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:03:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:31:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1409, 8, '文化传媒', '8', 'crm_customer_industry', 0, 'default', '', '', '1', to_date('2023-10-28 23:03:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:31:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', to_date('2023-10-28 23:07:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:07:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', to_date('2023-10-28 23:07:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:07:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', to_date('2023-10-28 23:07:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:07:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:08:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:08:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:08:39', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:08:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:08:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:08:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:08:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:08:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:09:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:09:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:09:39', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:09:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:10:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:10:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:10:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:10:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', to_date('2023-10-28 23:10:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 23:10:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1435, 10, 'Gitee', '10', 'system_social_type', 0, '', '', '', '1', to_date('2023-11-04 13:04:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:04:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1436, 20, '钉钉', '20', 'system_social_type', 0, '', '', '', '1', to_date('2023-11-04 13:04:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:04:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1437, 30, '企业微信', '30', 'system_social_type', 0, '', '', '', '1', to_date('2023-11-04 13:05:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:05:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1438, 31, '微信公众平台', '31', 'system_social_type', 0, '', '', '', '1', to_date('2023-11-04 13:05:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:05:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1439, 32, '微信开放平台', '32', 'system_social_type', 0, '', '', '', '1', to_date('2023-11-04 13:05:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:05:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1440, 34, '微信小程序', '34', 'system_social_type', 0, '', '', '', '1', to_date('2023-11-04 13:05:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:07:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1441, 1, '上架', '1', 'crm_product_status', 0, 'success', '', '', '1', to_date('2023-10-30 21:49:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-30 21:49:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1442, 0, '下架', '0', 'crm_product_status', 0, 'success', '', '', '1', to_date('2023-10-30 21:49:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-30 21:49:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1443, 15, '子表', '15', 'infra_codegen_template_type', 0, 'default', '', '', '1', to_date('2023-11-13 23:06:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-13 23:06:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1444, 10, '主表(标准模式)', '10', 'infra_codegen_template_type', 0, 'default', '', '', '1', to_date('2023-11-14 12:32:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-14 12:32:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1445, 11, '主表(ERP 模式)', '11', 'infra_codegen_template_type', 0, 'default', '', '', '1', to_date('2023-11-14 12:33:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-14 12:33:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1446, 12, '主表(内嵌模式)', '12', 'infra_codegen_template_type', 0, '', '', '', '1', to_date('2023-11-14 12:33:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-14 12:33:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1447, 1, '负责人', '1', 'crm_permission_level', 0, 'default', '', '', '1', to_date('2023-11-30 09:53:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 09:53:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1448, 2, '只读', '2', 'crm_permission_level', 0, '', '', '', '1', to_date('2023-11-30 09:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 09:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1449, 3, '读写', '3', 'crm_permission_level', 0, '', '', '', '1', to_date('2023-11-30 09:53:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 09:53:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1450, 0, '未提交', '0', 'crm_audit_status', 0, '', '', '', '1', to_date('2023-11-30 18:56:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 18:56:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1451, 10, '审批中', '10', 'crm_audit_status', 0, '', '', '', '1', to_date('2023-11-30 18:57:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 18:57:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1452, 20, '审核通过', '20', 'crm_audit_status', 0, '', '', '', '1', to_date('2023-11-30 18:57:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 18:57:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1453, 30, '审核不通过', '30', 'crm_audit_status', 0, '', '', '', '1', to_date('2023-11-30 18:57:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 18:57:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1454, 40, '已取消', '40', 'crm_audit_status', 0, '', '', '', '1', to_date('2023-11-30 18:57:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 18:57:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1456, 1, '支票', '1', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:54:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:54:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:54:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:54:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:54:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:54:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:55:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:55:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1460, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', to_date('2023-10-18 21:55:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:55:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:02:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:02:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:02:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:02:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:02:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:02:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1464, 4, '把', '4', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:03:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:03:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1465, 5, '枚', '5', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:03:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:03:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1466, 6, '瓶', '6', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:03:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:03:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1467, 7, '盒', '7', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:03:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:03:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1468, 8, '台', '8', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:03:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:03:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1469, 9, '吨', '9', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1470, 10, '千克', '10', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:04:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:04:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1471, 11, '米', '11', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:04:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:04:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1472, 12, '箱', '12', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:04:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:04:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1473, 13, '套', '13', 'crm_product_unit', 0, '', '', '', '1', to_date('2023-12-05 23:04:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:04:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1474, 1, '打电话', '1', 'crm_follow_up_type', 0, '', '', '', '1', to_date('2024-01-15 20:48:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-15 20:48:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1475, 2, '发短信', '2', 'crm_follow_up_type', 0, '', '', '', '1', to_date('2024-01-15 20:48:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-15 20:48:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1476, 3, '上门拜访', '3', 'crm_follow_up_type', 0, '', '', '', '1', to_date('2024-01-15 20:49:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-15 20:49:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1477, 4, '微信沟通', '4', 'crm_follow_up_type', 0, '', '', '', '1', to_date('2024-01-15 20:49:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-15 20:49:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1478, 4, '钱包余额', '4', 'pay_transfer_type', 0, 'info', '', '', '1', to_date('2023-10-28 16:28:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:28:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1479, 3, '银行卡', '3', 'pay_transfer_type', 0, 'default', '', '', '1', to_date('2023-10-28 16:28:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:28:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1480, 2, '微信余额', '2', 'pay_transfer_type', 0, 'info', '', '', '1', to_date('2023-10-28 16:28:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:28:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1481, 1, '支付宝余额', '1', 'pay_transfer_type', 0, 'default', '', '', '1', to_date('2023-10-28 16:27:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:27:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1482, 4, '转账失败', '30', 'pay_transfer_status', 0, 'warning', '', '', '1', to_date('2023-10-28 16:24:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:24:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1483, 3, '转账成功', '20', 'pay_transfer_status', 0, 'success', '', '', '1', to_date('2023-10-28 16:23:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:23:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1484, 2, '转账进行中', '10', 'pay_transfer_status', 0, 'info', '', '', '1', to_date('2023-10-28 16:23:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:23:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1485, 1, '等待转账', '0', 'pay_transfer_status', 0, 'default', '', '', '1', to_date('2023-10-28 16:21:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:23:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1486, 10, '其它入库', '10', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-05 18:07:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 18:07:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1487, 11, '其它入库(作废)', '11', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-05 18:08:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 19:20:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1488, 20, '其它出库', '20', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-05 18:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 18:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1489, 21, '其它出库(作废)', '21', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-05 18:09:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 19:20:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1490, 10, '未审核', '10', 'erp_audit_status', 0, 'default', '', '', '1', to_date('2024-02-06 00:00:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-06 00:00:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1491, 20, '已审核', '20', 'erp_audit_status', 0, 'success', '', '', '1', to_date('2024-02-06 00:00:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-06 00:00:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1492, 30, '调拨入库', '30', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-07 20:34:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 12:36:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1493, 31, '调拨入库(作废)', '31', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-07 20:34:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 20:37:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1494, 32, '调拨出库', '32', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-07 20:34:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 12:36:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1495, 33, '调拨出库(作废)', '33', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-07 20:34:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 20:37:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1496, 40, '盘盈入库', '40', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-08 08:53:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-08 08:53:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1497, 41, '盘盈入库(作废)', '41', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-08 08:53:39', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 19:40:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1498, 42, '盘亏出库', '42', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-08 08:54:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-08 08:54:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1499, 43, '盘亏出库(作废)', '43', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-08 08:54:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 19:40:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1500, 50, '销售出库', '50', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-11 21:47:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-11 21:50:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1501, 51, '销售出库(作废)', '51', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-11 21:47:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-11 21:51:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1502, 60, '销售退货入库', '60', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-12 06:51:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-12 06:51:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1503, 61, '销售退货入库(作废)', '61', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-12 06:51:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-12 06:51:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1504, 70, '采购入库', '70', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-16 13:10:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 13:10:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1505, 71, '采购入库(作废)', '71', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-16 13:10:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 19:40:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1506, 80, '采购退货出库', '80', 'erp_stock_record_biz_type', 0, '', '', '', '1', to_date('2024-02-16 13:10:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 13:10:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1507, 81, '采购退货出库(作废)', '81', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', to_date('2024-02-16 13:10:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 19:40:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1509, 3, '审批不通过', '3', 'bpm_process_instance_status', 0, 'danger', '', '', '1', to_date('2024-03-16 16:12:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-16 16:12:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1510, 4, '已取消', '4', 'bpm_process_instance_status', 0, 'warning', '', '', '1', to_date('2024-03-16 16:12:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-16 16:12:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1511, 5, '已退回', '5', 'bpm_task_status', 0, 'warning', '', '', '1', to_date('2024-03-16 19:10:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1512, 6, '委派中', '6', 'bpm_task_status', 0, 'primary', '', '', '1', to_date('2024-03-17 10:06:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1513, 7, '审批通过中', '7', 'bpm_task_status', 0, 'success', '', '', '1', to_date('2024-03-17 10:06:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1514, 0, '待审批', '0', 'bpm_task_status', 0, 'info', '', '', '1', to_date('2024-03-17 10:07:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:41:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1515, 35, '发起人自选', '35', 'bpm_task_candidate_strategy', 0, '', '', '', '1', to_date('2024-03-22 19:45:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-22 19:45:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1516, 1, '执行监听器', 'execution', 'bpm_process_listener_type', 0, 'primary', '', '', '1', to_date('2024-03-23 12:54:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:14:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1517, 1, '任务监听器', 'task', 'bpm_process_listener_type', 0, 'success', '', '', '1', to_date('2024-03-23 12:54:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:14:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1526, 1, 'Java 类', 'class', 'bpm_process_listener_value_type', 0, 'primary', '', '', '1', to_date('2024-03-23 15:08:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:14:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1527, 2, '表达式', 'expression', 'bpm_process_listener_value_type', 0, 'success', '', '', '1', to_date('2024-03-23 15:09:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:14:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1528, 3, '代理表达式', 'delegateExpression', 'bpm_process_listener_value_type', 0, 'info', '', '', '1', to_date('2024-03-23 15:11:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:14:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1529, 1, '天', '1', 'date_interval', 0, '', '', '', '1', to_date('2024-03-29 22:50:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-29 22:50:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1530, 2, '周', '2', 'date_interval', 0, '', '', '', '1', to_date('2024-03-29 22:50:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-29 22:50:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1531, 3, '月', '3', 'date_interval', 0, '', '', '', '1', to_date('2024-03-29 22:50:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-29 22:50:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1532, 4, '季度', '4', 'date_interval', 0, '', '', '', '1', to_date('2024-03-29 22:51:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-29 22:51:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1533, 5, '年', '5', 'date_interval', 0, '', '', '', '1', to_date('2024-03-29 22:51:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-29 22:51:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1534, 1, '赢单', '1', 'crm_business_end_status_type', 0, 'success', '', '', '1', to_date('2024-04-13 23:26:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-13 23:26:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1535, 2, '输单', '2', 'crm_business_end_status_type', 0, 'primary', '', '', '1', to_date('2024-04-13 23:27:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-13 23:27:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1536, 3, '无效', '3', 'crm_business_end_status_type', 0, 'info', '', '', '1', to_date('2024-04-13 23:27:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-13 23:27:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_dict_data_seq + START WITH 1537; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +CREATE TABLE system_dict_type +( + id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + type varchar2(100) DEFAULT '' NULL, + status smallint DEFAULT 0 NOT NULL, + remark varchar2(500) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + deleted_time date DEFAULT NULL NULL +); + +ALTER TABLE system_dict_type + ADD CONSTRAINT pk_system_dict_type PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_type.id IS '字典主键'; +COMMENT ON COLUMN system_dict_type.name IS '字典名称'; +COMMENT ON COLUMN system_dict_type.type IS '字典类型'; +COMMENT ON COLUMN system_dict_type.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_type.remark IS '备注'; +COMMENT ON COLUMN system_dict_type.creator IS '创建者'; +COMMENT ON COLUMN system_dict_type.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_type.updater IS '更新者'; +COMMENT ON COLUMN system_dict_type.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_type.deleted IS '是否删除'; +COMMENT ON COLUMN system_dict_type.deleted_time IS '删除时间'; +COMMENT ON TABLE system_dict_type IS '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +-- @formatter:off +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-16 20:29:32', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:36:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:35:26', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (9, '操作类型', 'infra_operate_type', 0, NULL, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-14 12:44:01', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:21:28', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', to_date('2021-01-19 03:20:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:37:10', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', to_date('2021-01-18 06:17:11', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:36:00', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', to_date('2021-02-05 07:08:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-16 20:26:50', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', to_date('2021-02-07 07:44:16', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:51:11', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', to_date('2021-02-08 10:03:51', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:50:43', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (109, '用户类型', 'user_type', 0, NULL, '', to_date('2021-02-26 00:15:51', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-02-26 00:15:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', to_date('2021-02-26 07:07:01', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-01 16:50:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', to_date('2021-04-05 01:04:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 02:09:08', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', to_date('2021-04-05 21:50:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-01 16:35:06', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', to_date('2021-04-11 20:18:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-01 16:35:09', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', to_date('2021-04-11 20:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-01 16:35:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', to_date('2021-10-06 00:50:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-01 16:35:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', to_date('2021-09-21 22:34:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-01-22 10:41:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', to_date('2021-12-03 10:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-10 10:11:39', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', to_date('2021-12-03 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 18:09:43', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', to_date('2021-12-03 11:17:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2021-12-03 11:17:50', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', to_date('2021-12-10 16:42:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-19 10:13:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', to_date('2022-01-07 23:46:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-01-07 23:46:42', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (140, '流程实例的结果', 'bpm_task_status', 0, '流程实例的结果', '1', to_date('2022-01-07 23:48:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-08 22:42:03', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', to_date('2022-01-11 23:50:45', 'SYYYY-MM-DD HH24:MI:SS'), '103', to_date('2022-01-11 23:50:45', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (142, '任务分配规则的类型', 'bpm_task_candidate_strategy', 0, 'BPM 任务的候选人的策略', '103', to_date('2022-01-12 23:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '103', to_date('2024-03-06 02:53:59', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', to_date('2022-02-02 13:14:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-10 16:33:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', to_date('2022-02-16 13:01:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-16 13:01:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', to_date('2022-03-15 00:24:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-15 00:24:38', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', to_date('2022-05-12 00:20:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 16:25:49', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', to_date('2022-10-24 21:19:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-10-24 21:19:08', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', to_date('2022-11-01 12:46:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-01 12:46:06', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', to_date('2022-11-02 00:06:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 00:08:26', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', to_date('2022-11-02 00:28:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-02 00:28:01', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', to_date('2022-11-04 00:14:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 00:14:49', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', to_date('2022-11-04 19:12:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 19:12:27', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', to_date('2022-11-04 22:54:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:54:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', to_date('2022-11-04 22:59:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-04 22:59:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', to_date('2022-11-19 20:52:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 20:52:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', to_date('2022-11-19 21:04:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:04:09', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', to_date('2022-11-19 21:39:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-19 21:39:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (160, '终端', 'terminal', 0, '终端', '1', to_date('2022-12-10 10:50:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 10:53:11', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', to_date('2022-12-10 16:33:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:33:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', to_date('2022-12-10 16:48:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 16:48:44', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', to_date('2022-12-10 20:58:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 20:58:08', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', to_date('2023-01-16 23:29:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 23:29:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', to_date('2023-01-17 22:17:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 22:17:09', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', to_date('2023-01-26 09:53:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-26 09:53:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', to_date('2023-01-28 10:35:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 10:35:10', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', to_date('2023-04-12 23:57:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-12 23:57:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', to_date('2023-05-21 22:45:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-05-21 22:45:03', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', to_date('2023-06-10 12:15:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-28 13:48:20', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', to_date('2023-07-20 12:23:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-07-20 12:23:03', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', to_date('2023-08-23 00:03:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-23 00:03:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (176, '分佣模式', 'brokerage_enabled_condition', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (177, '分销关系绑定模式', 'brokerage_bind_mode', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (178, '佣金提现类型', 'brokerage_withdraw_type', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (179, '佣金记录业务类型', 'brokerage_record_biz_type', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (180, '佣金记录状态', 'brokerage_record_status', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (181, '佣金提现状态', 'brokerage_withdraw_status', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (182, '佣金提现银行', 'brokerage_bank_name', 0, NULL, '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (183, '砍价记录的状态', 'promotion_bargain_record_status', 0, '', '1', to_date('2023-10-05 10:41:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 10:41:08', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (184, '拼团记录的状态', 'promotion_combination_record_status', 0, '', '1', to_date('2023-10-08 07:24:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-08 07:24:25', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (185, '回款-回款方式', 'crm_receivable_return_type', 0, '回款-回款方式', '1', to_date('2023-10-18 21:54:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-18 21:54:10', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (186, 'CRM 客户行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', to_date('2023-10-28 22:57:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-18 23:30:22', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', to_date('2023-10-28 22:59:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 15:11:16', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', to_date('2023-10-28 23:00:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 15:11:16', 'SYYYY-MM-DD HH24:MI:SS'), '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (600, 'Banner 位置', 'promotion_banner_position', 0, '', '1', to_date('2023-10-08 07:24:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:04:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (601, '社交类型', 'system_social_type', 0, '', '1', to_date('2023-11-04 13:03:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 13:03:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (604, '产品状态', 'crm_product_status', 0, '', '1', to_date('2023-10-30 21:47:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-30 21:48:45', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (605, 'CRM 数据权限的级别', 'crm_permission_level', 0, '', '1', to_date('2023-11-30 09:51:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 09:51:59', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (606, 'CRM 审批状态', 'crm_audit_status', 0, '', '1', to_date('2023-11-30 18:56:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-30 18:56:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (607, 'CRM 产品单位', 'crm_product_unit', 0, '', '1', to_date('2023-12-05 23:01:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 23:01:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (608, 'CRM 跟进方式', 'crm_follow_up_type', 0, '', '1', to_date('2024-01-15 20:48:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-15 20:48:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (609, '支付转账类型', 'pay_transfer_type', 0, '', '1', to_date('2023-10-28 16:27:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:27:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (610, '转账订单状态', 'pay_transfer_status', 0, '', '1', to_date('2023-10-28 16:18:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-28 16:18:32', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (611, 'ERP 库存明细的业务类型', 'erp_stock_record_biz_type', 0, 'ERP 库存明细的业务类型', '1', to_date('2024-02-05 18:07:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 18:07:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (612, 'ERP 审批状态', 'erp_audit_status', 0, '', '1', to_date('2024-02-06 00:00:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-06 00:00:07', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (613, 'BPM 监听器类型', 'bpm_process_listener_type', 0, '', '1', to_date('2024-03-23 12:52:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-09 15:54:28', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (615, 'BPM 监听器值类型', 'bpm_process_listener_value_type', 0, '', '1', to_date('2024-03-23 13:00:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 13:00:31', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (616, '时间间隔', 'date_interval', 0, '', '1', to_date('2024-03-29 22:50:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-29 22:50:09', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (619, 'CRM 商机结束状态类型', 'crm_business_end_status_type', 0, '', '1', to_date('2024-04-13 23:23:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-13 23:23:00', 'SYYYY-MM-DD HH24:MI:SS'), '0', to_date('1970-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_dict_type_seq + START WITH 620; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +CREATE TABLE system_login_log +( + id number NOT NULL, + log_type number NOT NULL, + trace_id varchar2(64) DEFAULT '' NULL, + user_id number DEFAULT 0 NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + username varchar2(50) DEFAULT '' NULL, + result smallint NOT NULL, + user_ip varchar2(50) NOT NULL, + user_agent varchar2(512) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_login_log + ADD CONSTRAINT pk_system_login_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_login_log.id IS '访问ID'; +COMMENT ON COLUMN system_login_log.log_type IS '日志类型'; +COMMENT ON COLUMN system_login_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_login_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_login_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_login_log.username IS '用户账号'; +COMMENT ON COLUMN system_login_log.result IS '登陆结果'; +COMMENT ON COLUMN system_login_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_login_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_login_log.creator IS '创建者'; +COMMENT ON COLUMN system_login_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_login_log.updater IS '更新者'; +COMMENT ON COLUMN system_login_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_login_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_login_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_login_log IS '系统访问记录'; + +CREATE SEQUENCE system_login_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +CREATE TABLE system_mail_account +( + id number NOT NULL, + mail varchar2(255) NOT NULL, + username varchar2(255) NOT NULL, + password varchar2(255) NOT NULL, + host varchar2(255) NOT NULL, + port number NOT NULL, + ssl_enable number(1, 0) DEFAULT '0' NOT NULL, + starttls_enable number(1, 0) DEFAULT '0' NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_mail_account + ADD CONSTRAINT pk_system_mail_account PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_account.id IS '主键'; +COMMENT ON COLUMN system_mail_account.mail IS '邮箱'; +COMMENT ON COLUMN system_mail_account.username IS '用户名'; +COMMENT ON COLUMN system_mail_account.password IS '密码'; +COMMENT ON COLUMN system_mail_account.host IS 'SMTP 服务器域名'; +COMMENT ON COLUMN system_mail_account.port IS 'SMTP 服务器端口'; +COMMENT ON COLUMN system_mail_account.ssl_enable IS '是否开启 SSL'; +COMMENT ON COLUMN system_mail_account.starttls_enable IS '是否开启 STARTTLS'; +COMMENT ON COLUMN system_mail_account.creator IS '创建者'; +COMMENT ON COLUMN system_mail_account.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_account.updater IS '更新者'; +COMMENT ON COLUMN system_mail_account.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_account.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_account IS '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +-- @formatter:off +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, '0', '0', '1', to_date('2023-01-25 17:39:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 09:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, '1', '0', '1', to_date('2023-01-26 01:26:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-12 22:39:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, '0', '0', '1', to_date('2023-01-27 15:06:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-27 07:08:36', 'SYYYY-MM-DD HH24:MI:SS'), '1'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, '1', '0', '1', to_date('2023-04-12 23:05:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-04-12 15:05:11', 'SYYYY-MM-DD HH24:MI:SS'), '1'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_mail_account_seq + START WITH 5; + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +CREATE TABLE system_mail_log +( + id number NOT NULL, + user_id number DEFAULT NULL NULL, + user_type smallint DEFAULT NULL NULL, + to_mail varchar2(255) NOT NULL, + account_id number NOT NULL, + from_mail varchar2(255) NOT NULL, + template_id number NOT NULL, + template_code varchar2(63) NOT NULL, + template_nickname varchar2(255) DEFAULT NULL NULL, + template_title varchar2(255) NOT NULL, + template_content varchar2(4000) NOT NULL, + template_params varchar2(255) NOT NULL, + send_status smallint DEFAULT 0 NOT NULL, + send_time date DEFAULT NULL NULL, + send_message_id varchar2(255) DEFAULT NULL NULL, + send_exception varchar2(4000) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_mail_log + ADD CONSTRAINT pk_system_mail_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_log.id IS '编号'; +COMMENT ON COLUMN system_mail_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_mail_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_mail_log.to_mail IS '接收邮箱地址'; +COMMENT ON COLUMN system_mail_log.account_id IS '邮箱账号编号'; +COMMENT ON COLUMN system_mail_log.from_mail IS '发送邮箱地址'; +COMMENT ON COLUMN system_mail_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_mail_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_mail_log.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_mail_log.template_title IS '邮件标题'; +COMMENT ON COLUMN system_mail_log.template_content IS '邮件内容'; +COMMENT ON COLUMN system_mail_log.template_params IS '邮件参数'; +COMMENT ON COLUMN system_mail_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_mail_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_mail_log.send_message_id IS '发送返回的消息 ID'; +COMMENT ON COLUMN system_mail_log.send_exception IS '发送异常'; +COMMENT ON COLUMN system_mail_log.creator IS '创建者'; +COMMENT ON COLUMN system_mail_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_log.updater IS '更新者'; +COMMENT ON COLUMN system_mail_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_log.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_log IS '邮件日志表'; + +CREATE SEQUENCE system_mail_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +CREATE TABLE system_mail_template +( + id number NOT NULL, + name varchar2(63) NOT NULL, + code varchar2(63) NOT NULL, + account_id number NOT NULL, + nickname varchar2(255) DEFAULT NULL NULL, + title varchar2(255) NOT NULL, + content varchar2(4000) NOT NULL, + params varchar2(255) NOT NULL, + status smallint NOT NULL, + remark varchar2(255) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_mail_template + ADD CONSTRAINT pk_system_mail_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_template.id IS '编号'; +COMMENT ON COLUMN system_mail_template.name IS '模板名称'; +COMMENT ON COLUMN system_mail_template.code IS '模板编码'; +COMMENT ON COLUMN system_mail_template.account_id IS '发送的邮箱账号编号'; +COMMENT ON COLUMN system_mail_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_mail_template.title IS '模板标题'; +COMMENT ON COLUMN system_mail_template.content IS '模板内容'; +COMMENT ON COLUMN system_mail_template.params IS '参数数组'; +COMMENT ON COLUMN system_mail_template.status IS '开启状态'; +COMMENT ON COLUMN system_mail_template.remark IS '备注'; +COMMENT ON COLUMN system_mail_template.creator IS '创建者'; +COMMENT ON COLUMN system_mail_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_template.updater IS '更新者'; +COMMENT ON COLUMN system_mail_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_template.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_template IS '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +-- @formatter:off +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '["code","name"]', 0, '3', '1', to_date('2021-10-11 08:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 19:51:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '["key01","key02"]', 0, NULL, '1', to_date('2023-01-26 01:27:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-27 10:32:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', to_date('2023-01-27 15:50:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-27 16:34:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_mail_template_seq + START WITH 16; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +CREATE TABLE system_menu +( + id number NOT NULL, + name varchar2(50) NOT NULL, + permission varchar2(100) DEFAULT '' NULL, + type smallint NOT NULL, + sort number DEFAULT 0 NOT NULL, + parent_id number DEFAULT 0 NOT NULL, + path varchar2(200) DEFAULT '' NULL, + icon varchar2(100) DEFAULT '#' NULL, + component varchar2(255) DEFAULT NULL NULL, + component_name varchar2(255) DEFAULT NULL NULL, + status smallint DEFAULT 0 NOT NULL, + visible number(1, 0) DEFAULT '1' NOT NULL, + keep_alive number(1, 0) DEFAULT '1' NOT NULL, + always_show number(1, 0) DEFAULT '1' NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_menu + ADD CONSTRAINT pk_system_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_menu.id IS '菜单ID'; +COMMENT ON COLUMN system_menu.name IS '菜单名称'; +COMMENT ON COLUMN system_menu.permission IS '权限标识'; +COMMENT ON COLUMN system_menu.type IS '菜单类型'; +COMMENT ON COLUMN system_menu.sort IS '显示顺序'; +COMMENT ON COLUMN system_menu.parent_id IS '父菜单ID'; +COMMENT ON COLUMN system_menu.path IS '路由地址'; +COMMENT ON COLUMN system_menu.icon IS '菜单图标'; +COMMENT ON COLUMN system_menu.component IS '组件路径'; +COMMENT ON COLUMN system_menu.component_name IS '组件名'; +COMMENT ON COLUMN system_menu.status IS '菜单状态'; +COMMENT ON COLUMN system_menu.visible IS '是否可见'; +COMMENT ON COLUMN system_menu.keep_alive IS '是否缓存'; +COMMENT ON COLUMN system_menu.always_show IS '是否总是显示'; +COMMENT ON COLUMN system_menu.creator IS '创建者'; +COMMENT ON COLUMN system_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_menu.updater IS '更新者'; +COMMENT ON COLUMN system_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_menu.deleted IS '是否删除'; +COMMENT ON TABLE system_menu IS '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +-- @formatter:off +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:04:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-01 08:28:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, '1', '1', '1', 'admin', to_date('2021-09-20 16:26:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:38:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:02:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:03:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:03:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:06:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:06:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:07:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:02:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (107, '通知公告', '', 2, 4, 2739, 'notice', 'ep:takeaway-box', 'system/notice/index', 'SystemNotice', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-22 23:56:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:08:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:13:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (110, '定时任务', '', 2, 7, 2, 'job', 'fa-solid:tasks', 'infra/job/index', 'InfraJob', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:57:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:05:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:06:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:06:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:51:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:document-copy', 'infra/codegen/index', 'InfraCodegen', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:51:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:01:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:09:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:10:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-09 23:54:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-09 23:54:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-01-06 17:53:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-01-06 17:56:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-01-07 10:23:28', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-01-26 01:02:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-01-26 01:02:52', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, '1', '1', '1', '', to_date('2021-02-06 12:42:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-15 23:45:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-02-07 13:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, '1', '1', '1', '', to_date('2021-02-08 20:41:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, '1', '1', '1', '', to_date('2021-02-26 01:32:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:54:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-02-26 01:32:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '', to_date('2021-02-26 02:18:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-22 23:58:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, '1', '1', '1', '', to_date('2021-02-26 07:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:55:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-02-26 07:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-02-26 07:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2021-03-10 01:26:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2021-03-10 01:28:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2021-03-10 01:29:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, '1', '1', '1', '', to_date('2021-03-12 20:16:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:53:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-03-12 20:16:20', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-03-12 20:16:20', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1093, '短信管理', '', 1, 1, 2739, 'sms', 'ep:message', NULL, NULL, 0, '1', '1', '1', '1', to_date('2021-04-05 01:10:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-22 23:56:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'fa:stack-exchange', 'system/sms/channel/index', 'SystemSmsChannel', 0, '1', '1', '1', '', to_date('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:15:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'ep:connection', 'system/sms/template/index', 'SystemSmsTemplate', 0, '1', '1', '1', '', to_date('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:16:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2021-04-11 00:26:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'fa:edit', 'system/sms/log/index', 'SystemSmsLog', 0, '1', '1', '1', '', to_date('2021-04-11 08:37:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:49:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-11 08:37:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-04-11 08:37:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1117, '支付管理', '', 1, 30, 0, '/pay', 'ep:money', NULL, NULL, 0, '1', '1', '1', '1', to_date('2021-12-25 16:43:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:58:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, '1', '1', '1', '', to_date('2021-09-20 08:51:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:38:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-09-20 08:51:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-09-20 08:51:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'fa:apple', 'pay/app/index', 'PayApp', 0, '1', '1', '1', '', to_date('2021-11-10 01:13:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:59:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2021-11-08 15:15:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'ep:house', 'system/tenant/index', 'SystemTenant', 0, '1', '1', '1', '', to_date('2021-12-14 12:31:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:01:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2021-11-08 15:15:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'fa:registered', 'pay/refund/index', 'PayRefund', 0, '1', '1', '1', '', to_date('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:59:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'fa:cc-paypal', 'pay/order/index', 'PayOrder', 0, '1', '1', '1', '', to_date('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:59:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, '1', '1', '1', '1', to_date('2021-12-30 20:26:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:43:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, '1', '1', '1', '1', to_date('2021-12-30 20:28:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:36:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, '1', '1', '1', '', to_date('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-19 12:25:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, '1', '1', '1', '1', to_date('2021-12-31 23:24:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-19 12:25:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-03 19:01:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-03 19:01:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-03 19:01:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-03 19:02:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-03 19:02:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-03 19:03:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-01-07 23:51:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-21 00:33:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, '1', '1', '1', '', to_date('2022-01-07 15:53:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-21 23:52:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-01-07 15:53:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, '1', '1', '1', '1', to_date('2022-01-08 10:33:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:37:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, '1', '1', '1', '1', to_date('2022-01-08 10:34:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:37:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, '1', '1', '1', '', to_date('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-21 23:55:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:21:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:26:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:28:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:28:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:36:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:36:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:38:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-01-23 00:39:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'fa-solid:house-user', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-02-20 01:41:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 00:59:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'fa:bars', 'system/tenantPackage/index', 'SystemTenantPackage', 0, '1', '1', '1', '', to_date('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:01:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, '1', '1', '1', '', to_date('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:52:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, '1', '1', '1', '1', to_date('2022-03-16 23:47:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:02:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:avatar', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-04-23 01:03:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-08 23:40:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:data-analysis', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, '1', '1', '1', '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:51:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-05-09 23:38:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:12:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, '1', '1', '1', '', to_date('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:13:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 00:31:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 00:31:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 00:31:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-11 00:31:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1281, '报表管理', '', 2, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-07-10 20:22:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:33:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'GoView', 0, '1', '1', '1', '1', to_date('2022-07-10 20:26:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:33:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2000, '商品中心', '', 1, 60, 2362, 'product', 'fa:product-hunt', NULL, NULL, 0, '1', '1', '1', '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-30 11:52:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2002, '商品分类', '', 2, 2, 2000, 'category', 'ep:cellphone', 'mall/product/category/index', 'ProductCategory', 0, '1', '1', '1', '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-21 10:27:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2003, '分类查询', 'product:category:query', 3, 1, 2002, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2004, '分类创建', 'product:category:create', 3, 2, 2002, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2005, '分类更新', 'product:category:update', 3, 3, 2002, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2006, '分类删除', 'product:category:delete', 3, 4, 2002, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-29 15:53:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2008, '商品品牌', '', 2, 3, 2000, 'brand', 'ep:chicken', 'mall/product/brand/index', 'ProductBrand', 0, '1', '1', '1', '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-21 10:27:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2009, '品牌查询', 'product:brand:query', 3, 1, 2008, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2010, '品牌创建', 'product:brand:create', 3, 2, 2008, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2011, '品牌更新', 'product:brand:update', 3, 3, 2008, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2012, '品牌删除', 'product:brand:delete', 3, 4, 2008, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 13:52:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2014, '商品列表', '', 2, 1, 2000, 'spu', 'ep:apple', 'mall/product/spu/index', 'ProductSpu', 0, '1', '1', '1', '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-21 10:27:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2015, '商品查询', 'product:spu:query', 3, 1, 2014, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2016, '商品创建', 'product:spu:create', 3, 2, 2014, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2017, '商品更新', 'product:spu:update', 3, 3, 2014, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2018, '商品删除', 'product:spu:delete', 3, 4, 2014, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2019, '商品属性', '', 2, 4, 2000, 'property', 'ep:cold-drink', 'mall/product/property/index', 'ProductProperty', 0, '1', '1', '1', '', to_date('2022-08-01 14:55:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-26 11:01:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2020, '规格查询', 'product:property:query', 3, 1, 2019, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-08-01 14:55:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-12-12 20:26:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2021, '规格创建', 'product:property:create', 3, 2, 2019, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-08-01 14:55:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-12-12 20:26:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2022, '规格更新', 'product:property:update', 3, 3, 2019, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-08-01 14:55:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-12-12 20:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2023, '规格删除', 'product:property:delete', 3, 4, 2019, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-08-01 14:55:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-12-12 20:26:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2025, 'Banner', '', 2, 100, 2387, 'banner', 'fa:bandcamp', 'mall/promotion/banner/index', NULL, 0, '1', '1', '1', '', to_date('2022-08-01 14:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-24 20:20:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2026, 'Banner查询', 'promotion:banner:query', 3, 1, 2025, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-08-01 14:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-24 20:20:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2027, 'Banner创建', 'promotion:banner:create', 3, 2, 2025, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-08-01 14:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-24 20:20:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2028, 'Banner更新', 'promotion:banner:update', 3, 3, 2025, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-08-01 14:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-24 20:20:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2029, 'Banner删除', 'promotion:banner:delete', 3, 4, 2025, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-08-01 14:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-24 20:20:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2030, '营销中心', '', 1, 70, 2362, 'promotion', 'ep:present', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-10-31 21:25:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-30 11:54:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2032, '优惠劵列表', '', 2, 1, 2365, 'template', 'ep:discount', 'mall/promotion/coupon/template/index', 'PromotionCouponTemplate', 0, '1', '1', '1', '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 12:40:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2033, '优惠劵模板查询', 'promotion:coupon-template:query', 3, 1, 2032, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2034, '优惠劵模板创建', 'promotion:coupon-template:create', 3, 2, 2032, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2035, '优惠劵模板更新', 'promotion:coupon-template:update', 3, 3, 2032, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2036, '优惠劵模板删除', 'promotion:coupon-template:delete', 3, 4, 2032, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-10-31 22:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2038, '领取记录', '', 2, 2, 2365, 'list', 'ep:collection-tag', 'mall/promotion/coupon/index', 'PromotionCoupon', 0, '1', '1', '1', '', to_date('2022-11-03 23:21:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 12:55:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2039, '优惠劵查询', 'promotion:coupon:query', 3, 1, 2038, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-03 23:21:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-03 23:21:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2040, '优惠劵删除', 'promotion:coupon:delete', 3, 4, 2038, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-03 23:21:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-03 23:21:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2041, '满减送', '', 2, 10, 2390, 'reward-activity', 'ep:goblet-square-full', 'mall/promotion/rewardActivity/index', 'PromotionRewardActivity', 0, '1', '1', '1', '', to_date('2022-11-04 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-21 19:24:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2042, '满减送活动查询', 'promotion:reward-activity:query', 3, 1, 2041, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-04 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-04 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2043, '满减送活动创建', 'promotion:reward-activity:create', 3, 2, 2041, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-04 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-04 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2044, '满减送活动更新', 'promotion:reward-activity:update', 3, 3, 2041, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-04 23:47:50', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-04 23:47:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2045, '满减送活动删除', 'promotion:reward-activity:delete', 3, 4, 2041, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-04 23:47:50', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-04 23:47:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2022-11-05 10:42:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-11-05 10:42:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2047, '限时折扣', '', 2, 7, 2390, 'discount-activity', 'ep:timer', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, '1', '1', '1', '', to_date('2022-11-05 17:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-21 19:24:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-05 17:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-05 17:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-05 17:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-05 17:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-05 17:12:16', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-05 17:12:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-05 17:12:16', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-05 17:12:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-05 17:12:16', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-05 17:12:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, '1', '1', '1', '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 18:57:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-11-06 22:24:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, '1', '1', '1', '', to_date('2022-11-15 19:46:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 18:57:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-11-15 19:46:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 17:50:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-11-15 19:46:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 17:48:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-11-15 19:46:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 17:50:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, '1', '1', '1', '', to_date('2022-11-15 19:46:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 17:50:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2072, '订单中心', '', 1, 65, 2362, 'trade', 'ep:eleme', NULL, NULL, 0, '1', '1', '1', '1', to_date('2022-11-19 18:57:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-30 11:54:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2073, '售后退款', '', 2, 2, 2072, 'after-sale', 'ep:refrigerator', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, '1', '1', '1', '', to_date('2022-11-19 20:15:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 21:42:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-11-19 20:15:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 21:04:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2075, '秒杀活动关闭', 'promotion:seckill-activity:close', 3, 5, 2059, '', '', '', '', 0, '1', '1', '1', '1', to_date('2022-11-28 20:20:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 18:34:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2076, '订单列表', '', 2, 1, 2072, 'order', 'ep:list', 'mall/trade/order/index', 'TradeOrder', 0, '1', '1', '1', '1', to_date('2022-12-10 21:05:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 21:42:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, '1', '1', '1', '1', to_date('2022-12-23 17:35:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:50:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'ep:compass', NULL, NULL, 0, '1', '1', '1', '1', to_date('2023-01-01 20:11:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:39:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'fa:user', 'mp/account/index', 'MpAccount', 0, '1', '1', '1', '1', to_date('2023-01-01 20:13:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:42:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2086, '新增账号', 'mp:account:create', 3, 1, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-01 20:21:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-07 17:32:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2087, '修改账号', 'mp:account:update', 3, 2, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-07 17:32:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-07 17:32:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2088, '查询账号', 'mp:account:query', 3, 0, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-07 17:33:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-07 17:33:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2089, '删除账号', 'mp:account:delete', 3, 3, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-07 17:33:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-07 17:33:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2090, '生成二维码', 'mp:account:qr-code', 3, 4, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-07 17:33:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-07 17:33:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2091, '清空 API 配额', 'mp:account:clear-quota', 3, 5, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-07 18:20:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-07 18:20:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2092, '数据统计', 'mp:statistics:query', 2, 2, 2084, 'statistics', 'ep:trend-charts', 'mp/statistics/index', 'MpStatistics', 0, '1', '1', '1', '1', to_date('2023-01-07 20:17:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:42:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2093, '标签管理', '', 2, 3, 2084, 'tag', 'ep:collection-tag', 'mp/tag/index', 'MpTag', 0, '1', '1', '1', '1', to_date('2023-01-08 11:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:42:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2094, '查询标签', 'mp:tag:query', 3, 0, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 11:59:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 11:59:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2095, '新增标签', 'mp:tag:create', 3, 1, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 11:59:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 11:59:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2096, '修改标签', 'mp:tag:update', 3, 2, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 11:59:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 11:59:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2097, '删除标签', 'mp:tag:delete', 3, 3, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 12:00:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 12:00:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2098, '同步标签', 'mp:tag:sync', 3, 4, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 12:00:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 12:00:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2099, '粉丝管理', '', 2, 4, 2084, 'user', 'fa:user-secret', 'mp/user/index', 'MpUser', 0, '1', '1', '1', '1', to_date('2023-01-08 16:51:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:42:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2100, '查询粉丝', 'mp:user:query', 3, 0, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 17:16:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 17:17:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2101, '修改粉丝', 'mp:user:update', 3, 1, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 17:17:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 17:17:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2102, '同步粉丝', 'mp:user:sync', 3, 2, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-08 17:17:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-08 17:17:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2103, '消息管理', '', 2, 5, 2084, 'message', 'ep:message', 'mp/message/index', 'MpMessage', 0, '1', '1', '1', '1', to_date('2023-01-08 18:44:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:42:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2104, '图文发表记录', '', 2, 10, 2084, 'free-publish', 'ep:edit-pen', 'mp/freePublish/index', 'MpFreePublish', 0, '1', '1', '1', '1', to_date('2023-01-13 00:30:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:43:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2105, '查询发布列表', 'mp:free-publish:query', 3, 1, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-13 07:19:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-13 07:19:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2106, '发布草稿', 'mp:free-publish:submit', 3, 2, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-13 07:19:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-13 07:19:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2107, '删除发布记录', 'mp:free-publish:delete', 3, 3, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-13 07:20:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-13 07:20:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2108, '图文草稿箱', '', 2, 9, 2084, 'draft', 'ep:edit', 'mp/draft/index', 'MpDraft', 0, '1', '1', '1', '1', to_date('2023-01-13 07:40:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2109, '新建草稿', 'mp:draft:create', 3, 1, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-13 23:15:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-13 23:15:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2110, '修改草稿', 'mp:draft:update', 3, 2, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 10:08:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 10:08:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2111, '查询草稿', 'mp:draft:query', 3, 0, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 10:09:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 10:09:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2112, '删除草稿', 'mp:draft:delete', 3, 3, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 10:09:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 10:09:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2113, '素材管理', '', 2, 8, 2084, 'material', 'ep:basketball', 'mp/material/index', 'MpMaterial', 0, '1', '1', '1', '1', to_date('2023-01-14 14:12:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:43:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2114, '上传临时素材', 'mp:material:upload-temporary', 3, 1, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 15:33:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 15:33:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2115, '上传永久素材', 'mp:material:upload-permanent', 3, 2, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 15:34:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 15:34:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2116, '删除素材', 'mp:material:delete', 3, 3, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 15:35:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 15:35:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2117, '上传图文图片', 'mp:material:upload-news-image', 3, 4, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 15:36:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 15:36:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2118, '查询素材', 'mp:material:query', 3, 5, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-14 15:39:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-14 15:39:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2119, '菜单管理', '', 2, 6, 2084, 'menu', 'ep:menu', 'mp/menu/index', 'MpMenu', 0, '1', '1', '1', '1', to_date('2023-01-14 17:43:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:42:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2120, '自动回复', '', 2, 7, 2084, 'auto-reply', 'fa-solid:republican', 'mp/autoReply/index', 'MpAutoReply', 0, '1', '1', '1', '1', to_date('2023-01-15 22:13:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:43:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2121, '查询回复', 'mp:auto-reply:query', 3, 0, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-16 22:28:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 22:28:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2122, '新增回复', 'mp:auto-reply:create', 3, 1, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-16 22:28:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 22:28:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2123, '修改回复', 'mp:auto-reply:update', 3, 2, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-16 22:29:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 22:29:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2124, '删除回复', 'mp:auto-reply:delete', 3, 3, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-16 22:29:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-16 22:29:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2125, '查询菜单', 'mp:menu:query', 3, 0, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-17 23:05:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 23:05:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2126, '保存菜单', 'mp:menu:save', 3, 1, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-17 23:06:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 23:06:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2127, '删除菜单', 'mp:menu:delete', 3, 2, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-17 23:06:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 23:06:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2128, '查询消息', 'mp:message:query', 3, 0, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-17 23:07:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 23:07:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2129, '发送消息', 'mp:message:send', 3, 1, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-17 23:07:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-17 23:07:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2130, '邮箱管理', '', 2, 2, 2739, 'mail', 'fa-solid:mail-bulk', NULL, NULL, 0, '1', '1', '1', '1', to_date('2023-01-25 17:27:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-22 23:56:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'fa:universal-access', 'system/mail/account/index', 'SystemMailAccount', 0, '1', '1', '1', '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:48:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 09:33:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'fa:tag', 'system/mail/template/index', 'SystemMailTemplate', 0, '1', '1', '1', '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:48:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-25 12:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'fa:edit', 'system/mail/log/index', 'SystemMailLog', 0, '1', '1', '1', '', to_date('2023-01-26 02:16:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:48:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-26 02:16:50', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-26 02:16:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-26 23:29:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-26 23:29:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2144, '站内信管理', '', 1, 3, 2739, 'notify', 'ep:message-box', NULL, NULL, 0, '1', '1', '1', '1', to_date('2023-01-28 10:25:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-22 23:56:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'fa:archive', 'system/notify/template/index', 'SystemNotifyTemplate', 0, '1', '1', '1', '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:49:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-28 02:26:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-01-28 10:54:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 10:54:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'fa:edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, '1', '1', '1', '', to_date('2023-01-28 04:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:49:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-01-28 04:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-01-28 04:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'JimuReport', 0, '1', '1', '1', '1', to_date('2023-02-07 00:03:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 12:34:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-02-07 19:25:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-07 19:25:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2155, '更新项目', 'report:go-view-project:update', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-02-07 19:25:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 20:01:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-02-07 19:25:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-07 19:25:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-02-07 19:26:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-07 19:26:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', to_date('2023-02-07 19:26:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-07 19:26:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, '1', '1', '1', '1', to_date('2023-02-10 22:46:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 21:32:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, '1', '1', '1', '1', to_date('2023-02-10 22:47:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 21:32:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, '1', '1', '1', '', to_date('2023-02-11 14:21:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-18 23:50:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-07-30 14:22:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2164, '配送管理', '', 1, 3, 2072, 'delivery', 'ep:shopping-cart', '', '', 0, '1', '1', '1', '1', to_date('2023-05-18 09:18:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 10:58:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', 'ep:bicycle', '', '', 0, '1', '1', '1', '1', to_date('2023-05-18 09:22:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-30 21:02:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', 'ep:add-location', '', '', 0, '1', '1', '1', '1', to_date('2023-05-18 09:23:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-30 21:03:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', 'ep:compass', 'mall/trade/delivery/express/index', 'Express', 0, '1', '1', '1', '1', to_date('2023-05-18 09:27:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-30 21:02:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-18 09:37:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', 'ep:coordinate', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, '1', '1', '1', '1', to_date('2023-05-20 06:48:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-30 21:03:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-20 06:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', 'ep:basketball', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, '1', '1', '1', '1', to_date('2023-05-25 10:50:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-30 21:03:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-05-25 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, '1', '1', '1', '1', to_date('2023-06-24 17:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-06-24 18:55:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'ep:bicycle', NULL, NULL, 0, '1', '1', '1', '1', to_date('2023-06-10 00:42:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-20 09:23:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2275, '会员配置', '', 2, 0, 2262, 'config', 'fa:archive', 'member/config/index', 'MemberConfig', 0, '1', '1', '1', '', to_date('2023-06-10 02:07:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 23:41:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2276, '会员配置查询', 'member:config:query', 3, 1, 2275, '', '', '', '', 0, '1', '1', '1', '', to_date('2023-06-10 02:07:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:48:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2277, '会员配置保存', 'member:config:save', 3, 2, 2275, '', '', '', '', 0, '1', '1', '1', '', to_date('2023-06-10 02:07:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:49:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2281, '签到配置', '', 2, 2, 2300, 'config', 'ep:calendar', 'member/signin/config/index', 'SignInConfig', 0, '1', '1', '1', '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-20 19:25:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 03:26:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2287, '会员积分', '', 2, 10, 2262, 'record', 'fa:asterisk', 'member/point/record/index', 'PointRecord', 0, '1', '1', '1', '', to_date('2023-06-10 04:18:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 23:42:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 04:18:50', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 04:18:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2293, '签到记录', '', 2, 3, 2300, 'record', 'ep:chicken', 'member/signin/record/index', 'SignInRecord', 0, '1', '1', '1', '', to_date('2023-06-10 04:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-20 19:26:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 04:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 04:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-06-10 04:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-06-10 04:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2300, '会员签到', '', 1, 11, 2262, 'signin', 'ep:alarm-clock', '', '', 0, '1', '1', '1', '1', to_date('2023-06-27 22:49:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-20 09:23:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2301, '回调通知', '', 2, 5, 1117, 'notify', 'ep:mute-notification', 'pay/notify/index', 'PayNotify', 0, '1', '1', '1', '', to_date('2023-07-20 04:41:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-18 23:56:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2302, '支付通知查询', 'pay:notify:query', 3, 1, 2301, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-07-20 04:41:32', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-07-20 04:41:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2303, '拼团活动', '', 2, 3, 2030, 'combination', 'fa:group', '', '', 0, '1', '1', '1', '1', to_date('2023-08-12 17:19:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-12 17:20:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2304, '拼团商品', '', 2, 1, 2303, 'acitivity', 'ep:apple', 'mall/promotion/combination/activity/index', 'PromotionCombinationActivity', 0, '1', '1', '1', '1', to_date('2023-08-12 17:22:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-12 17:22:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2305, '拼团活动查询', 'promotion:combination-activity:query', 3, 1, 2304, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-12 17:54:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-24 11:57:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2306, '拼团活动创建', 'promotion:combination-activity:create', 3, 2, 2304, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-12 17:54:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-12 17:54:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2307, '拼团活动更新', 'promotion:combination-activity:update', 3, 3, 2304, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-12 17:55:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-12 17:55:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2308, '拼团活动删除', 'promotion:combination-activity:delete', 3, 4, 2304, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-12 17:55:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-12 17:55:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2309, '拼团活动关闭', 'promotion:combination-activity:close', 3, 5, 2304, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-12 17:55:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-06 10:51:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2310, '砍价活动', '', 2, 4, 2030, 'bargain', 'ep:box', '', '', 0, '1', '1', '1', '1', to_date('2023-08-13 00:27:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-13 00:27:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2311, '砍价商品', '', 2, 1, 2310, 'activity', 'ep:burger', 'mall/promotion/bargain/activity/index', 'PromotionBargainActivity', 0, '1', '1', '1', '1', to_date('2023-08-13 00:28:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 01:16:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2312, '砍价活动查询', 'promotion:bargain-activity:query', 3, 1, 2311, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-13 00:32:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-13 00:32:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2313, '砍价活动创建', 'promotion:bargain-activity:create', 3, 2, 2311, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-13 00:32:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-13 00:32:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2314, '砍价活动更新', 'promotion:bargain-activity:update', 3, 3, 2311, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-13 00:32:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-13 00:32:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2315, '砍价活动删除', 'promotion:bargain-activity:delete', 3, 4, 2311, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-13 00:34:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-13 00:34:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2316, '砍价活动关闭', 'promotion:bargain-activity:close', 3, 5, 2311, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-13 00:35:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-13 00:35:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2317, '会员管理', '', 2, 0, 2262, 'user', 'ep:avatar', 'member/user/index', 'MemberUser', 0, '1', '1', '1', '', to_date('2023-08-19 04:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-24 00:50:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2318, '会员用户查询', 'member:user:query', 3, 1, 2317, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-19 04:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-19 04:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2319, '会员用户更新', 'member:user:update', 3, 3, 2317, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-19 04:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-19 04:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2320, '会员标签', '', 2, 1, 2262, 'tag', 'ep:collection-tag', 'member/tag/index', 'MemberTag', 0, '1', '1', '1', '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-20 09:23:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2321, '会员标签查询', 'member:tag:query', 3, 1, 2320, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2322, '会员标签创建', 'member:tag:create', 3, 2, 2320, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2323, '会员标签更新', 'member:tag:update', 3, 3, 2320, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2324, '会员标签删除', 'member:tag:delete', 3, 4, 2320, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-20 01:03:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2325, '会员等级', '', 2, 2, 2262, 'level', 'fa:level-up', 'member/level/index', 'MemberLevel', 0, '1', '1', '1', '', to_date('2023-08-22 12:41:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-22 21:47:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2326, '会员等级查询', 'member:level:query', 3, 1, 2325, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2327, '会员等级创建', 'member:level:create', 3, 2, 2325, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2328, '会员等级更新', 'member:level:update', 3, 3, 2325, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2329, '会员等级删除', 'member:level:delete', 3, 4, 2325, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 12:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2330, '会员分组', '', 2, 3, 2262, 'group', 'fa:group', 'member/group/index', 'MemberGroup', 0, '1', '1', '1', '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 23:42:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2331, '用户分组查询', 'member:group:query', 3, 1, 2330, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2332, '用户分组创建', 'member:group:create', 3, 2, 2330, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2333, '用户分组更新', 'member:group:update', 3, 3, 2330, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2334, '用户分组删除', 'member:group:delete', 3, 4, 2330, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-22 13:50:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2335, '用户等级修改', 'member:user:update-level', 3, 5, 2317, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-08-23 16:49:05', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-08-23 16:50:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2336, '商品评论', '', 2, 5, 2000, 'comment', 'ep:comment', 'mall/product/comment/index', 'ProductComment', 0, '1', '1', '1', '1', to_date('2023-08-26 11:03:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-26 11:03:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2337, '评论查询', 'product:comment:query', 3, 1, 2336, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-26 11:04:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-26 11:04:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2338, '添加自评', 'product:comment:create', 3, 2, 2336, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-26 11:04:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-26 11:08:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2339, '商家回复', 'product:comment:update', 3, 3, 2336, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-26 11:04:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-26 11:04:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2340, '显隐评论', 'product:comment:update', 3, 4, 2336, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-08-26 11:04:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-26 11:04:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2341, '优惠劵发送', 'promotion:coupon:send', 3, 2, 2038, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-09-02 00:03:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-02 00:03:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2342, '交易配置', '', 2, 0, 2072, 'config', 'ep:setting', 'mall/trade/config/index', 'TradeConfig', 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:30:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2343, '交易中心配置查询', 'trade:config:query', 3, 1, 2342, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2344, '交易中心配置保存', 'trade:config:save', 3, 2, 2342, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2345, '分销管理', '', 1, 4, 2072, 'brokerage', 'fa-solid:project-diagram', '', '', 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 10:58:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2346, '分销用户', '', 2, 0, 2345, 'brokerage-user', 'fa-solid:user-tie', 'mall/trade/brokerage/user/index', 'TradeBrokerageUser', 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:33:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2347, '分销用户查询', 'trade:brokerage-user:query', 3, 1, 2346, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2348, '分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, 2346, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2349, '分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, 2346, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2350, '分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2351, '分销用户修改推广员', 'trade:brokerage-user:update-bind-user', 3, 5, 2346, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2352, '分销用户清除推广员', 'trade:brokerage-user:clear-bind-user', 3, 6, 2346, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2353, '佣金记录', '', 2, 1, 2345, 'brokerage-record', 'fa:money', 'mall/trade/brokerage/record/index', 'TradeBrokerageRecord', 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:33:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2354, '佣金记录查询', 'trade:brokerage-record:query', 3, 1, 2353, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2355, '佣金提现', '', 2, 2, 2345, 'brokerage-withdraw', 'fa:credit-card', 'mall/trade/brokerage/withdraw/index', 'TradeBrokerageWithdraw', 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:33:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2356, '佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, 2355, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2357, '佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, 2355, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-28 02:46:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2358, '统计中心', '', 1, 75, 2362, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '', to_date('2023-09-30 03:22:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-30 11:54:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2359, '交易统计', '', 2, 4, 2358, 'trade', 'fa-solid:credit-card', 'mall/statistics/trade/index', 'TradeStatistics', 0, '1', '1', '1', '', to_date('2023-09-30 03:22:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:42:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2360, '交易统计查询', 'statistics:trade:query', 3, 1, 2359, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-30 03:22:40', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-30 03:22:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2361, '交易统计导出', 'statistics:trade:export', 3, 2, 2359, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-09-30 03:22:40', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-09-30 03:22:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2362, '商城系统', '', 1, 59, 0, '/mall', 'ep:shop', '', '', 0, '1', '1', '1', '1', to_date('2023-09-30 11:52:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-30 11:52:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2363, '用户积分修改', 'member:user:update-point', 3, 6, 2317, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-01 14:39:43', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-01 14:39:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2364, '用户余额修改', 'member:user:update-balance', 3, 7, 2317, '', '', '', '', 0, '1', '1', '1', '', to_date('2023-10-01 14:39:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-01 22:42:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2365, '优惠劵', '', 1, 2, 2030, 'coupon', 'fa-solid:disease', '', '', 0, '1', '1', '1', '1', to_date('2023-10-03 12:39:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 00:16:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2366, '砍价记录', '', 2, 2, 2310, 'record', 'ep:list', 'mall/promotion/bargain/record/index', 'PromotionBargainRecord', 0, '1', '1', '1', '', to_date('2023-10-05 02:49:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 10:50:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2367, '砍价记录查询', 'promotion:bargain-record:query', 3, 1, 2366, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-05 02:49:06', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-05 02:49:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2368, '助力记录查询', 'promotion:bargain-help:query', 3, 2, 2366, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-10-05 12:27:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-05 12:27:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2369, '拼团记录', 'promotion:combination-record:query', 2, 2, 2303, 'record', 'ep:avatar', 'mall/promotion/combination/record/index.vue', 'PromotionCombinationRecord', 0, '1', '1', '1', '1', to_date('2023-10-08 07:10:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-08 07:34:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2374, '会员统计', '', 2, 2, 2358, 'member', 'ep:avatar', 'mall/statistics/member/index', 'MemberStatistics', 0, '1', '1', '1', '', to_date('2023-10-11 04:39:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:41:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2375, '会员统计查询', 'statistics:member:query', 3, 1, 2374, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-11 04:39:24', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-11 04:39:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2376, '订单核销', 'trade:order:pick-up', 3, 10, 2076, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-10-14 17:11:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-14 17:11:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2377, '文章分类', '', 2, 0, 2387, 'article/category', 'fa:certificate', 'mall/promotion/article/category/index', 'ArticleCategory', 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-16 09:38:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2378, '分类查询', 'promotion:article-category:query', 3, 1, 2377, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2379, '分类创建', 'promotion:article-category:create', 3, 2, 2377, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2380, '分类更新', 'promotion:article-category:update', 3, 3, 2377, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2381, '分类删除', 'promotion:article-category:delete', 3, 4, 2377, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2382, '文章列表', '', 2, 2, 2387, 'article', 'ep:connection', 'mall/promotion/article/index', 'Article', 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-16 09:41:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2383, '文章管理查询', 'promotion:article:query', 3, 1, 2382, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2384, '文章管理创建', 'promotion:article:create', 3, 2, 2382, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2385, '文章管理更新', 'promotion:article:update', 3, 3, 2382, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2386, '文章管理删除', 'promotion:article:delete', 3, 4, 2382, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 01:26:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2387, '内容管理', '', 1, 1, 2030, 'content', 'ep:collection', '', '', 0, '1', '1', '1', '1', to_date('2023-10-16 09:37:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-16 09:37:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2388, '商城首页', '', 2, 1, 2362, 'home', 'ep:home-filled', 'mall/home/index', 'MallHome', 0, '1', '1', '1', '', to_date('2023-10-16 12:10:33', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-16 12:10:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2389, '核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder', 0, '1', '1', '1', '', to_date('2023-10-19 16:09:51', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-19 16:09:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2390, '优惠活动', '', 1, 99, 2030, 'youhui', 'ep:aim', '', '', 0, '1', '1', '1', '1', to_date('2023-10-21 19:23:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-21 19:23:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2391, '客户管理', '', 2, 10, 2397, 'customer', 'fa:address-book-o', 'crm/customer/index', 'CrmCustomer', 0, '1', '1', '1', '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:13:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2392, '客户查询', 'crm:customer:query', 3, 1, 2391, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2393, '客户创建', 'crm:customer:create', 3, 2, 2391, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2394, '客户更新', 'crm:customer:update', 3, 3, 2391, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2395, '客户删除', 'crm:customer:delete', 3, 4, 2391, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2396, '客户导出', 'crm:customer:export', 3, 5, 2391, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 09:04:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2397, 'CRM 系统', '', 1, 200, 0, '/crm', 'ep:avatar', '', '', 0, '1', '1', '1', '1', to_date('2023-10-29 17:08:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 15:37:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2398, '合同管理', '', 2, 50, 2397, 'contract', 'ep:notebook', 'crm/contract/index', 'CrmContract', 0, '1', '1', '1', '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:15:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2399, '合同查询', 'crm:contract:query', 3, 1, 2398, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2400, '合同创建', 'crm:contract:create', 3, 2, 2398, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2401, '合同更新', 'crm:contract:update', 3, 3, 2398, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2402, '合同删除', 'crm:contract:delete', 3, 4, 2398, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2403, '合同导出', 'crm:contract:export', 3, 5, 2398, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 10:50:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2404, '线索管理', '', 2, 8, 2397, 'clue', 'fa:pagelines', 'crm/clue/index', 'CrmClue', 0, '1', '1', '1', '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:15:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2405, '线索查询', 'crm:clue:query', 3, 1, 2404, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2406, '线索创建', 'crm:clue:create', 3, 2, 2404, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2407, '线索更新', 'crm:clue:update', 3, 3, 2404, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2408, '线索删除', 'crm:clue:delete', 3, 4, 2404, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2409, '线索导出', 'crm:clue:export', 3, 5, 2404, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:06:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2410, '商机管理', '', 2, 40, 2397, 'business', 'fa:bus', 'crm/business/index', 'CrmBusiness', 0, '1', '1', '1', '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:14:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2411, '商机查询', 'crm:business:query', 3, 1, 2410, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2412, '商机创建', 'crm:business:create', 3, 2, 2410, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2413, '商机更新', 'crm:business:update', 3, 3, 2410, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2414, '商机删除', 'crm:business:delete', 3, 4, 2410, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2415, '商机导出', 'crm:business:export', 3, 5, 2410, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:12:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2416, '联系人管理', '', 2, 20, 2397, 'contact', 'fa:address-book-o', 'crm/contact/index', 'CrmContact', 0, '1', '1', '1', '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:13:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2417, '联系人查询', 'crm:contact:query', 3, 1, 2416, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2418, '联系人创建', 'crm:contact:create', 3, 2, 2416, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2419, '联系人更新', 'crm:contact:update', 3, 3, 2416, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2420, '联系人删除', 'crm:contact:delete', 3, 4, 2416, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2421, '联系人导出', 'crm:contact:export', 3, 5, 2416, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:14:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2422, '回款管理', '', 2, 60, 2397, 'receivable', 'ep:money', 'crm/receivable/index', 'CrmReceivable', 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:16:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2423, '回款管理查询', 'crm:receivable:query', 3, 1, 2422, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2424, '回款管理创建', 'crm:receivable:create', 3, 2, 2422, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2425, '回款管理更新', 'crm:receivable:update', 3, 3, 2422, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2426, '回款管理删除', 'crm:receivable:delete', 3, 4, 2422, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2427, '回款管理导出', 'crm:receivable:export', 3, 5, 2422, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2428, '回款计划', '', 2, 61, 2397, 'receivable-plan', 'fa:money', 'crm/receivable/plan/index', 'CrmReceivablePlan', 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:16:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2429, '回款计划查询', 'crm:receivable-plan:query', 3, 1, 2428, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2430, '回款计划创建', 'crm:receivable-plan:create', 3, 2, 2428, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2431, '回款计划更新', 'crm:receivable-plan:update', 3, 3, 2428, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2432, '回款计划删除', 'crm:receivable-plan:delete', 3, 4, 2428, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2433, '回款计划导出', 'crm:receivable-plan:export', 3, 5, 2428, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 11:18:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2435, '商城装修', '', 2, 20, 2030, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2436, '装修模板', '', 2, 1, 2435, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2437, '装修模板查询', 'promotion:diy-template:query', 3, 1, 2436, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2438, '装修模板创建', 'promotion:diy-template:create', 3, 2, 2436, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2439, '装修模板更新', 'promotion:diy-template:update', 3, 3, 2436, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2440, '装修模板删除', 'promotion:diy-template:delete', 3, 4, 2436, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2441, '装修模板使用', 'promotion:diy-template:use', 3, 5, 2436, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2442, '装修页面', '', 2, 2, 2435, 'diy-page', 'foundation:page-edit', 'mall/promotion/diy/page/index', 'DiyPage', 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2443, '装修页面查询', 'promotion:diy-page:query', 3, 1, 2442, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2444, '装修页面创建', 'promotion:diy-page:create', 3, 2, 2442, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:26', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2445, '装修页面更新', 'promotion:diy-page:update', 3, 3, 2442, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:26', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2446, '装修页面删除', 'promotion:diy-page:delete', 3, 4, 2442, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-10-29 14:19:26', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-10-29 14:19:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2447, '三方登录', '', 1, 10, 1, 'social', 'fa:rocket', '', '', 0, '1', '1', '1', '1', to_date('2023-11-04 12:12:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 01:14:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2448, '三方应用', '', 2, 1, 2447, 'client', 'ep:set-up', 'views/system/social/client/index.vue', 'SocialClient', 0, '1', '1', '1', '1', to_date('2023-11-04 12:17:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 12:17:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2449, '三方应用查询', 'system:social-client:query', 3, 1, 2448, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-11-04 12:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 12:43:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2450, '三方应用创建', 'system:social-client:create', 3, 2, 2448, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-11-04 12:43:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 12:43:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2451, '三方应用更新', 'system:social-client:update', 3, 3, 2448, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-11-04 12:44:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 12:44:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2452, '三方应用删除', 'system:social-client:delete', 3, 4, 2448, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-11-04 12:44:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 12:44:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2453, '三方用户', 'system:social-user:query', 2, 2, 2447, 'user', 'ep:avatar', 'system/social/user/index.vue', 'SocialUser', 0, '1', '1', '1', '1', to_date('2023-11-04 14:01:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-04 14:01:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, '1', '1', '1', '', to_date('2023-11-13 04:39:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:53:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, '1', '1', '1', '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:34:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-15 14:42:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, '1', '1', '1', '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:35:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, '1', '1', '1', '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:10:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-16 12:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2497, '主子表(ERP)', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, '1', '1', '1', '', to_date('2023-11-16 15:50:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-17 13:19:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2516, '客户公海配置', '', 2, 0, 2524, 'customer-pool-config', 'ep:data-analysis', 'crm/customer/poolConfig/index', 'CrmCustomerPoolConfig', 0, '1', '1', '1', '', to_date('2023-11-18 13:33:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-03 19:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2517, '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, 2516, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-18 13:33:31', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-18 13:33:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2518, '客户限制配置', '', 2, 1, 2524, 'customer-limit-config', 'ep:avatar', 'crm/customer/limitConfig/index', 'CrmCustomerLimitConfig', 0, '1', '1', '1', '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 16:43:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2519, '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, 2518, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2520, '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, 2518, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2521, '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, 2518, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2522, '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, 2518, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2523, '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, 2518, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-11-18 13:33:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2524, '系统配置', '', 1, 999, 2397, 'config', 'ep:connection', '', '', 0, '1', '1', '1', '1', to_date('2023-11-18 21:58:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:14:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, '1', '1', '1', '1', to_date('2023-11-23 19:41:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:02:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2526, '产品管理', '', 2, 80, 2397, 'product', 'fa:product-hunt', 'crm/product/index', 'CrmProduct', 0, '1', '1', '1', '1', to_date('2023-12-05 22:45:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-20 20:36:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2527, '产品查询', 'crm:product:query', 3, 1, 2526, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-05 22:47:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 22:47:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2528, '产品创建', 'crm:product:create', 3, 2, 2526, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-05 22:47:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 22:47:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2529, '产品更新', 'crm:product:update', 3, 3, 2526, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-05 22:48:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 22:48:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2530, '产品删除', 'crm:product:delete', 3, 4, 2526, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-05 22:48:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 22:48:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2531, '产品导出', 'crm:product:export', 3, 5, 2526, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-05 22:48:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-05 22:48:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2532, '产品分类配置', '', 2, 3, 2524, 'product/category', 'fa-solid:window-restore', 'crm/product/category/index', 'CrmProductCategory', 0, '1', '1', '1', '1', to_date('2023-12-06 12:52:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-06 12:52:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2533, '产品分类查询', 'crm:product-category:query', 3, 1, 2532, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-06 12:53:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-06 12:53:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2534, '产品分类创建', 'crm:product-category:create', 3, 2, 2532, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-06 12:53:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-06 12:53:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2535, '产品分类更新', 'crm:product-category:update', 3, 3, 2532, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-06 12:53:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-06 12:53:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2536, '产品分类删除', 'crm:product-category:delete', 3, 4, 2532, '', '', '', '', 0, '1', '1', '1', '1', to_date('2023-12-06 12:54:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-06 12:54:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2543, '关联商机', 'crm:contact:create-business', 3, 10, 2416, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-01-02 17:28:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-02 17:28:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2544, '取关商机', 'crm:contact:delete-business', 3, 11, 2416, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-01-02 17:28:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-02 17:28:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2545, '商品统计', '', 2, 3, 2358, 'product', 'fa:product-hunt', 'mall/statistics/product/index', 'ProductStatistics', 0, '1', '1', '1', '', to_date('2023-12-15 18:54:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 20:41:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2546, '客户公海', '', 2, 30, 2397, 'customer/pool', 'fa-solid:swimming-pool', 'crm/customer/pool/index', 'CrmCustomerPool', 0, '1', '1', '1', '1', to_date('2024-01-15 21:29:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:14:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2547, '订单查询', 'trade:order:query', 3, 1, 2076, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-01-16 08:52:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-16 08:52:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2548, '订单更新', 'trade:order:update', 3, 2, 2076, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-01-16 08:52:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-16 08:52:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2549, '支付&退款案例', '', 2, 1, 2161, 'order', 'fa:paypal', 'pay/demo/order/index', '', 0, '1', '1', '1', '1', to_date('2024-01-18 23:45:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-18 23:47:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2550, '转账案例', '', 2, 2, 2161, 'transfer', 'fa:transgender-alt', 'pay/demo/transfer/index', '', 0, '1', '1', '1', '1', to_date('2024-01-18 23:51:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-01-18 23:51:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2551, '钱包管理', '', 1, 4, 1117, 'wallet', 'ep:wallet', '', '', 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-29 08:58:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2552, '充值套餐', '', 2, 2, 2551, 'wallet-recharge-package', 'fa:leaf', 'pay/wallet/rechargePackage/index', 'WalletRechargePackage', 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2553, '钱包充值套餐查询', 'pay:wallet-recharge-package:query', 3, 1, 2552, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2554, '钱包充值套餐创建', 'pay:wallet-recharge-package:create', 3, 2, 2552, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2555, '钱包充值套餐更新', 'pay:wallet-recharge-package:update', 3, 3, 2552, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2556, '钱包充值套餐删除', 'pay:wallet-recharge-package:delete', 3, 4, 2552, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2557, '钱包余额', '', 2, 1, 2551, 'wallet-balance', 'fa:leaf', 'pay/wallet/balance/index', 'WalletBalance', 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2558, '钱包余额查询', 'pay:wallet:query', 3, 1, 2557, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2559, '转账订单', '', 2, 3, 1117, 'transfer', 'ep:credit-card', 'pay/transfer/index', 'PayTransfer', 0, '1', '1', '1', '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-29 02:32:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2560, '数据统计', '', 1, 200, 2397, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '1', to_date('2024-01-26 22:50:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 20:10:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2561, '排行榜', 'crm:statistics-rank:query', 2, 1, 2560, 'ranking', 'fa:area-chart', 'crm/statistics/rank/index', 'CrmStatisticsRank', 0, '1', '1', '1', '1', to_date('2024-01-26 22:52:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:39:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2562, '客户导入', 'crm:customer:import', 3, 6, 2391, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-01 13:09:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-01 13:09:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2563, 'ERP 系统', '', 1, 300, 0, '/erp', 'fa-solid:store', '', '', 0, '1', '1', '1', '1', to_date('2024-02-04 15:37:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 15:37:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2564, '产品管理', '', 1, 40, 2563, 'product', 'fa:product-hunt', '', '', 0, '1', '1', '1', '1', to_date('2024-02-04 15:38:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 15:38:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2565, '产品信息', '', 2, 0, 2564, 'product', 'fa-solid:apple-alt', 'erp/product/product/index', 'ErpProduct', 0, '1', '1', '1', '', to_date('2024-02-04 07:52:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 14:42:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2566, '产品查询', 'erp:product:query', 3, 1, 2565, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-02-04 07:52:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 17:21:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2567, '产品创建', 'erp:product:create', 3, 2, 2565, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-02-04 07:52:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 17:22:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2568, '产品更新', 'erp:product:update', 3, 3, 2565, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-02-04 07:52:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 17:22:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2569, '产品删除', 'erp:product:delete', 3, 4, 2565, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-02-04 07:52:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 17:22:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2570, '产品导出', 'erp:product:export', 3, 5, 2565, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-02-04 07:52:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 17:22:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2571, '产品分类', '', 2, 1, 2564, 'product-category', 'fa:certificate', 'erp/product/category/index', 'ErpProductCategory', 0, '1', '1', '1', '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 17:24:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2572, '分类查询', 'erp:product-category:query', 3, 1, 2571, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2573, '分类创建', 'erp:product-category:create', 3, 2, 2571, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2574, '分类更新', 'erp:product-category:update', 3, 3, 2571, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2575, '分类删除', 'erp:product-category:delete', 3, 4, 2571, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2576, '分类导出', 'erp:product-category:export', 3, 5, 2571, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 09:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2577, '产品单位', '', 2, 2, 2564, 'unit', 'ep:opportunity', 'erp/product/unit/index', 'ErpProductUnit', 0, '1', '1', '1', '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-04 19:54:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2578, '单位查询', 'erp:product-unit:query', 3, 1, 2577, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2579, '单位创建', 'erp:product-unit:create', 3, 2, 2577, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2580, '单位更新', 'erp:product-unit:update', 3, 3, 2577, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2581, '单位删除', 'erp:product-unit:delete', 3, 4, 2577, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2582, '单位导出', 'erp:product-unit:export', 3, 5, 2577, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 11:54:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2583, '库存管理', '', 1, 30, 2563, 'stock', 'fa:window-restore', '', '', 0, '1', '1', '1', '1', to_date('2024-02-05 00:29:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 00:29:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2584, '仓库信息', '', 2, 0, 2583, 'warehouse', 'ep:house', 'erp/stock/warehouse/index', 'ErpWarehouse', 0, '1', '1', '1', '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 01:12:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2585, '仓库查询', 'erp:warehouse:query', 3, 1, 2584, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2586, '仓库创建', 'erp:warehouse:create', 3, 2, 2584, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2587, '仓库更新', 'erp:warehouse:update', 3, 3, 2584, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2588, '仓库删除', 'erp:warehouse:delete', 3, 4, 2584, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2589, '仓库导出', 'erp:warehouse:export', 3, 5, 2584, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-04 17:12:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2590, '产品库存', '', 2, 1, 2583, 'stock', 'ep:coffee', 'erp/stock/stock/index', 'ErpStock', 0, '1', '1', '1', '', to_date('2024-02-05 06:40:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-05 14:42:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2591, '库存查询', 'erp:stock:query', 3, 1, 2590, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 06:40:50', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 06:40:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2592, '库存导出', 'erp:stock:export', 3, 5, 2590, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 06:40:50', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 06:40:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2593, '出入库明细', '', 2, 2, 2583, 'record', 'fa-solid:blog', 'erp/stock/record/index', 'ErpStockRecord', 0, '1', '1', '1', '', to_date('2024-02-05 10:27:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-06 17:26:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2594, '库存明细查询', 'erp:stock-record:query', 3, 1, 2593, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 10:27:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 10:27:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2595, '库存明细导出', 'erp:stock-record:export', 3, 5, 2593, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 10:27:21', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 10:27:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2596, '其它入库', '', 2, 3, 2583, 'in', 'ep:zoom-in', 'erp/stock/in/index', 'ErpStockIn', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 19:06:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2597, '其它入库单查询', 'erp:stock-in:query', 3, 1, 2596, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2598, '其它入库单创建', 'erp:stock-in:create', 3, 2, 2596, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2599, '其它入库单更新', 'erp:stock-in:update', 3, 3, 2596, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2600, '其它入库单删除', 'erp:stock-in:delete', 3, 4, 2596, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2601, '其它入库单导出', 'erp:stock-in:export', 3, 5, 2596, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2602, '采购管理', '', 1, 10, 2563, 'purchase', 'fa:buysellads', '', '', 0, '1', '1', '1', '1', to_date('2024-02-06 16:01:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-06 16:01:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2603, '供应商信息', '', 2, 4, 2602, 'supplier', 'fa:superpowers', 'erp/purchase/supplier/index', 'ErpSupplier', 0, '1', '1', '1', '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-06 16:22:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2604, '供应商查询', 'erp:supplier:query', 3, 1, 2603, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2605, '供应商创建', 'erp:supplier:create', 3, 2, 2603, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2606, '供应商更新', 'erp:supplier:update', 3, 3, 2603, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2607, '供应商删除', 'erp:supplier:delete', 3, 4, 2603, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2608, '供应商导出', 'erp:supplier:export', 3, 5, 2603, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-06 08:21:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2609, '其它入库单审批', 'erp:stock-in:update-status', 3, 6, 2596, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2610, '其它出库', '', 2, 4, 2583, 'out', 'ep:zoom-out', 'erp/stock/out/index', 'ErpStockOut', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 19:06:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2611, '其它出库单查询', 'erp:stock-out:query', 3, 1, 2610, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 06:43:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2612, '其它出库单创建', 'erp:stock-out:create', 3, 2, 2610, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 06:43:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2613, '其它出库单更新', 'erp:stock-out:update', 3, 3, 2610, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 06:43:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2614, '其它出库单删除', 'erp:stock-out:delete', 3, 4, 2610, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 06:43:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2615, '其它出库单导出', 'erp:stock-out:export', 3, 5, 2610, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 06:43:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2616, '其它出库单审批', 'erp:stock-out:update-status', 3, 6, 2610, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 06:43:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2617, '销售管理', '', 1, 20, 2563, 'sale', 'fa:sellsy', '', '', 0, '1', '1', '1', '1', to_date('2024-02-07 15:12:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 15:12:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2618, '客户信息', '', 2, 4, 2617, 'customer', 'ep:avatar', 'erp/sale/customer/index', 'ErpCustomer', 0, '1', '1', '1', '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-07 15:22:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2619, '客户查询', 'erp:customer:query', 3, 1, 2618, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2620, '客户创建', 'erp:customer:create', 3, 2, 2618, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2621, '客户更新', 'erp:customer:update', 3, 3, 2618, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2622, '客户删除', 'erp:customer:delete', 3, 4, 2618, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2623, '客户导出', 'erp:customer:export', 3, 5, 2618, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 07:21:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2624, '库存调拨', '', 2, 5, 2583, 'move', 'ep:folder-remove', 'erp/stock/move/index', 'ErpStockMove', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-16 18:53:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2625, '库存调度单查询', 'erp:stock-move:query', 3, 1, 2624, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2626, '库存调度单创建', 'erp:stock-move:create', 3, 2, 2624, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2627, '库存调度单更新', 'erp:stock-move:update', 3, 3, 2624, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2628, '库存调度单删除', 'erp:stock-move:delete', 3, 4, 2624, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2629, '库存调度单导出', 'erp:stock-move:export', 3, 5, 2624, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2630, '库存调度单审批', 'erp:stock-move:update-status', 3, 6, 2624, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:13:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2631, '库存盘点', '', 2, 6, 2583, 'check', 'ep:circle-check-filled', 'erp/stock/check/index', 'ErpStockCheck', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-08 08:31:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2632, '库存盘点单查询', 'erp:stock-check:query', 3, 1, 2631, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2633, '库存盘点单创建', 'erp:stock-check:create', 3, 2, 2631, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2634, '库存盘点单更新', 'erp:stock-check:update', 3, 3, 2631, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2635, '库存盘点单删除', 'erp:stock-check:delete', 3, 4, 2631, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2636, '库存盘点单导出', 'erp:stock-check:export', 3, 5, 2631, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2637, '库存盘点单审批', 'erp:stock-check:update-status', 3, 6, 2631, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:13:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2638, '销售订单', '', 2, 1, 2617, 'order', 'fa:first-order', 'erp/sale/order/index', 'ErpSaleOrder', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-10 21:59:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2639, '销售订单查询', 'erp:sale-order:query', 3, 1, 2638, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2640, '销售订单创建', 'erp:sale-order:create', 3, 2, 2638, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2641, '销售订单更新', 'erp:sale-order:update', 3, 3, 2638, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2642, '销售订单删除', 'erp:sale-order:delete', 3, 4, 2638, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2643, '销售订单导出', 'erp:sale-order:export', 3, 5, 2638, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2644, '销售订单审批', 'erp:sale-order:update-status', 3, 6, 2638, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:13:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2645, '财务管理', '', 1, 50, 2563, 'finance', 'ep:money', '', '', 0, '1', '1', '1', '1', to_date('2024-02-10 08:05:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-10 08:06:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2646, '结算账户', '', 2, 10, 2645, 'account', 'fa:universal-access', 'erp/finance/account/index', 'ErpAccount', 0, '1', '1', '1', '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-14 08:24:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2647, '结算账户查询', 'erp:account:query', 3, 1, 2646, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2648, '结算账户创建', 'erp:account:create', 3, 2, 2646, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2649, '结算账户更新', 'erp:account:update', 3, 3, 2646, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2650, '结算账户删除', 'erp:account:delete', 3, 4, 2646, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2651, '结算账户导出', 'erp:account:export', 3, 5, 2646, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-10 00:15:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2652, '销售出库', '', 2, 2, 2617, 'out', 'ep:sold-out', 'erp/sale/out/index', 'ErpSaleOut', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-10 22:02:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2653, '销售出库查询', 'erp:sale-out:query', 3, 1, 2652, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2654, '销售出库创建', 'erp:sale-out:create', 3, 2, 2652, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2655, '销售出库更新', 'erp:sale-out:update', 3, 3, 2652, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2656, '销售出库删除', 'erp:sale-out:delete', 3, 4, 2652, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2657, '销售出库导出', 'erp:sale-out:export', 3, 5, 2652, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2658, '销售出库审批', 'erp:sale-out:update-status', 3, 6, 2652, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:13:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2659, '销售退货', '', 2, 3, 2617, 'return', 'fa-solid:bone', 'erp/sale/return/index', 'ErpSaleReturn', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-12 06:12:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2660, '销售退货查询', 'erp:sale-return:query', 3, 1, 2659, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2661, '销售退货创建', 'erp:sale-return:create', 3, 2, 2659, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2662, '销售退货更新', 'erp:sale-return:update', 3, 3, 2659, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2663, '销售退货删除', 'erp:sale-return:delete', 3, 4, 2659, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2664, '销售退货导出', 'erp:sale-return:export', 3, 5, 2659, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:12:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2665, '销售退货审批', 'erp:sale-return:update-status', 3, 6, 2659, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-07 11:13:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2666, '采购订单', '', 2, 1, 2602, 'order', 'fa-solid:border-all', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-12 08:51:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2667, '采购订单查询', 'erp:purchase-order:query', 3, 1, 2666, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2668, '采购订单创建', 'erp:purchase-order:create', 3, 2, 2666, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2669, '采购订单更新', 'erp:purchase-order:update', 3, 3, 2666, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2670, '采购订单删除', 'erp:purchase-order:delete', 3, 4, 2666, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2671, '采购订单导出', 'erp:purchase-order:export', 3, 5, 2666, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2672, '采购订单审批', 'erp:purchase-order:update-status', 3, 6, 2666, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2673, '采购入库', '', 2, 2, 2602, 'in', 'fa-solid:gopuram', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-12 11:19:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2674, '采购入库查询', 'erp:purchase-in:query', 3, 1, 2673, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2675, '采购入库创建', 'erp:purchase-in:create', 3, 2, 2673, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2676, '采购入库更新', 'erp:purchase-in:update', 3, 3, 2673, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2677, '采购入库删除', 'erp:purchase-in:delete', 3, 4, 2673, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2678, '采购入库导出', 'erp:purchase-in:export', 3, 5, 2673, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2679, '采购入库审批', 'erp:purchase-in:update-status', 3, 6, 2673, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2680, '采购退货', '', 2, 3, 2602, 'return', 'ep:minus', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-12 20:51:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2681, '采购退货查询', 'erp:purchase-return:query', 3, 1, 2680, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2682, '采购退货创建', 'erp:purchase-return:create', 3, 2, 2680, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2683, '采购退货更新', 'erp:purchase-return:update', 3, 3, 2680, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2684, '采购退货删除', 'erp:purchase-return:delete', 3, 4, 2680, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2685, '采购退货导出', 'erp:purchase-return:export', 3, 5, 2680, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2686, '采购退货审批', 'erp:purchase-return:update-status', 3, 6, 2680, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2687, '付款单', '', 2, 1, 2645, 'payment', 'ep:caret-right', 'erp/finance/payment/index', 'ErpFinancePayment', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-14 08:24:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2688, '付款单查询', 'erp:finance-payment:query', 3, 1, 2687, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2689, '付款单创建', 'erp:finance-payment:create', 3, 2, 2687, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2690, '付款单更新', 'erp:finance-payment:update', 3, 3, 2687, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2691, '付款单删除', 'erp:finance-payment:delete', 3, 4, 2687, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2692, '付款单导出', 'erp:finance-payment:export', 3, 5, 2687, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2693, '付款单审批', 'erp:finance-payment:update-status', 3, 6, 2687, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2694, '收款单', '', 2, 2, 2645, 'receipt', 'ep:expand', 'erp/finance/receipt/index', 'ErpFinanceReceipt', 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-15 19:35:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2695, '收款单查询', 'erp:finance-receipt:query', 3, 1, 2694, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2696, '收款单创建', 'erp:finance-receipt:create', 3, 2, 2694, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2697, '收款单更新', 'erp:finance-receipt:update', 3, 3, 2694, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:44:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2698, '收款单删除', 'erp:finance-receipt:delete', 3, 4, 2694, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2699, '收款单导出', 'erp:finance-receipt:export', 3, 5, 2694, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2700, '收款单审批', 'erp:finance-receipt:update-status', 3, 6, 2694, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-02-05 16:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-02-12 00:45:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2701, '待办事项', '', 2, 0, 2397, 'backlog', 'fa-solid:tasks', 'crm/backlog/index', 'CrmBacklog', 0, '1', '1', '1', '1', to_date('2024-02-17 17:17:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-17 17:17:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2702, 'ERP 首页', 'erp:statistics:query', 2, 0, 2563, 'home', 'ep:home-filled', 'erp/home/index.vue', 'ErpHome', 0, '1', '1', '1', '1', to_date('2024-02-18 16:49:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-26 21:12:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2703, '商机状态配置', '', 2, 4, 2524, 'business-status', 'fa-solid:charging-station', 'crm/business/status/index', 'CrmBusinessStatus', 0, '1', '1', '1', '1', to_date('2024-02-21 20:15:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-21 20:15:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2704, '商机状态查询', 'crm:business-status:query', 3, 1, 2703, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-21 20:35:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-21 20:36:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2705, '商机状态创建', 'crm:business-status:create', 3, 2, 2703, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-21 20:35:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-21 20:35:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2706, '商机状态更新', 'crm:business-status:update', 3, 3, 2703, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-21 20:36:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-21 20:36:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2707, '商机状态删除', 'crm:business-status:delete', 3, 4, 2703, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-21 20:36:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-21 20:36:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2708, '合同配置', '', 2, 5, 2524, 'contract-config', 'ep:connection', 'crm/contract/config/index', 'CrmContractConfig', 0, '1', '1', '1', '1', to_date('2024-02-24 16:44:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 16:44:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2709, '客户公海配置查询', 'crm:customer-pool-config:query', 3, 2, 2516, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-24 16:45:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 16:45:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2710, '合同配置更新', 'crm:contract-config:update', 3, 1, 2708, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-24 16:45:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 16:45:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2711, '合同配置查询', 'crm:contract-config:query', 3, 2, 2708, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-02-24 16:46:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 16:46:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2712, '客户分析', 'crm:statistics-customer:query', 2, 0, 2560, 'customer', 'ep:avatar', 'views/crm/statistics/customer/index.vue', 'CrmStatisticsCustomer', 0, '1', '1', '1', '1', to_date('2024-03-09 16:43:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, '1', '1', '1', '1', to_date('2024-03-17 21:50:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:55:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, '1', '1', '1', '', to_date('2024-03-08 02:00:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-21 23:51:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-03-08 02:00:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-19 14:36:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-03-08 02:00:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-19 14:36:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-03-08 02:00:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-19 14:36:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, '1', '1', '1', '', to_date('2024-03-08 02:00:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-19 14:36:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, '1', '0', '1', '1', to_date('2024-03-19 19:46:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:03:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, '1', '1', '1', '1', to_date('2024-03-21 23:57:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-21 23:57:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-03-22 08:18:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-22 08:19:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-03-22 08:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-22 08:19:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, '1', '1', '1', '1', to_date('2024-03-22 08:43:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-22 08:43:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-03-22 08:43:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-22 08:43:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, '1', '1', '1', '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 13:13:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 16:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, '1', '1', '1', '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-23 19:43:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, '1', '1', '1', '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2024-03-09 22:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2736, '员工业绩', 'crm:statistics-performance:query', 2, 3, 2560, 'performance', 'ep:dish-dot', 'crm/statistics/performance/index', 'CrmStatisticsPerformance', 0, '1', '1', '1', '1', to_date('2024-04-05 13:49:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2737, '客户画像', 'crm:statistics-portrait:query', 2, 4, 2560, 'portrait', 'ep:picture', 'crm/statistics/portrait/index', 'CrmStatisticsPortrait', 0, '1', '1', '1', '1', to_date('2024-04-05 13:57:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:42:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2738, '销售漏斗', 'crm:statistics-funnel:query', 2, 5, 2560, 'funnel', 'ep:grape', 'crm/statistics/funnel/index', 'CrmStatisticsFunnel', 0, '1', '1', '1', '1', to_date('2024-04-13 10:53:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:39:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2739, '消息中心', '', 1, 7, 1, 'messages', 'ep:chat-dot-round', '', '', 0, '1', '1', '1', '1', to_date('2024-04-22 23:54:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 09:36:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, '1', '1', '1', '1', to_date('2024-04-23 00:04:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-23 00:04:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2741, '领取公海客户', 'crm:customer:receive', 3, 1, 2546, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:47:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:47:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2742, '分配公海客户', 'crm:customer:distribute', 3, 2, 2546, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:48:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:48:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2743, '商品统计查询', 'statistics:product:query', 3, 1, 2545, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:50:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:50:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2744, '商品统计导出', 'statistics:product:export', 3, 2, 2545, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:50:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:50:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2745, '支付渠道查询', 'pay:channel:query', 3, 10, 1126, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:53:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:53:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2746, '支付渠道创建', 'pay:channel:create', 3, 11, 1126, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2747, '支付渠道更新', 'pay:channel:update', 3, 12, 1126, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:53:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:53:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2748, '支付渠道删除', 'pay:channel:delete', 3, 13, 1126, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:54:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:54:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2749, '商品收藏查询', 'product:favorite:query', 3, 10, 2014, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:55:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:55:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2750, '商品浏览查询', 'product:browse-history:query', 3, 20, 2014, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:57:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:57:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2751, '售后同意', 'trade:after-sale:agree', 3, 2, 2073, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:58:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:58:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2752, '售后不同意', 'trade:after-sale:disagree', 3, 3, 2073, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 19:59:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 19:59:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2753, '售后确认退货', 'trade:after-sale:receive', 3, 4, 2073, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 20:00:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 20:00:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2754, '售后确认退款', 'trade:after-sale:refund', 3, 5, 2073, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 20:00:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 20:00:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2755, '删除项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 20:01:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 20:01:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2756, '会员等级记录查询', 'member:level-record:query', 3, 10, 2325, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 20:02:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 20:02:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2757, '会员经验记录查询', 'member:experience-record:query', 3, 11, 2325, '', '', '', '', 0, '1', '1', '1', '1', to_date('2024-04-24 20:02:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-24 20:02:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_menu_seq + START WITH 2758; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +CREATE TABLE system_notice +( + id number NOT NULL, + title varchar2(50) NOT NULL, + content clob NOT NULL, + type smallint NOT NULL, + status smallint DEFAULT 0 NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_notice + ADD CONSTRAINT pk_system_notice PRIMARY KEY (id); + +COMMENT ON COLUMN system_notice.id IS '公告ID'; +COMMENT ON COLUMN system_notice.title IS '公告标题'; +COMMENT ON COLUMN system_notice.content IS '公告内容'; +COMMENT ON COLUMN system_notice.type IS '公告类型(1通知 2公告)'; +COMMENT ON COLUMN system_notice.status IS '公告状态(0正常 1关闭)'; +COMMENT ON COLUMN system_notice.creator IS '创建者'; +COMMENT ON COLUMN system_notice.create_time IS '创建时间'; +COMMENT ON COLUMN system_notice.updater IS '更新者'; +COMMENT ON COLUMN system_notice.update_time IS '更新时间'; +COMMENT ON COLUMN system_notice.deleted IS '是否删除'; +COMMENT ON COLUMN system_notice.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notice IS '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +-- @formatter:off +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '芋道的公众', '

新版本内容133

', 1, 0, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-04 21:00:20', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '维护通知:2018-07-01 系统凌晨维护', '

11112222

', 2, 1, 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 20:07:26', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', to_date('2022-02-22 01:01:25', 'SYYYY-MM-DD HH24:MI:SS'), '110', to_date('2022-02-22 01:01:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_notice_seq + START WITH 5; + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +CREATE TABLE system_notify_message +( + id number NOT NULL, + user_id number NOT NULL, + user_type smallint NOT NULL, + template_id number NOT NULL, + template_code varchar2(64) NOT NULL, + template_nickname varchar2(63) NOT NULL, + template_content varchar2(1024) NOT NULL, + template_type number NOT NULL, + template_params varchar2(255) NOT NULL, + read_status number(1, 0) NOT NULL, + read_time date DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_notify_message + ADD CONSTRAINT pk_system_notify_message PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_message.id IS '用户ID'; +COMMENT ON COLUMN system_notify_message.user_id IS '用户id'; +COMMENT ON COLUMN system_notify_message.user_type IS '用户类型'; +COMMENT ON COLUMN system_notify_message.template_id IS '模版编号'; +COMMENT ON COLUMN system_notify_message.template_code IS '模板编码'; +COMMENT ON COLUMN system_notify_message.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_notify_message.template_content IS '模版内容'; +COMMENT ON COLUMN system_notify_message.template_type IS '模版类型'; +COMMENT ON COLUMN system_notify_message.template_params IS '模版参数'; +COMMENT ON COLUMN system_notify_message.read_status IS '是否已读'; +COMMENT ON COLUMN system_notify_message.read_time IS '阅读时间'; +COMMENT ON COLUMN system_notify_message.creator IS '创建者'; +COMMENT ON COLUMN system_notify_message.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_message.updater IS '更新者'; +COMMENT ON COLUMN system_notify_message.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_message.deleted IS '是否删除'; +COMMENT ON COLUMN system_notify_message.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notify_message IS '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +-- @formatter:off +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', to_date('2023-02-10 00:47:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 11:44:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-10 00:47:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', to_date('2023-02-10 00:47:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 11:45:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-10 00:47:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 103, 2, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{"name":"哈哈"}', '0', NULL, '1', to_date('2023-01-28 21:02:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 21:02:20', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', to_date('2023-02-10 00:47:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 22:21:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-10 00:47:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', to_date('2023-01-29 10:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 22:22:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-29 10:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 1, 2, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{"name":"2","what":"3"}', '1', to_date('2023-01-29 10:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 23:45:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-29 10:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 1, 2, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{"name":"123"}', '1', to_date('2023-01-29 10:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-28 23:50:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-29 10:52:06', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-28 08:35:46","price":"0.09"}', '0', NULL, '1', to_date('2023-09-28 16:36:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-09-28 16:36:22', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-30 20:59:40","price":"1.00"}', '0', NULL, '1', to_date('2023-10-03 12:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-10-03 12:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_notify_message_seq + START WITH 11; + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +CREATE TABLE system_notify_template +( + id number NOT NULL, + name varchar2(63) NOT NULL, + code varchar2(64) NOT NULL, + nickname varchar2(255) NOT NULL, + content varchar2(1024) NOT NULL, + type smallint NOT NULL, + params varchar2(255) DEFAULT NULL NULL, + status smallint NOT NULL, + remark varchar2(255) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_notify_template + ADD CONSTRAINT pk_system_notify_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_template.id IS '主键'; +COMMENT ON COLUMN system_notify_template.name IS '模板名称'; +COMMENT ON COLUMN system_notify_template.code IS '模版编码'; +COMMENT ON COLUMN system_notify_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_notify_template.content IS '模版内容'; +COMMENT ON COLUMN system_notify_template.type IS '类型'; +COMMENT ON COLUMN system_notify_template.params IS '参数数组'; +COMMENT ON COLUMN system_notify_template.status IS '状态'; +COMMENT ON COLUMN system_notify_template.remark IS '备注'; +COMMENT ON COLUMN system_notify_template.creator IS '创建者'; +COMMENT ON COLUMN system_notify_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_template.updater IS '更新者'; +COMMENT ON COLUMN system_notify_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_template.deleted IS '是否删除'; +COMMENT ON TABLE system_notify_template IS '站内信模板表'; + +CREATE SEQUENCE system_notify_template_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +CREATE TABLE system_oauth2_access_token +( + id number NOT NULL, + user_id number NOT NULL, + user_type smallint NOT NULL, + user_info varchar2(512) NOT NULL, + access_token varchar2(255) NOT NULL, + refresh_token varchar2(32) NOT NULL, + client_id varchar2(255) NOT NULL, + scopes varchar2(255) DEFAULT NULL NULL, + expires_time date NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_oauth2_access_token + ADD CONSTRAINT pk_system_oauth2_access_token PRIMARY KEY (id); + +CREATE INDEX idx_system_oauth2_access_token_01 ON system_oauth2_access_token (access_token); +CREATE INDEX idx_system_oauth2_access_token_02 ON system_oauth2_access_token (refresh_token); + +COMMENT ON COLUMN system_oauth2_access_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_access_token.user_info IS '用户信息'; +COMMENT ON COLUMN system_oauth2_access_token.access_token IS '访问令牌'; +COMMENT ON COLUMN system_oauth2_access_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_access_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_access_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_access_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_access_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_access_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_access_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_access_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_access_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_access_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_access_token IS 'OAuth2 访问令牌'; + +CREATE SEQUENCE system_oauth2_access_token_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +CREATE TABLE system_oauth2_approve +( + id number NOT NULL, + user_id number NOT NULL, + user_type smallint NOT NULL, + client_id varchar2(255) NOT NULL, + scope varchar2(255) DEFAULT '' NULL, + approved number(1, 0) DEFAULT '0' NOT NULL, + expires_time date NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_oauth2_approve + ADD CONSTRAINT pk_system_oauth2_approve PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_approve.id IS '编号'; +COMMENT ON COLUMN system_oauth2_approve.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_approve.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_approve.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_approve.scope IS '授权范围'; +COMMENT ON COLUMN system_oauth2_approve.approved IS '是否接受'; +COMMENT ON COLUMN system_oauth2_approve.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_approve.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_approve.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_approve.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_approve.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_approve.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_approve.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_approve IS 'OAuth2 批准表'; + +CREATE SEQUENCE system_oauth2_approve_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +CREATE TABLE system_oauth2_client +( + id number NOT NULL, + client_id varchar2(255) NOT NULL, + secret varchar2(255) NOT NULL, + name varchar2(255) NOT NULL, + logo varchar2(255) NOT NULL, + description varchar2(255) DEFAULT NULL NULL, + status smallint NOT NULL, + access_token_validity_seconds number NOT NULL, + refresh_token_validity_seconds number NOT NULL, + redirect_uris varchar2(255) NOT NULL, + authorized_grant_types varchar2(255) NOT NULL, + scopes varchar2(255) DEFAULT NULL NULL, + auto_approve_scopes varchar2(255) DEFAULT NULL NULL, + authorities varchar2(255) DEFAULT NULL NULL, + resource_ids varchar2(255) DEFAULT NULL NULL, + additional_information varchar2(4000) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_oauth2_client + ADD CONSTRAINT pk_system_oauth2_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_client.id IS '编号'; +COMMENT ON COLUMN system_oauth2_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_client.secret IS '客户端密钥'; +COMMENT ON COLUMN system_oauth2_client.name IS '应用名'; +COMMENT ON COLUMN system_oauth2_client.logo IS '应用图标'; +COMMENT ON COLUMN system_oauth2_client.description IS '应用描述'; +COMMENT ON COLUMN system_oauth2_client.status IS '状态'; +COMMENT ON COLUMN system_oauth2_client.access_token_validity_seconds IS '访问令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.refresh_token_validity_seconds IS '刷新令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.redirect_uris IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_client.authorized_grant_types IS '授权类型'; +COMMENT ON COLUMN system_oauth2_client.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_client.auto_approve_scopes IS '自动通过的授权范围'; +COMMENT ON COLUMN system_oauth2_client.authorities IS '权限'; +COMMENT ON COLUMN system_oauth2_client.resource_ids IS '资源'; +COMMENT ON COLUMN system_oauth2_client.additional_information IS '附加信息'; +COMMENT ON COLUMN system_oauth2_client.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_client.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_client.deleted IS '是否删除'; +COMMENT ON TABLE system_oauth2_client IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +-- @formatter:off +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 2592000, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', '[]', '["user.read","user.write"]', '[]', '{}', '1', to_date('2022-05-11 21:47:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-22 16:31:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', '啦啦啦啦', 0, 1800, 43200, '["https://www.iocoder.cn"]', '["password","authorization_code","implicit"]', '["user_info","projects"]', '["user_info"]', '[]', '[]', '{}', '1', to_date('2022-05-12 00:28:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 21:01:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["authorization_code","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', to_date('2022-09-29 13:28:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-29 13:28:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["password","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', to_date('2022-10-04 17:40:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-10-04 20:31:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_oauth2_client_seq + START WITH 43; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +CREATE TABLE system_oauth2_code +( + id number NOT NULL, + user_id number NOT NULL, + user_type smallint NOT NULL, + code varchar2(32) NOT NULL, + client_id varchar2(255) NOT NULL, + scopes varchar2(255) DEFAULT '' NULL, + expires_time date NOT NULL, + redirect_uri varchar2(255) DEFAULT NULL NULL, + state varchar2(255) DEFAULT '' NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_oauth2_code + ADD CONSTRAINT pk_system_oauth2_code PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_code.id IS '编号'; +COMMENT ON COLUMN system_oauth2_code.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_code.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_code.code IS '授权码'; +COMMENT ON COLUMN system_oauth2_code.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_code.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_code.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_code.redirect_uri IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_code.state IS '状态'; +COMMENT ON COLUMN system_oauth2_code.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_code.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_code IS 'OAuth2 授权码表'; + +CREATE SEQUENCE system_oauth2_code_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +CREATE TABLE system_oauth2_refresh_token +( + id number NOT NULL, + user_id number NOT NULL, + refresh_token varchar2(32) NOT NULL, + user_type smallint NOT NULL, + client_id varchar2(255) NOT NULL, + scopes varchar2(255) DEFAULT NULL NULL, + expires_time date NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_oauth2_refresh_token + ADD CONSTRAINT pk_system_oauth2_refresh_token PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_refresh_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_refresh_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_refresh_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_refresh_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_refresh_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_refresh_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_refresh_token IS 'OAuth2 刷新令牌'; + +CREATE SEQUENCE system_oauth2_refresh_token_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +CREATE TABLE system_operate_log +( + id number NOT NULL, + trace_id varchar2(64) DEFAULT '' NULL, + user_id number NOT NULL, + user_type smallint DEFAULT 0 NOT NULL, + type varchar2(50) NOT NULL, + sub_type varchar2(50) NOT NULL, + biz_id number NOT NULL, + action varchar2(2000) DEFAULT '' NULL, + extra varchar2(2000) DEFAULT '' NULL, + request_method varchar2(16) DEFAULT '' NULL, + request_url varchar2(255) DEFAULT '' NULL, + user_ip varchar2(50) DEFAULT NULL NULL, + user_agent varchar2(200) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_operate_log + ADD CONSTRAINT pk_system_operate_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_operate_log.id IS '日志主键'; +COMMENT ON COLUMN system_operate_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_operate_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_operate_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_operate_log.type IS '操作模块类型'; +COMMENT ON COLUMN system_operate_log.sub_type IS '操作名'; +COMMENT ON COLUMN system_operate_log.biz_id IS '操作数据模块编号'; +COMMENT ON COLUMN system_operate_log.action IS '操作内容'; +COMMENT ON COLUMN system_operate_log.extra IS '拓展字段'; +COMMENT ON COLUMN system_operate_log.request_method IS '请求方法名'; +COMMENT ON COLUMN system_operate_log.request_url IS '请求地址'; +COMMENT ON COLUMN system_operate_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_operate_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_operate_log.creator IS '创建者'; +COMMENT ON COLUMN system_operate_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_operate_log.updater IS '更新者'; +COMMENT ON COLUMN system_operate_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_operate_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_operate_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_operate_log IS '操作日志记录 V2 版本'; + +CREATE SEQUENCE system_operate_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +CREATE TABLE system_post +( + id number NOT NULL, + code varchar2(64) NOT NULL, + name varchar2(50) NOT NULL, + sort number NOT NULL, + status smallint NOT NULL, + remark varchar2(500) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_post + ADD CONSTRAINT pk_system_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_post.id IS '岗位ID'; +COMMENT ON COLUMN system_post.code IS '岗位编码'; +COMMENT ON COLUMN system_post.name IS '岗位名称'; +COMMENT ON COLUMN system_post.sort IS '显示顺序'; +COMMENT ON COLUMN system_post.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_post.remark IS '备注'; +COMMENT ON COLUMN system_post.creator IS '创建者'; +COMMENT ON COLUMN system_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_post.updater IS '更新者'; +COMMENT ON COLUMN system_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_post IS '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +-- @formatter:off +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', to_date('2021-01-06 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-11 15:19:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-15 09:18:20', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 10:04:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 'HR', '人力资源', 5, 0, '', '1', to_date('2024-03-24 20:45:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-24 20:45:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_post_seq + START WITH 6; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +CREATE TABLE system_role +( + id number NOT NULL, + name varchar2(30) NOT NULL, + code varchar2(100) NOT NULL, + sort number NOT NULL, + data_scope smallint DEFAULT 1 NOT NULL, + data_scope_dept_ids varchar2(500) DEFAULT '' NULL, + status smallint NOT NULL, + type smallint NOT NULL, + remark varchar2(500) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_role + ADD CONSTRAINT pk_system_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_role.id IS '角色ID'; +COMMENT ON COLUMN system_role.name IS '角色名称'; +COMMENT ON COLUMN system_role.code IS '角色权限字符串'; +COMMENT ON COLUMN system_role.sort IS '显示顺序'; +COMMENT ON COLUMN system_role.data_scope IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT ON COLUMN system_role.data_scope_dept_ids IS '数据范围(指定部门数组)'; +COMMENT ON COLUMN system_role.status IS '角色状态(0正常 1停用)'; +COMMENT ON COLUMN system_role.type IS '角色类型'; +COMMENT ON COLUMN system_role.remark IS '备注'; +COMMENT ON COLUMN system_role.creator IS '创建者'; +COMMENT ON COLUMN system_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_role.updater IS '更新者'; +COMMENT ON COLUMN system_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role IS '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +-- @formatter:off +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-22 05:08:21', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', to_date('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-02-22 05:08:20', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', to_date('2024-02-24 10:51:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-02-24 02:51:32', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '我想测试', '', to_date('2021-01-06 13:49:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-24 22:22:45', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_role_seq + START WITH 112; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +CREATE TABLE system_role_menu +( + id number NOT NULL, + role_id number NOT NULL, + menu_id number NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_role_menu + ADD CONSTRAINT pk_system_role_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_role_menu.id IS '自增编号'; +COMMENT ON COLUMN system_role_menu.role_id IS '角色ID'; +COMMENT ON COLUMN system_role_menu.menu_id IS '菜单ID'; +COMMENT ON COLUMN system_role_menu.creator IS '创建者'; +COMMENT ON COLUMN system_role_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_role_menu.updater IS '更新者'; +COMMENT ON COLUMN system_role_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_role_menu.deleted IS '是否删除'; +COMMENT ON COLUMN system_role_menu.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role_menu IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +-- @formatter:off +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (263, 109, 1, '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (434, 2, 1, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (454, 2, 1093, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (455, 2, 1094, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (460, 2, 1100, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (467, 2, 1107, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (476, 2, 1117, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (477, 2, 100, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (478, 2, 101, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (479, 2, 102, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (480, 2, 1126, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (481, 2, 103, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (483, 2, 104, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (485, 2, 105, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (488, 2, 107, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (490, 2, 108, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (492, 2, 109, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (498, 2, 1138, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (523, 2, 1224, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (524, 2, 1225, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (541, 2, 500, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (543, 2, 501, '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (675, 2, 2, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (689, 2, 1077, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (690, 2, 1078, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (692, 2, 1083, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (693, 2, 1084, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (699, 2, 1090, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (703, 2, 106, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (704, 2, 110, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (705, 2, 111, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (706, 2, 112, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (707, 2, 113, '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1296, 110, 1, '110', to_date('2022-02-23 00:23:55', 'SYYYY-MM-DD HH24:MI:SS'), '110', to_date('2022-02-23 00:23:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1578, 111, 1, '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1604, 101, 1216, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1605, 101, 1217, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1606, 101, 1218, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1607, 101, 1219, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1608, 101, 1220, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1609, 101, 1221, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1610, 101, 5, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1611, 101, 1222, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1612, 101, 1118, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1613, 101, 1119, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1614, 101, 1120, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1615, 101, 1185, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1616, 101, 1186, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1617, 101, 1187, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1618, 101, 1188, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1619, 101, 1189, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1620, 101, 1190, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1621, 101, 1191, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1622, 101, 1192, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1623, 101, 1193, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1624, 101, 1194, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1625, 101, 1195, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1626, 101, 1196, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1627, 101, 1197, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1628, 101, 1198, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1629, 101, 1199, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1630, 101, 1200, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1631, 101, 1201, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1632, 101, 1202, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1633, 101, 1207, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1634, 101, 1208, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1635, 101, 1209, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1636, 101, 1210, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1637, 101, 1211, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1638, 101, 1212, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1639, 101, 1213, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1640, 101, 1215, '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1641, 101, 2, '1', to_date('2022-04-01 22:21:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1642, 101, 1031, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1643, 101, 1032, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1644, 101, 1033, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1645, 101, 1034, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1646, 101, 1035, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1647, 101, 1050, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1648, 101, 1051, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1649, 101, 1052, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1650, 101, 1053, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1651, 101, 1054, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1652, 101, 1056, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1653, 101, 1057, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1654, 101, 1058, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1655, 101, 1059, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1656, 101, 1060, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1657, 101, 1066, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1658, 101, 1067, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1659, 101, 1070, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1664, 101, 1075, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1666, 101, 1077, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1667, 101, 1078, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1668, 101, 1082, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1669, 101, 1083, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1670, 101, 1084, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1671, 101, 1085, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1672, 101, 1086, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1673, 101, 1087, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1674, 101, 1088, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1675, 101, 1089, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1679, 101, 1237, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1680, 101, 1238, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1681, 101, 1239, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1682, 101, 1240, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1683, 101, 1241, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1684, 101, 1242, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1685, 101, 1243, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1687, 101, 106, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1688, 101, 110, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1689, 101, 111, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1690, 101, 112, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1691, 101, 113, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1692, 101, 114, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1693, 101, 115, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1694, 101, 116, '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-04-01 22:21:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1729, 109, 100, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1730, 109, 101, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1731, 109, 1063, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1732, 109, 1064, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1733, 109, 1001, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1734, 109, 1065, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1735, 109, 1002, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1736, 109, 1003, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1737, 109, 1004, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1738, 109, 1005, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1739, 109, 1006, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1740, 109, 1007, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1741, 109, 1008, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1742, 109, 1009, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1743, 109, 1010, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1744, 109, 1011, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1745, 109, 1012, '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1746, 111, 100, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1747, 111, 101, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1748, 111, 1063, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1749, 111, 1064, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1750, 111, 1001, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1751, 111, 1065, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1752, 111, 1002, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1753, 111, 1003, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1754, 111, 1004, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1755, 111, 1005, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1756, 111, 1006, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1757, 111, 1007, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1758, 111, 1008, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1759, 111, 1009, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1760, 111, 1010, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1761, 111, 1011, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1762, 111, 1012, '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1763, 109, 100, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1764, 109, 101, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1765, 109, 1063, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1766, 109, 1064, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1767, 109, 1001, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1768, 109, 1065, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1769, 109, 1002, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1770, 109, 1003, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1771, 109, 1004, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1772, 109, 1005, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1773, 109, 1006, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1774, 109, 1007, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1775, 109, 1008, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1776, 109, 1009, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1777, 109, 1010, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1778, 109, 1011, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1779, 109, 1012, '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1780, 111, 100, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1781, 111, 101, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1782, 111, 1063, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1783, 111, 1064, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1784, 111, 1001, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1785, 111, 1065, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1786, 111, 1002, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1787, 111, 1003, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1788, 111, 1004, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1789, 111, 1005, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1790, 111, 1006, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1791, 111, 1007, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1792, 111, 1008, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1793, 111, 1009, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1794, 111, 1010, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1795, 111, 1011, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1796, 111, 1012, '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:54', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1797, 109, 100, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1798, 109, 101, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1799, 109, 1063, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1800, 109, 1064, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1801, 109, 1001, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1802, 109, 1065, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1803, 109, 1002, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1804, 109, 1003, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1805, 109, 1004, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1806, 109, 1005, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1807, 109, 1006, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1808, 109, 1007, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1809, 109, 1008, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1810, 109, 1009, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1811, 109, 1010, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1812, 109, 1011, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1813, 109, 1012, '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:55', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1814, 111, 100, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1815, 111, 101, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1816, 111, 1063, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1817, 111, 1064, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1818, 111, 1001, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1819, 111, 1065, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1820, 111, 1002, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1821, 111, 1003, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1822, 111, 1004, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1823, 111, 1005, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1824, 111, 1006, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1825, 111, 1007, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1826, 111, 1008, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1827, 111, 1009, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1828, 111, 1010, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1829, 111, 1011, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1830, 111, 1012, '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:08:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1831, 109, 103, '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1832, 109, 1017, '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1833, 109, 1018, '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1834, 109, 1019, '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1835, 109, 1020, '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1836, 111, 103, '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1837, 111, 1017, '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1838, 111, 1018, '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1839, 111, 1019, '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1840, 111, 1020, '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:43:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1841, 109, 1036, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1842, 109, 1037, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1843, 109, 1038, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1844, 109, 1039, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1845, 109, 107, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1846, 111, 1036, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1847, 111, 1037, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1848, 111, 1038, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1849, 111, 1039, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1850, 111, 107, '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-09-21 22:48:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1991, 2, 1024, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1992, 2, 1025, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1993, 2, 1026, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1994, 2, 1027, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1995, 2, 1028, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1996, 2, 1029, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1997, 2, 1030, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1998, 2, 1031, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1999, 2, 1032, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2000, 2, 1033, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2001, 2, 1034, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2002, 2, 1035, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2003, 2, 1036, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2004, 2, 1037, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2005, 2, 1038, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2006, 2, 1039, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2007, 2, 1040, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2008, 2, 1042, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2009, 2, 1043, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2010, 2, 1045, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2011, 2, 1046, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2012, 2, 1048, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2013, 2, 1050, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2014, 2, 1051, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2015, 2, 1052, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2016, 2, 1053, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2017, 2, 1054, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2018, 2, 1056, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2019, 2, 1057, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2020, 2, 1058, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2021, 2, 2083, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2022, 2, 1059, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2023, 2, 1060, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2024, 2, 1063, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2025, 2, 1064, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2026, 2, 1065, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2027, 2, 1066, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2028, 2, 1067, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2029, 2, 1070, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2034, 2, 1075, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2036, 2, 1082, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2037, 2, 1085, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2038, 2, 1086, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2039, 2, 1087, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2040, 2, 1088, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2041, 2, 1089, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2042, 2, 1091, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2043, 2, 1092, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2044, 2, 1095, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2045, 2, 1096, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2046, 2, 1097, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2047, 2, 1098, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2048, 2, 1101, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2049, 2, 1102, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2050, 2, 1103, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2051, 2, 1104, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2052, 2, 1105, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2053, 2, 1106, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2054, 2, 1108, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2055, 2, 1109, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2061, 2, 1127, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2062, 2, 1128, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2063, 2, 1129, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2064, 2, 1130, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2066, 2, 1132, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2067, 2, 1133, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2068, 2, 1134, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2069, 2, 1135, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2070, 2, 1136, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2071, 2, 1137, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2072, 2, 114, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2073, 2, 1139, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2074, 2, 115, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2075, 2, 1140, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2076, 2, 116, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2077, 2, 1141, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2078, 2, 1142, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2079, 2, 1143, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2080, 2, 1150, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2081, 2, 1161, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2082, 2, 1162, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2083, 2, 1163, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2084, 2, 1164, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2085, 2, 1165, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2086, 2, 1166, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2087, 2, 1173, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2088, 2, 1174, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2089, 2, 1175, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2090, 2, 1176, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2091, 2, 1177, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2092, 2, 1178, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2099, 2, 1226, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2100, 2, 1227, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2101, 2, 1228, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2102, 2, 1229, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2103, 2, 1237, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2104, 2, 1238, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2105, 2, 1239, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2106, 2, 1240, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2107, 2, 1241, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2108, 2, 1242, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2109, 2, 1243, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2116, 2, 1254, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2117, 2, 1255, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2118, 2, 1256, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2119, 2, 1257, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2120, 2, 1258, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2121, 2, 1259, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2122, 2, 1260, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2123, 2, 1261, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2124, 2, 1263, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2125, 2, 1264, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2126, 2, 1265, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2127, 2, 1266, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2128, 2, 1267, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2129, 2, 1001, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2130, 2, 1002, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2131, 2, 1003, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2132, 2, 1004, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2133, 2, 1005, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2134, 2, 1006, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2135, 2, 1007, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2136, 2, 1008, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2137, 2, 1009, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2138, 2, 1010, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2139, 2, 1011, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2140, 2, 1012, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2141, 2, 1013, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2142, 2, 1014, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2143, 2, 1015, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2144, 2, 1016, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2145, 2, 1017, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2146, 2, 1018, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2147, 2, 1019, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2148, 2, 1020, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2149, 2, 1021, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2150, 2, 1022, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2151, 2, 1023, '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2152, 2, 1281, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2153, 2, 1282, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2154, 2, 2000, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2155, 2, 2002, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2156, 2, 2003, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2157, 2, 2004, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2158, 2, 2005, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2159, 2, 2006, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2160, 2, 2008, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2161, 2, 2009, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2162, 2, 2010, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2163, 2, 2011, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2164, 2, 2012, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2170, 2, 2019, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2171, 2, 2020, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2172, 2, 2021, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2173, 2, 2022, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2174, 2, 2023, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2175, 2, 2025, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2177, 2, 2027, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2178, 2, 2028, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2179, 2, 2029, '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:42:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2180, 2, 2014, '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2181, 2, 2015, '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2182, 2, 2016, '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2183, 2, 2017, '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2184, 2, 2018, '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-01-25 08:43:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2188, 101, 1024, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2189, 101, 1, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2190, 101, 1025, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2191, 101, 1026, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2192, 101, 1027, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2193, 101, 1028, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2194, 101, 1029, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2195, 101, 1030, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2196, 101, 1036, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2197, 101, 1037, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2198, 101, 1038, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2199, 101, 1039, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2200, 101, 1040, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2201, 101, 1042, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2202, 101, 1043, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2203, 101, 1045, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2204, 101, 1046, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2205, 101, 1048, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2206, 101, 2083, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2207, 101, 1063, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2208, 101, 1064, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2209, 101, 1065, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2210, 101, 1093, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2211, 101, 1094, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2212, 101, 1095, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2213, 101, 1096, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2214, 101, 1097, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2215, 101, 1098, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2216, 101, 1100, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2217, 101, 1101, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2218, 101, 1102, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2219, 101, 1103, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2220, 101, 1104, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2221, 101, 1105, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2222, 101, 1106, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2223, 101, 2130, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2224, 101, 1107, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2225, 101, 2131, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2226, 101, 1108, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2227, 101, 2132, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2228, 101, 1109, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2229, 101, 2133, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2230, 101, 2134, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2232, 101, 2135, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2234, 101, 2136, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2236, 101, 2137, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2238, 101, 2138, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2240, 101, 2139, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2242, 101, 2140, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2243, 101, 2141, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2244, 101, 2142, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2245, 101, 2143, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2246, 101, 2144, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2247, 101, 2145, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2248, 101, 2146, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2249, 101, 2147, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2250, 101, 100, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2251, 101, 2148, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2252, 101, 101, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2253, 101, 2149, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2254, 101, 102, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2255, 101, 2150, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2256, 101, 103, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2257, 101, 2151, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2258, 101, 104, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2259, 101, 2152, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2260, 101, 105, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2261, 101, 107, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2262, 101, 108, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2263, 101, 109, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2264, 101, 1138, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2265, 101, 1139, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2266, 101, 1140, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2267, 101, 1141, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2268, 101, 1142, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2269, 101, 1143, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2270, 101, 1224, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2271, 101, 1225, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2272, 101, 1226, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2273, 101, 1227, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2274, 101, 1228, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2275, 101, 1229, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2282, 101, 1261, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2283, 101, 1263, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2284, 101, 1264, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2285, 101, 1265, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2286, 101, 1266, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2287, 101, 1267, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2288, 101, 1001, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2289, 101, 1002, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2290, 101, 1003, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2291, 101, 1004, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2292, 101, 1005, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2293, 101, 1006, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2294, 101, 1007, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2295, 101, 1008, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2296, 101, 1009, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2297, 101, 1010, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2298, 101, 1011, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2299, 101, 1012, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2300, 101, 500, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2301, 101, 1013, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2302, 101, 501, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2303, 101, 1014, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2304, 101, 1015, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2305, 101, 1016, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2306, 101, 1017, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2307, 101, 1018, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2308, 101, 1019, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2309, 101, 1020, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2310, 101, 1021, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2311, 101, 1022, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2312, 101, 1023, '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-02-09 23:49:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2929, 109, 1224, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2930, 109, 1225, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2931, 109, 1226, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2932, 109, 1227, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2933, 109, 1228, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2934, 109, 1229, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2935, 109, 1138, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2936, 109, 1139, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2937, 109, 1140, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2938, 109, 1141, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2939, 109, 1142, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2940, 109, 1143, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2941, 111, 1224, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2942, 111, 1225, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2943, 111, 1226, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2944, 111, 1227, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2945, 111, 1228, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2946, 111, 1229, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2947, 111, 1138, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2948, 111, 1139, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2949, 111, 1140, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2950, 111, 1141, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2951, 111, 1142, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2952, 111, 1143, '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:19:40', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2993, 109, 2, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2994, 109, 1031, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2995, 109, 1032, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2996, 109, 1033, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2997, 109, 1034, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2998, 109, 1035, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2999, 109, 1050, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3000, 109, 1051, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3001, 109, 1052, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3002, 109, 1053, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3003, 109, 1054, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3004, 109, 1056, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3005, 109, 1057, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3006, 109, 1058, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3007, 109, 1059, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3008, 109, 1060, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3009, 109, 1066, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3010, 109, 1067, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3011, 109, 1070, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3012, 109, 1075, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3013, 109, 1076, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3014, 109, 1077, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3015, 109, 1078, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3016, 109, 1082, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3017, 109, 1083, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3018, 109, 1084, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3019, 109, 1085, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3020, 109, 1086, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3021, 109, 1087, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3022, 109, 1088, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3023, 109, 1089, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3024, 109, 1090, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3025, 109, 1091, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3026, 109, 1092, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3027, 109, 106, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3028, 109, 110, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3029, 109, 111, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3030, 109, 112, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3031, 109, 113, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3032, 109, 114, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3033, 109, 115, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3034, 109, 116, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3035, 109, 2472, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3036, 109, 2478, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3037, 109, 2479, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3038, 109, 2480, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3039, 109, 2481, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3040, 109, 2482, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3041, 109, 2483, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3042, 109, 2484, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3043, 109, 2485, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3044, 109, 2486, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3045, 109, 2487, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3046, 109, 2488, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3047, 109, 2489, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3048, 109, 2490, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3049, 109, 2491, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3050, 109, 2492, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3051, 109, 2493, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3052, 109, 2494, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3053, 109, 2495, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3054, 109, 2497, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3055, 109, 1237, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3056, 109, 1238, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3057, 109, 1239, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3058, 109, 1240, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3059, 109, 1241, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3060, 109, 1242, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3061, 109, 1243, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3062, 109, 2525, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3063, 109, 1255, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3064, 109, 1256, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3065, 109, 1257, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3066, 109, 1258, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3067, 109, 1259, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3068, 109, 1260, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3069, 111, 2, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3070, 111, 1031, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3071, 111, 1032, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3072, 111, 1033, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3073, 111, 1034, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3074, 111, 1035, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3075, 111, 1050, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3076, 111, 1051, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3077, 111, 1052, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3078, 111, 1053, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3079, 111, 1054, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3080, 111, 1056, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3081, 111, 1057, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3082, 111, 1058, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3083, 111, 1059, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3084, 111, 1060, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3085, 111, 1066, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3086, 111, 1067, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3087, 111, 1070, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3088, 111, 1075, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3089, 111, 1076, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3090, 111, 1077, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3091, 111, 1078, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3092, 111, 1082, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3093, 111, 1083, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3094, 111, 1084, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3095, 111, 1085, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3096, 111, 1086, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3097, 111, 1087, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3098, 111, 1088, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3099, 111, 1089, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3100, 111, 1090, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3101, 111, 1091, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3102, 111, 1092, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3103, 111, 106, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3104, 111, 110, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3105, 111, 111, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3106, 111, 112, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3107, 111, 113, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3108, 111, 114, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3109, 111, 115, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3110, 111, 116, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3111, 111, 2472, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3112, 111, 2478, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3113, 111, 2479, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3114, 111, 2480, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3115, 111, 2481, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3116, 111, 2482, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3117, 111, 2483, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3118, 111, 2484, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3119, 111, 2485, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3120, 111, 2486, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3121, 111, 2487, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3122, 111, 2488, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3123, 111, 2489, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3124, 111, 2490, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3125, 111, 2491, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3126, 111, 2492, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3127, 111, 2493, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3128, 111, 2494, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3129, 111, 2495, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3130, 111, 2497, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3131, 111, 1237, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3132, 111, 1238, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3133, 111, 1239, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3134, 111, 1240, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3135, 111, 1241, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3136, 111, 1242, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3137, 111, 1243, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3138, 111, 2525, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3139, 111, 1255, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3140, 111, 1256, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3141, 111, 1257, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3142, 111, 1258, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3143, 111, 1259, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3144, 111, 1260, '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 23:41:02', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3221, 109, 102, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3222, 109, 1013, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3223, 109, 1014, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3224, 109, 1015, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3225, 109, 1016, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3226, 111, 102, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3227, 111, 1013, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3228, 111, 1014, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3229, 111, 1015, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3230, 111, 1016, '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-30 11:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4163, 109, 5, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4164, 109, 1118, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4165, 109, 1119, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4166, 109, 1120, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4167, 109, 2713, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4168, 109, 2714, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4169, 109, 2715, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4170, 109, 2716, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4171, 109, 2717, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4172, 109, 2718, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4173, 109, 2720, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4174, 109, 1185, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4175, 109, 2721, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4176, 109, 1186, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4177, 109, 2722, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4178, 109, 1187, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4179, 109, 2723, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4180, 109, 1188, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4181, 109, 2724, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4182, 109, 1189, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4183, 109, 2725, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4184, 109, 1190, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4185, 109, 2726, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4186, 109, 1191, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4187, 109, 2727, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4188, 109, 1192, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4189, 109, 2728, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4190, 109, 1193, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4191, 109, 2729, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4192, 109, 1194, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4193, 109, 2730, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4194, 109, 1195, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4195, 109, 2731, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4196, 109, 1196, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4197, 109, 2732, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4198, 109, 1197, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4199, 109, 2733, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4200, 109, 1198, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4201, 109, 2734, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4202, 109, 1199, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4203, 109, 2735, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4204, 109, 1200, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4205, 109, 1201, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4206, 109, 1202, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4207, 109, 1207, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4208, 109, 1208, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4209, 109, 1209, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4210, 109, 1210, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4211, 109, 1211, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4212, 109, 1212, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4213, 109, 1213, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4214, 109, 1215, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4215, 109, 1216, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4216, 109, 1217, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4217, 109, 1218, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4218, 109, 1219, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4219, 109, 1220, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4220, 109, 1221, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4221, 109, 1222, '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4222, 111, 5, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4223, 111, 1118, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4224, 111, 1119, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4225, 111, 1120, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4226, 111, 2713, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4227, 111, 2714, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4228, 111, 2715, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4229, 111, 2716, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4230, 111, 2717, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4231, 111, 2718, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4232, 111, 2720, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4233, 111, 1185, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4234, 111, 2721, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4235, 111, 1186, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4236, 111, 2722, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4237, 111, 1187, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4238, 111, 2723, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4239, 111, 1188, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4240, 111, 2724, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4241, 111, 1189, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4242, 111, 2725, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4243, 111, 1190, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4244, 111, 2726, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4245, 111, 1191, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4246, 111, 2727, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4247, 111, 1192, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4248, 111, 2728, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4249, 111, 1193, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4250, 111, 2729, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4251, 111, 1194, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4252, 111, 2730, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4253, 111, 1195, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4254, 111, 2731, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4255, 111, 1196, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4256, 111, 2732, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4257, 111, 1197, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4258, 111, 2733, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4259, 111, 1198, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4260, 111, 2734, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4261, 111, 1199, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4262, 111, 2735, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4263, 111, 1200, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4264, 111, 1201, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4265, 111, 1202, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4266, 111, 1207, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4267, 111, 1208, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4268, 111, 1209, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4269, 111, 1210, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4270, 111, 1211, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4271, 111, 1212, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4272, 111, 1213, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4273, 111, 1215, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4274, 111, 1216, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4275, 111, 1217, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4276, 111, 1218, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4277, 111, 1219, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4278, 111, 1220, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4279, 111, 1221, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4280, 111, 1222, '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:18', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5777, 101, 2739, '1', to_date('2024-04-30 09:38:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-30 09:38:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5778, 101, 2740, '1', to_date('2024-04-30 09:38:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-30 09:38:37', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_role_menu_seq + START WITH 5779; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +CREATE TABLE system_sms_channel +( + id number NOT NULL, + signature varchar2(12) NOT NULL, + code varchar2(63) NOT NULL, + status smallint NOT NULL, + remark varchar2(255) DEFAULT NULL NULL, + api_key varchar2(128) NOT NULL, + api_secret varchar2(128) DEFAULT NULL NULL, + callback_url varchar2(255) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_sms_channel + ADD CONSTRAINT pk_system_sms_channel PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_channel.id IS '编号'; +COMMENT ON COLUMN system_sms_channel.signature IS '短信签名'; +COMMENT ON COLUMN system_sms_channel.code IS '渠道编码'; +COMMENT ON COLUMN system_sms_channel.status IS '开启状态'; +COMMENT ON COLUMN system_sms_channel.remark IS '备注'; +COMMENT ON COLUMN system_sms_channel.api_key IS '短信 API 的账号'; +COMMENT ON COLUMN system_sms_channel.api_secret IS '短信 API 的秘钥'; +COMMENT ON COLUMN system_sms_channel.callback_url IS '短信发送回调 URL'; +COMMENT ON COLUMN system_sms_channel.creator IS '创建者'; +COMMENT ON COLUMN system_sms_channel.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_channel.updater IS '更新者'; +COMMENT ON COLUMN system_sms_channel.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_channel.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_channel IS '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +-- @formatter:off +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', to_date('2021-03-31 11:53:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 22:10:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', to_date('2021-04-13 00:23:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-27 20:29:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, '仅测试', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', to_date('2022-04-10 23:07:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 22:10:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_sms_channel_seq + START WITH 7; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +CREATE TABLE system_sms_code +( + id number NOT NULL, + mobile varchar2(11) NOT NULL, + code varchar2(6) NOT NULL, + create_ip varchar2(15) NOT NULL, + scene smallint NOT NULL, + today_index smallint NOT NULL, + used smallint NOT NULL, + used_time date DEFAULT NULL NULL, + used_ip varchar2(255) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_sms_code + ADD CONSTRAINT pk_system_sms_code PRIMARY KEY (id); + +CREATE INDEX idx_system_sms_code_01 ON system_sms_code (mobile); + +COMMENT ON COLUMN system_sms_code.id IS '编号'; +COMMENT ON COLUMN system_sms_code.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_code.code IS '验证码'; +COMMENT ON COLUMN system_sms_code.create_ip IS '创建 IP'; +COMMENT ON COLUMN system_sms_code.scene IS '发送场景'; +COMMENT ON COLUMN system_sms_code.today_index IS '今日发送的第几条'; +COMMENT ON COLUMN system_sms_code.used IS '是否使用'; +COMMENT ON COLUMN system_sms_code.used_time IS '使用时间'; +COMMENT ON COLUMN system_sms_code.used_ip IS '使用 IP'; +COMMENT ON COLUMN system_sms_code.creator IS '创建者'; +COMMENT ON COLUMN system_sms_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_code.updater IS '更新者'; +COMMENT ON COLUMN system_sms_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_sms_code.tenant_id IS '租户编号'; +COMMENT ON COLUMN system_sms_code.idx_mobile IS '手机号'; +COMMENT ON TABLE system_sms_code IS '手机验证码'; + +CREATE SEQUENCE system_sms_code_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +CREATE TABLE system_sms_log +( + id number NOT NULL, + channel_id number NOT NULL, + channel_code varchar2(63) NOT NULL, + template_id number NOT NULL, + template_code varchar2(63) NOT NULL, + template_type smallint NOT NULL, + template_content varchar2(255) NOT NULL, + template_params varchar2(255) NOT NULL, + api_template_id varchar2(63) NOT NULL, + mobile varchar2(11) NOT NULL, + user_id number DEFAULT NULL NULL, + user_type smallint DEFAULT NULL NULL, + send_status smallint DEFAULT 0 NOT NULL, + send_time date DEFAULT NULL NULL, + api_send_code varchar2(63) DEFAULT NULL NULL, + api_send_msg varchar2(255) DEFAULT NULL NULL, + api_request_id varchar2(255) DEFAULT NULL NULL, + api_serial_no varchar2(255) DEFAULT NULL NULL, + receive_status smallint DEFAULT 0 NOT NULL, + receive_time date DEFAULT NULL NULL, + api_receive_code varchar2(63) DEFAULT NULL NULL, + api_receive_msg varchar2(255) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_sms_log + ADD CONSTRAINT pk_system_sms_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_log.id IS '编号'; +COMMENT ON COLUMN system_sms_log.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_log.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_sms_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_sms_log.template_type IS '短信类型'; +COMMENT ON COLUMN system_sms_log.template_content IS '短信内容'; +COMMENT ON COLUMN system_sms_log.template_params IS '短信参数'; +COMMENT ON COLUMN system_sms_log.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_log.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_sms_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_sms_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_sms_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_sms_log.api_send_code IS '短信 API 发送结果的编码'; +COMMENT ON COLUMN system_sms_log.api_send_msg IS '短信 API 发送失败的提示'; +COMMENT ON COLUMN system_sms_log.api_request_id IS '短信 API 发送返回的唯一请求 ID'; +COMMENT ON COLUMN system_sms_log.api_serial_no IS '短信 API 发送返回的序号'; +COMMENT ON COLUMN system_sms_log.receive_status IS '接收状态'; +COMMENT ON COLUMN system_sms_log.receive_time IS '接收时间'; +COMMENT ON COLUMN system_sms_log.api_receive_code IS 'API 接收结果的编码'; +COMMENT ON COLUMN system_sms_log.api_receive_msg IS 'API 接收结果的说明'; +COMMENT ON COLUMN system_sms_log.creator IS '创建者'; +COMMENT ON COLUMN system_sms_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_log.updater IS '更新者'; +COMMENT ON COLUMN system_sms_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_log.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_log IS '短信日志'; + +CREATE SEQUENCE system_sms_log_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +CREATE TABLE system_sms_template +( + id number NOT NULL, + type smallint NOT NULL, + status smallint NOT NULL, + code varchar2(63) NOT NULL, + name varchar2(63) NOT NULL, + content varchar2(255) NOT NULL, + params varchar2(255) NOT NULL, + remark varchar2(255) DEFAULT NULL NULL, + api_template_id varchar2(63) NOT NULL, + channel_id number NOT NULL, + channel_code varchar2(63) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_sms_template + ADD CONSTRAINT pk_system_sms_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_template.id IS '编号'; +COMMENT ON COLUMN system_sms_template.type IS '模板类型'; +COMMENT ON COLUMN system_sms_template.status IS '开启状态'; +COMMENT ON COLUMN system_sms_template.code IS '模板编码'; +COMMENT ON COLUMN system_sms_template.name IS '模板名称'; +COMMENT ON COLUMN system_sms_template.content IS '模板内容'; +COMMENT ON COLUMN system_sms_template.params IS '参数数组'; +COMMENT ON COLUMN system_sms_template.remark IS '备注'; +COMMENT ON COLUMN system_sms_template.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_template.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_template.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_template.creator IS '创建者'; +COMMENT ON COLUMN system_sms_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_template.updater IS '更新者'; +COMMENT ON COLUMN system_sms_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_template.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_template IS '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +-- @formatter:off +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', '测试备注', '4383920', 6, 'DEBUG_DING_TALK', '', to_date('2021-03-31 10:49:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 22:32:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', to_date('2021-03-31 11:56:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2021-04-10 01:22:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', 6, 'DEBUG_DING_TALK', '1', to_date('2021-04-10 01:07:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 21:26:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', to_date('2021-04-13 00:29:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 22:35:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', 6, 'DEBUG_DING_TALK', '1', to_date('2021-10-11 08:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-12-10 21:25:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', to_date('2022-01-21 22:31:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-01-22 00:03:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', to_date('2022-01-22 00:03:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-01 12:33:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', to_date('2022-01-22 00:04:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-27 20:32:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', to_date('2022-04-10 23:22:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-03-24 23:45:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', to_date('2023-08-19 18:58:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-19 11:34:04', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', to_date('2023-08-19 18:58:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-08-19 11:34:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', to_date('2023-08-19 18:58:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-02 22:35:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_sms_template_seq + START WITH 17; + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +CREATE TABLE system_social_client +( + id number NOT NULL, + name varchar2(255) NOT NULL, + social_type smallint NOT NULL, + user_type smallint NOT NULL, + client_id varchar2(255) NOT NULL, + client_secret varchar2(255) NOT NULL, + agent_id varchar2(255) DEFAULT NULL NULL, + status smallint NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_social_client + ADD CONSTRAINT pk_system_social_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_client.id IS '编号'; +COMMENT ON COLUMN system_social_client.name IS '应用名'; +COMMENT ON COLUMN system_social_client.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_client.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_social_client.client_secret IS '客户端密钥'; +COMMENT ON COLUMN system_social_client.agent_id IS '代理编号'; +COMMENT ON COLUMN system_social_client.status IS '状态'; +COMMENT ON COLUMN system_social_client.creator IS '创建者'; +COMMENT ON COLUMN system_social_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_client.updater IS '更新者'; +COMMENT ON COLUMN system_social_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_client.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_client.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_client IS '社交客户端表'; + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +-- @formatter:off +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '钉钉', 20, 2, 'dingvrnreaje3yqvzhxg', 'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, '', to_date('2023-10-18 11:21:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-20 21:28:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '钉钉(王土豆)', 20, 2, 'dingtsu9hpepjkbmthhw', 'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, '', to_date('2023-10-18 11:21:18', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2023-12-20 21:28:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', 121); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '微信公众号', 31, 1, 'wx5b23ba7a5589ecbb', '2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, '', to_date('2023-10-18 16:07:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-20 21:28:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (43, '微信小程序', 34, 1, 'wx63c280fe3248a3e7', '6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, '', to_date('2023-10-19 13:37:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-12-20 21:28:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_social_client_seq + START WITH 44; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +CREATE TABLE system_social_user +( + id number NOT NULL, + type smallint NOT NULL, + openid varchar2(32) NOT NULL, + token varchar2(256) DEFAULT NULL NULL, + raw_token_info varchar2(1024) NOT NULL, + nickname varchar2(32) NOT NULL, + avatar varchar2(255) DEFAULT NULL NULL, + raw_user_info varchar2(1024) NOT NULL, + code varchar2(256) NOT NULL, + state varchar2(256) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_social_user + ADD CONSTRAINT pk_system_social_user PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user.type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user.openid IS '社交 openid'; +COMMENT ON COLUMN system_social_user.token IS '社交 token'; +COMMENT ON COLUMN system_social_user.raw_token_info IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.nickname IS '用户昵称'; +COMMENT ON COLUMN system_social_user.avatar IS '用户头像'; +COMMENT ON COLUMN system_social_user.raw_user_info IS '原始用户数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.code IS '最后一次的认证 code'; +COMMENT ON COLUMN system_social_user.state IS '最后一次的认证 state'; +COMMENT ON COLUMN system_social_user.creator IS '创建者'; +COMMENT ON COLUMN system_social_user.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user.updater IS '更新者'; +COMMENT ON COLUMN system_social_user.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user IS '社交用户表'; + +CREATE SEQUENCE system_social_user_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +CREATE TABLE system_social_user_bind +( + id number NOT NULL, + user_id number NOT NULL, + user_type smallint NOT NULL, + social_type smallint NOT NULL, + social_user_id number NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_social_user_bind + ADD CONSTRAINT pk_system_social_user_bind PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user_bind.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user_bind.user_id IS '用户编号'; +COMMENT ON COLUMN system_social_user_bind.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_user_bind.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user_bind.social_user_id IS '社交用户的编号'; +COMMENT ON COLUMN system_social_user_bind.creator IS '创建者'; +COMMENT ON COLUMN system_social_user_bind.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user_bind.updater IS '更新者'; +COMMENT ON COLUMN system_social_user_bind.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user_bind.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user_bind.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user_bind IS '社交绑定表'; + +CREATE SEQUENCE system_social_user_bind_seq + START WITH 1; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +CREATE TABLE system_tenant +( + id number NOT NULL, + name varchar2(30) NOT NULL, + contact_user_id number DEFAULT NULL NULL, + contact_name varchar2(30) NOT NULL, + contact_mobile varchar2(500) DEFAULT NULL NULL, + status smallint DEFAULT 0 NOT NULL, + website varchar2(256) DEFAULT '' NULL, + package_id number NOT NULL, + expire_time date NOT NULL, + account_count number NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_tenant + ADD CONSTRAINT pk_system_tenant PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant.id IS '租户编号'; +COMMENT ON COLUMN system_tenant.name IS '租户名'; +COMMENT ON COLUMN system_tenant.contact_user_id IS '联系人的用户编号'; +COMMENT ON COLUMN system_tenant.contact_name IS '联系人'; +COMMENT ON COLUMN system_tenant.contact_mobile IS '联系手机'; +COMMENT ON COLUMN system_tenant.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant.website IS '绑定域名'; +COMMENT ON COLUMN system_tenant.package_id IS '租户套餐编号'; +COMMENT ON COLUMN system_tenant.expire_time IS '过期时间'; +COMMENT ON COLUMN system_tenant.account_count IS '账号数量'; +COMMENT ON COLUMN system_tenant.creator IS '创建者'; +COMMENT ON COLUMN system_tenant.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant.updater IS '更新者'; +COMMENT ON COLUMN system_tenant.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant IS '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +-- @formatter:off +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, to_date('2099-02-19 17:14:16', 'SYYYY-MM-DD HH24:MI:SS'), 9999, '1', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-06 11:41:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, to_date('2024-03-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), 20, '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-06 11:41:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, to_date('2022-04-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), 50, '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-06 11:41:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_tenant_seq + START WITH 123; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +CREATE TABLE system_tenant_package +( + id number NOT NULL, + name varchar2(30) NOT NULL, + status smallint DEFAULT 0 NOT NULL, + remark varchar2(256) DEFAULT '' NULL, + menu_ids varchar2(4000) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL +); + +ALTER TABLE system_tenant_package + ADD CONSTRAINT pk_system_tenant_package PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant_package.id IS '套餐编号'; +COMMENT ON COLUMN system_tenant_package.name IS '套餐名'; +COMMENT ON COLUMN system_tenant_package.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant_package.remark IS '备注'; +COMMENT ON COLUMN system_tenant_package.menu_ids IS '关联的菜单编号'; +COMMENT ON COLUMN system_tenant_package.creator IS '创建者'; +COMMENT ON COLUMN system_tenant_package.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant_package.updater IS '更新者'; +COMMENT ON COLUMN system_tenant_package.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant_package.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant_package IS '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +-- @formatter:off +INSERT INTO system_tenant_package (id, name, status, remark, menu_ids, creator, create_time, updater, update_time, deleted) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1076,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2484,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', to_date('2022-02-22 00:54:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-30 17:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_tenant_package_seq + START WITH 112; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +CREATE TABLE system_user_post +( + id number NOT NULL, + user_id number DEFAULT 0 NOT NULL, + post_id number DEFAULT 0 NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_user_post + ADD CONSTRAINT pk_system_user_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_post.id IS 'id'; +COMMENT ON COLUMN system_user_post.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_post.post_id IS '岗位ID'; +COMMENT ON COLUMN system_user_post.creator IS '创建者'; +COMMENT ON COLUMN system_user_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_post.updater IS '更新者'; +COMMENT ON COLUMN system_user_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_post IS '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +-- @formatter:off +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 1, 1, 'admin', to_date('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', to_date('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 100, 1, 'admin', to_date('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', to_date('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 104, 1, '1', to_date('2022-05-16 19:36:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-16 19:36:28', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (116, 117, 2, '1', to_date('2022-07-09 17:40:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-07-09 17:40:26', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 118, 1, '1', to_date('2022-07-09 17:44:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-07-09 17:44:44', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (119, 114, 5, '1', to_date('2024-03-24 20:45:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-24 20:45:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (123, 115, 1, '1', to_date('2024-04-04 09:37:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-04 09:37:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (124, 115, 2, '1', to_date('2024-04-04 09:37:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-04 09:37:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_user_post_seq + START WITH 125; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +CREATE TABLE system_user_role +( + id number NOT NULL, + user_id number NOT NULL, + role_id number NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_user_role + ADD CONSTRAINT pk_system_user_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_role.id IS '自增编号'; +COMMENT ON COLUMN system_user_role.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN system_user_role.creator IS '创建者'; +COMMENT ON COLUMN system_user_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_role.updater IS '更新者'; +COMMENT ON COLUMN system_user_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_role IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +-- @formatter:off +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 1, 1, '', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-05-12 12:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, 2, '', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-05-12 12:35:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 100, 101, '', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-05-12 12:35:13', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 100, 1, '', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-05-12 12:35:12', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 100, 2, '', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2022-05-12 12:35:11', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 103, 1, '1', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (14, 110, 109, '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (15, 111, 110, '110', to_date('2022-02-23 13:14:38', 'SYYYY-MM-DD HH24:MI:SS'), '110', to_date('2022-02-23 13:14:38', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (16, 113, 111, '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (18, 1, 2, '1', to_date('2022-05-12 20:39:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-12 20:39:29', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (20, 104, 101, '1', to_date('2022-05-28 15:43:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-05-28 15:43:57', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (22, 115, 2, '1', to_date('2022-07-21 22:08:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-07-21 22:08:30', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (35, 112, 1, '1', to_date('2024-03-15 20:00:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-15 20:00:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (36, 118, 1, '1', to_date('2024-03-17 09:12:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-17 09:12:08', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (38, 114, 101, '1', to_date('2024-03-24 22:23:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-03-24 22:23:03', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_user_role_seq + START WITH 39; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +CREATE TABLE system_users +( + id number NOT NULL, + username varchar2(30) NOT NULL, + password varchar2(100) DEFAULT '' NULL, + nickname varchar2(30) NOT NULL, + remark varchar2(500) DEFAULT NULL NULL, + dept_id number DEFAULT NULL NULL, + post_ids varchar2(255) DEFAULT NULL NULL, + email varchar2(50) DEFAULT '' NULL, + mobile varchar2(11) DEFAULT '' NULL, + sex smallint DEFAULT 0 NULL, + avatar varchar2(512) DEFAULT '' NULL, + status smallint DEFAULT 0 NOT NULL, + login_ip varchar2(50) DEFAULT '' NULL, + login_date date DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE system_users + ADD CONSTRAINT pk_system_users PRIMARY KEY (id); + +COMMENT ON COLUMN system_users.id IS '用户ID'; +COMMENT ON COLUMN system_users.username IS '用户账号'; +COMMENT ON COLUMN system_users.password IS '密码'; +COMMENT ON COLUMN system_users.nickname IS '用户昵称'; +COMMENT ON COLUMN system_users.remark IS '备注'; +COMMENT ON COLUMN system_users.dept_id IS '部门ID'; +COMMENT ON COLUMN system_users.post_ids IS '岗位编号数组'; +COMMENT ON COLUMN system_users.email IS '用户邮箱'; +COMMENT ON COLUMN system_users.mobile IS '手机号码'; +COMMENT ON COLUMN system_users.sex IS '用户性别'; +COMMENT ON COLUMN system_users.avatar IS '头像地址'; +COMMENT ON COLUMN system_users.status IS '帐号状态(0正常 1停用)'; +COMMENT ON COLUMN system_users.login_ip IS '最后登录IP'; +COMMENT ON COLUMN system_users.login_date IS '最后登录时间'; +COMMENT ON COLUMN system_users.creator IS '创建者'; +COMMENT ON COLUMN system_users.create_time IS '创建时间'; +COMMENT ON COLUMN system_users.updater IS '更新者'; +COMMENT ON COLUMN system_users.update_time IS '更新时间'; +COMMENT ON COLUMN system_users.deleted IS '是否删除'; +COMMENT ON COLUMN system_users.tenant_id IS '租户编号'; +COMMENT ON TABLE system_users IS '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +-- @formatter:off +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '18818260277', 2, 'http://test.win.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, '0:0:0:0:0:0:0:1', to_date('2024-04-29 21:50:32', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', to_date('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2024-04-29 21:50:32', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', to_date('2022-07-09 23:03:33', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-01-07 09:07:17', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2022-07-09 23:03:33', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', to_date('2024-03-18 21:09:04', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-01-13 23:50:35', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2024-03-18 21:09:04', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, 'test', '$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', to_date('2024-03-26 07:11:35', 'SYYYY-MM-DD HH24:MI:SS'), '', to_date('2021-01-21 02:13:53', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2024-03-26 07:11:35', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', to_date('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-27 08:26:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 118); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', to_date('2022-02-20 23:00:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-27 08:26:53', 'SYYYY-MM-DD HH24:MI:SS'), '0', 119); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', to_date('2022-02-20 23:11:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-27 08:26:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 120); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', to_date('2022-09-25 22:47:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2022-09-25 22:47:33', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', to_date('2023-12-30 11:42:17', 'SYYYY-MM-DD HH24:MI:SS'), '110', to_date('2022-02-23 13:14:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2023-12-30 11:42:17', 'SYYYY-MM-DD HH24:MI:SS'), '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', to_date('2024-03-16 23:11:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-02-23 19:08:03', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2024-03-16 23:11:38', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', to_date('2022-03-19 18:38:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2022-03-19 18:38:51', 'SYYYY-MM-DD HH24:MI:SS'), '0', 122); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', to_date('2024-03-24 22:21:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-03-19 21:50:58', 'SYYYY-MM-DD HH24:MI:SS'), NULL, to_date('2024-03-24 22:21:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', to_date('2022-04-30 02:55:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-04 09:37:14', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', to_date('2022-07-09 17:40:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-07-09 17:40:26', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', to_date('2024-03-17 09:10:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2022-07-09 17:44:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-04 09:48:05', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', to_date('2024-04-27 08:45:56', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2024-04-27 08:45:56', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE system_users_seq + START WITH 132; + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +CREATE TABLE win_demo01_contact +( + id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + sex smallint NOT NULL, + birthday date NOT NULL, + description varchar2(255) NOT NULL, + avatar varchar2(512) DEFAULT NULL NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE win_demo01_contact + ADD CONSTRAINT pk_win_demo01_contact PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo01_contact.id IS '编号'; +COMMENT ON COLUMN win_demo01_contact.name IS '名字'; +COMMENT ON COLUMN win_demo01_contact.sex IS '性别'; +COMMENT ON COLUMN win_demo01_contact.birthday IS '出生年'; +COMMENT ON COLUMN win_demo01_contact.description IS '简介'; +COMMENT ON COLUMN win_demo01_contact.avatar IS '头像'; +COMMENT ON COLUMN win_demo01_contact.creator IS '创建者'; +COMMENT ON COLUMN win_demo01_contact.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo01_contact.updater IS '更新者'; +COMMENT ON COLUMN win_demo01_contact.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo01_contact.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo01_contact.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo01_contact IS '示例联系人表'; + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +-- @formatter:off +INSERT INTO win_demo01_contact (id, name, sex, birthday, description, avatar, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 2, to_date('2023-11-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '

天蚕土豆!呀

', 'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', '1', to_date('2023-11-15 23:34:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-15 23:47:39', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE win_demo01_contact_seq + START WITH 2; + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +CREATE TABLE win_demo02_category +( + id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + parent_id number NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE win_demo02_category + ADD CONSTRAINT pk_win_demo02_category PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo02_category.id IS '编号'; +COMMENT ON COLUMN win_demo02_category.name IS '名字'; +COMMENT ON COLUMN win_demo02_category.parent_id IS '父级编号'; +COMMENT ON COLUMN win_demo02_category.creator IS '创建者'; +COMMENT ON COLUMN win_demo02_category.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo02_category.updater IS '更新者'; +COMMENT ON COLUMN win_demo02_category.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo02_category.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo02_category.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo02_category IS '示例分类表'; + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +-- @formatter:off +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 0, '1', to_date('2023-11-15 23:34:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:24:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '番茄', 0, '1', to_date('2023-11-16 20:24:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:24:15', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '怪怪', 0, '1', to_date('2023-11-16 20:24:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:24:32', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '小番茄', 2, '1', to_date('2023-11-16 20:24:39', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:24:39', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大番茄', 2, '1', to_date('2023-11-16 20:24:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 20:24:46', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, '11', 3, '1', to_date('2023-11-24 19:29:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-24 19:29:34', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE win_demo02_category_seq + START WITH 7; + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +CREATE TABLE win_demo03_course +( + id number NOT NULL, + student_id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + score smallint NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE win_demo03_course + ADD CONSTRAINT pk_win_demo03_course PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_course.id IS '编号'; +COMMENT ON COLUMN win_demo03_course.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_course.name IS '名字'; +COMMENT ON COLUMN win_demo03_course.score IS '分数'; +COMMENT ON COLUMN win_demo03_course.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_course.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_course.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_course.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_course.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_course.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_course IS '学生课程表'; + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +-- @formatter:off +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, '语文', 66, '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 2, '数学', 22, '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 5, '体育', 23, '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 15:44:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 5, '计算机', 11, '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 15:44:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '体育', 23, '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 15:47:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 5, '计算机', 11, '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 15:47:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 5, '体育', 23, '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:47:10', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (11, 5, '计算机', 11, '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:47:10', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (12, 2, '电脑', 33, '1', to_date('2023-11-17 00:20:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 16:20:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (13, 9, '滑雪', 12, '1', to_date('2023-11-17 13:13:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-17 13:13:20', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE win_demo03_course_seq + START WITH 14; + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +CREATE TABLE win_demo03_grade +( + id number NOT NULL, + student_id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + teacher varchar2(255) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE win_demo03_grade + ADD CONSTRAINT pk_win_demo03_grade PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_grade.id IS '编号'; +COMMENT ON COLUMN win_demo03_grade.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_grade.name IS '名字'; +COMMENT ON COLUMN win_demo03_grade.teacher IS '班主任'; +COMMENT ON COLUMN win_demo03_grade.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_grade.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_grade.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_grade.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_grade.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_grade.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_grade IS '学生班级表'; + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +-- @formatter:off +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 2, '三年 2 班', '周杰伦', '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '华为', '遥遥领先', '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-16 23:47:10', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 9, '小图', '小娃111', '1', to_date('2023-11-17 13:10:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-17 13:10:23', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE win_demo03_grade_seq + START WITH 10; + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +CREATE TABLE win_demo03_student +( + id number NOT NULL, + name varchar2(100) DEFAULT '' NULL, + sex smallint NOT NULL, + birthday date NOT NULL, + description varchar2(255) NOT NULL, + creator varchar2(64) DEFAULT '' NULL, + create_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar2(64) DEFAULT '' NULL, + update_time date DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted number(1, 0) DEFAULT 0 NOT NULL, + tenant_id number DEFAULT 0 NOT NULL +); + +ALTER TABLE win_demo03_student + ADD CONSTRAINT pk_win_demo03_student PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_student.id IS '编号'; +COMMENT ON COLUMN win_demo03_student.name IS '名字'; +COMMENT ON COLUMN win_demo03_student.sex IS '性别'; +COMMENT ON COLUMN win_demo03_student.birthday IS '出生日期'; +COMMENT ON COLUMN win_demo03_student.description IS '简介'; +COMMENT ON COLUMN win_demo03_student.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_student.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_student.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_student.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_student.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_student.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_student IS '学生表'; + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +-- @formatter:off +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '小白', 1, to_date('2023-11-16 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '

厉害

', '1', to_date('2023-11-16 23:21:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-17 16:49:06', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大黑', 2, to_date('2023-11-13 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '

你在教我做事?

', '1', to_date('2023-11-16 23:22:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-17 16:49:07', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, '小花', 1, to_date('2023-11-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '

哈哈哈

', '1', to_date('2023-11-17 00:04:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2023-11-17 16:49:08', 'SYYYY-MM-DD HH24:MI:SS'), '0', 1); +COMMIT; +-- @formatter:on + +CREATE SEQUENCE win_demo03_student_seq + START WITH 10; + diff --git a/sql/postgresql/quartz.sql b/sql/postgresql/quartz.sql new file mode 100644 index 0000000..4ec390c --- /dev/null +++ b/sql/postgresql/quartz.sql @@ -0,0 +1,253 @@ +-- ---------------------------- +-- qrtz_blob_triggers +-- ---------------------------- +CREATE TABLE qrtz_blob_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + blob_data bytea NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +CREATE INDEX idx_qrtz_blob_triggers_sched_name ON qrtz_blob_triggers (sched_name, trigger_name, trigger_group); + +-- ---------------------------- +-- qrtz_calendars +-- ---------------------------- +CREATE TABLE qrtz_calendars +( + sched_name varchar(120) NOT NULL, + calendar_name varchar(190) NOT NULL, + calendar bytea NOT NULL, + PRIMARY KEY (sched_name, calendar_name) +); + + +-- ---------------------------- +-- qrtz_cron_triggers +-- ---------------------------- +CREATE TABLE qrtz_cron_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + cron_expression varchar(120) NOT NULL, + time_zone_id varchar(80) NULL DEFAULT NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_fired_triggers +-- ---------------------------- +CREATE TABLE qrtz_fired_triggers +( + sched_name varchar(120) NOT NULL, + entry_id varchar(95) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + instance_name varchar(190) NOT NULL, + fired_time int8 NOT NULL, + sched_time int8 NOT NULL, + priority int4 NOT NULL, + state varchar(16) NOT NULL, + job_name varchar(190) NULL DEFAULT NULL, + job_group varchar(190) NULL DEFAULT NULL, + is_nonconcurrent varchar(1) NULL DEFAULT NULL, + requests_recovery varchar(1) NULL DEFAULT NULL, + PRIMARY KEY (sched_name, entry_id) +); + +CREATE INDEX idx_qrtz_ft_trig_inst_name ON qrtz_fired_triggers (sched_name, instance_name); +CREATE INDEX idx_qrtz_ft_inst_job_req_rcvry ON qrtz_fired_triggers (sched_name, instance_name, requests_recovery); +CREATE INDEX idx_qrtz_ft_j_g ON qrtz_fired_triggers (sched_name, job_name, job_group); +CREATE INDEX idx_qrtz_ft_jg ON qrtz_fired_triggers (sched_name, job_group); +CREATE INDEX idx_qrtz_ft_t_g ON qrtz_fired_triggers (sched_name, trigger_name, trigger_group); +CREATE INDEX idx_qrtz_ft_tg ON qrtz_fired_triggers (sched_name, trigger_group); + +-- ---------------------------- +-- qrtz_job_details +-- ---------------------------- +CREATE TABLE qrtz_job_details +( + sched_name varchar(120) NOT NULL, + job_name varchar(190) NOT NULL, + job_group varchar(190) NOT NULL, + description varchar(250) NULL DEFAULT NULL, + job_class_name varchar(250) NOT NULL, + is_durable varchar(1) NOT NULL, + is_nonconcurrent varchar(1) NOT NULL, + is_update_data varchar(1) NOT NULL, + requests_recovery varchar(1) NOT NULL, + job_data bytea NULL, + PRIMARY KEY (sched_name, job_name, job_group) +); + +CREATE INDEX idx_qrtz_j_req_recovery ON qrtz_job_details (sched_name, requests_recovery); +CREATE INDEX idx_qrtz_j_grp ON qrtz_job_details (sched_name, job_group); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_locks +-- ---------------------------- +CREATE TABLE qrtz_locks +( + sched_name varchar(120) NOT NULL, + lock_name varchar(40) NOT NULL, + PRIMARY KEY (sched_name, lock_name) +); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_paused_trigger_grps +-- ---------------------------- +CREATE TABLE qrtz_paused_trigger_grps +( + sched_name varchar(120) NOT NULL, + trigger_group varchar(190) NOT NULL, + PRIMARY KEY (sched_name, trigger_group) +); + +-- ---------------------------- +-- qrtz_scheduler_state +-- ---------------------------- +CREATE TABLE qrtz_scheduler_state +( + sched_name varchar(120) NOT NULL, + instance_name varchar(190) NOT NULL, + last_checkin_time int8 NOT NULL, + checkin_interval int8 NOT NULL, + PRIMARY KEY (sched_name, instance_name) +); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + +-- ---------------------------- +-- qrtz_simple_triggers +-- ---------------------------- +CREATE TABLE qrtz_simple_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + repeat_count int8 NOT NULL, + repeat_interval int8 NOT NULL, + times_triggered int8 NOT NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +-- ---------------------------- +-- qrtz_simprop_triggers +-- ---------------------------- +CREATE TABLE qrtz_simprop_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + str_prop_1 varchar(512) NULL DEFAULT NULL, + str_prop_2 varchar(512) NULL DEFAULT NULL, + str_prop_3 varchar(512) NULL DEFAULT NULL, + int_prop_1 int4 NULL DEFAULT NULL, + int_prop_2 int4 NULL DEFAULT NULL, + long_prop_1 int8 NULL DEFAULT NULL, + long_prop_2 int8 NULL DEFAULT NULL, + dec_prop_1 numeric(13, 4) NULL DEFAULT NULL, + dec_prop_2 numeric(13, 4) NULL DEFAULT NULL, + bool_prop_1 varchar(1) NULL DEFAULT NULL, + bool_prop_2 varchar(1) NULL DEFAULT NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +-- ---------------------------- +-- qrtz_triggers +-- ---------------------------- +CREATE TABLE qrtz_triggers +( + sched_name varchar(120) NOT NULL, + trigger_name varchar(190) NOT NULL, + trigger_group varchar(190) NOT NULL, + job_name varchar(190) NOT NULL, + job_group varchar(190) NOT NULL, + description varchar(250) NULL DEFAULT NULL, + next_fire_time int8 NULL DEFAULT NULL, + prev_fire_time int8 NULL DEFAULT NULL, + priority int4 NULL DEFAULT NULL, + trigger_state varchar(16) NOT NULL, + trigger_type varchar(8) NOT NULL, + start_time int8 NOT NULL, + end_time int8 NULL DEFAULT NULL, + calendar_name varchar(190) NULL DEFAULT NULL, + misfire_instr int2 NULL DEFAULT NULL, + job_data bytea NULL, + PRIMARY KEY (sched_name, trigger_name, trigger_group) +); + +CREATE INDEX idx_qrtz_t_j ON qrtz_triggers (sched_name, job_name, job_group); +CREATE INDEX idx_qrtz_t_jg ON qrtz_triggers (sched_name, job_group); +CREATE INDEX idx_qrtz_t_c ON qrtz_triggers (sched_name, calendar_name); +CREATE INDEX idx_qrtz_t_g ON qrtz_triggers (sched_name, trigger_group); +CREATE INDEX idx_qrtz_t_state ON qrtz_triggers (sched_name, trigger_state); +CREATE INDEX idx_qrtz_t_n_state ON qrtz_triggers (sched_name, trigger_name, trigger_group, trigger_state); +CREATE INDEX idx_qrtz_t_n_g_state ON qrtz_triggers (sched_name, trigger_group, trigger_state); +CREATE INDEX idx_qrtz_t_next_fire_time ON qrtz_triggers (sched_name, next_fire_time); +CREATE INDEX idx_qrtz_t_nft_st ON qrtz_triggers (sched_name, trigger_state, next_fire_time); +CREATE INDEX idx_qrtz_t_nft_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time); +CREATE INDEX idx_qrtz_t_nft_st_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_state); +CREATE INDEX idx_qrtz_t_nft_st_misfire_grp ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_group, + trigger_state); + +-- @formatter:off +BEGIN; +COMMIT; +-- @formatter:on + + +-- ---------------------------- +-- FK: qrtz_blob_triggers +-- ---------------------------- +ALTER TABLE qrtz_blob_triggers + ADD CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, + trigger_name, + trigger_group); + +-- ---------------------------- +-- FK: qrtz_cron_triggers +-- ---------------------------- +ALTER TABLE qrtz_cron_triggers + ADD CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group); + +-- ---------------------------- +-- FK: qrtz_simple_triggers +-- ---------------------------- +ALTER TABLE qrtz_simple_triggers + ADD CONSTRAINT qrtz_simple_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, + trigger_name, + trigger_group); + +-- ---------------------------- +-- FK: qrtz_simprop_triggers +-- ---------------------------- +ALTER TABLE qrtz_simprop_triggers + ADD CONSTRAINT qrtz_simprop_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group); + +-- ---------------------------- +-- FK: qrtz_triggers +-- ---------------------------- +ALTER TABLE qrtz_triggers + ADD CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details (sched_name, job_name, job_group); diff --git a/sql/postgresql/ruoyi-vue-pro.sql b/sql/postgresql/ruoyi-vue-pro.sql new file mode 100644 index 0000000..758ab65 --- /dev/null +++ b/sql/postgresql/ruoyi-vue-pro.sql @@ -0,0 +1,4723 @@ +/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : PostgreSQL + + Date: 2024-05-08 00:11:06 +*/ + + +-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +DROP TABLE IF EXISTS dual; +CREATE TABLE dual +( + id int2 +); + +COMMENT ON TABLE dual IS '数据库连接的表'; + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +-- @formatter:off +INSERT INTO dual VALUES (1); +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_access_log; +CREATE TABLE infra_api_access_log +( + id int8 NOT NULL, + trace_id varchar(64) NOT NULL DEFAULT '', + user_id int8 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + application_name varchar(50) NOT NULL, + request_method varchar(16) NOT NULL DEFAULT '', + request_url varchar(255) NOT NULL DEFAULT '', + request_params text NULL, + response_body text NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + operate_module varchar(50) NULL DEFAULT NULL, + operate_name varchar(50) NULL DEFAULT NULL, + operate_type int2 NULL DEFAULT 0, + begin_time timestamp NOT NULL, + end_time timestamp NOT NULL, + duration int4 NOT NULL, + result_code int4 NOT NULL DEFAULT 0, + result_msg varchar(512) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_api_access_log + ADD CONSTRAINT pk_infra_api_access_log PRIMARY KEY (id); + +CREATE INDEX idx_infra_api_access_log_01 ON infra_api_access_log (create_time); + +COMMENT ON COLUMN infra_api_access_log.id IS '日志主键'; +COMMENT ON COLUMN infra_api_access_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN infra_api_access_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_access_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_access_log.application_name IS '应用名'; +COMMENT ON COLUMN infra_api_access_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_access_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_access_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_access_log.response_body IS '响应结果'; +COMMENT ON COLUMN infra_api_access_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_access_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_access_log.operate_module IS '操作模块'; +COMMENT ON COLUMN infra_api_access_log.operate_name IS '操作名'; +COMMENT ON COLUMN infra_api_access_log.operate_type IS '操作分类'; +COMMENT ON COLUMN infra_api_access_log.begin_time IS '开始请求时间'; +COMMENT ON COLUMN infra_api_access_log.end_time IS '结束请求时间'; +COMMENT ON COLUMN infra_api_access_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_api_access_log.result_code IS '结果码'; +COMMENT ON COLUMN infra_api_access_log.result_msg IS '结果提示'; +COMMENT ON COLUMN infra_api_access_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_access_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_access_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_access_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_access_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_access_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_access_log IS 'API 访问日志表'; + +DROP SEQUENCE IF EXISTS infra_api_access_log_seq; +CREATE SEQUENCE infra_api_access_log_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_error_log; +CREATE TABLE infra_api_error_log +( + id int4 NOT NULL, + trace_id varchar(64) NOT NULL, + user_id int4 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + application_name varchar(50) NOT NULL, + request_method varchar(16) NOT NULL, + request_url varchar(255) NOT NULL, + request_params varchar(8000) NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + exception_time timestamp NOT NULL, + exception_name varchar(128) NOT NULL DEFAULT '', + exception_message text NOT NULL, + exception_root_cause_message text NOT NULL, + exception_stack_trace text NOT NULL, + exception_class_name varchar(512) NOT NULL, + exception_file_name varchar(512) NOT NULL, + exception_method_name varchar(512) NOT NULL, + exception_line_number int4 NOT NULL, + process_status int2 NOT NULL, + process_time timestamp NULL DEFAULT NULL, + process_user_id int4 NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_api_error_log + ADD CONSTRAINT pk_infra_api_error_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_api_error_log.id IS '编号'; +COMMENT ON COLUMN infra_api_error_log.trace_id IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; +COMMENT ON COLUMN infra_api_error_log.user_id IS '用户编号'; +COMMENT ON COLUMN infra_api_error_log.user_type IS '用户类型'; +COMMENT ON COLUMN infra_api_error_log.application_name IS '应用名 + * + * 目前读取 spring.application.name'; +COMMENT ON COLUMN infra_api_error_log.request_method IS '请求方法名'; +COMMENT ON COLUMN infra_api_error_log.request_url IS '请求地址'; +COMMENT ON COLUMN infra_api_error_log.request_params IS '请求参数'; +COMMENT ON COLUMN infra_api_error_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN infra_api_error_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN infra_api_error_log.exception_time IS '异常发生时间'; +COMMENT ON COLUMN infra_api_error_log.exception_name IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; +COMMENT ON COLUMN infra_api_error_log.exception_message IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_root_cause_message IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; +COMMENT ON COLUMN infra_api_error_log.exception_stack_trace IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; +COMMENT ON COLUMN infra_api_error_log.exception_class_name IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_file_name IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_method_name IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; +COMMENT ON COLUMN infra_api_error_log.exception_line_number IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; +COMMENT ON COLUMN infra_api_error_log.process_status IS '处理状态'; +COMMENT ON COLUMN infra_api_error_log.process_time IS '处理时间'; +COMMENT ON COLUMN infra_api_error_log.process_user_id IS '处理用户编号'; +COMMENT ON COLUMN infra_api_error_log.creator IS '创建者'; +COMMENT ON COLUMN infra_api_error_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_api_error_log.updater IS '更新者'; +COMMENT ON COLUMN infra_api_error_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_api_error_log.deleted IS '是否删除'; +COMMENT ON COLUMN infra_api_error_log.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_api_error_log IS '系统异常日志'; + +DROP SEQUENCE IF EXISTS infra_api_error_log_seq; +CREATE SEQUENCE infra_api_error_log_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_column; +CREATE TABLE infra_codegen_column +( + id int8 NOT NULL, + table_id int8 NOT NULL, + column_name varchar(200) NOT NULL, + data_type varchar(100) NOT NULL, + column_comment varchar(500) NOT NULL, + nullable bool NOT NULL, + primary_key bool NOT NULL, + ordinal_position int4 NOT NULL, + java_type varchar(32) NOT NULL, + java_field varchar(64) NOT NULL, + dict_type varchar(200) NULL DEFAULT '', + example varchar(64) NULL DEFAULT NULL, + create_operation bool NOT NULL, + update_operation bool NOT NULL, + list_operation bool NOT NULL, + list_operation_condition varchar(32) NOT NULL DEFAULT '=', + list_operation_result bool NOT NULL, + html_type varchar(32) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_codegen_column + ADD CONSTRAINT pk_infra_codegen_column PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_column.id IS '编号'; +COMMENT ON COLUMN infra_codegen_column.table_id IS '表编号'; +COMMENT ON COLUMN infra_codegen_column.column_name IS '字段名'; +COMMENT ON COLUMN infra_codegen_column.data_type IS '字段类型'; +COMMENT ON COLUMN infra_codegen_column.column_comment IS '字段描述'; +COMMENT ON COLUMN infra_codegen_column.nullable IS '是否允许为空'; +COMMENT ON COLUMN infra_codegen_column.primary_key IS '是否主键'; +COMMENT ON COLUMN infra_codegen_column.ordinal_position IS '排序'; +COMMENT ON COLUMN infra_codegen_column.java_type IS 'Java 属性类型'; +COMMENT ON COLUMN infra_codegen_column.java_field IS 'Java 属性名'; +COMMENT ON COLUMN infra_codegen_column.dict_type IS '字典类型'; +COMMENT ON COLUMN infra_codegen_column.example IS '数据示例'; +COMMENT ON COLUMN infra_codegen_column.create_operation IS '是否为 Create 创建操作的字段'; +COMMENT ON COLUMN infra_codegen_column.update_operation IS '是否为 Update 更新操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation IS '是否为 List 查询操作的字段'; +COMMENT ON COLUMN infra_codegen_column.list_operation_condition IS 'List 查询操作的条件类型'; +COMMENT ON COLUMN infra_codegen_column.list_operation_result IS '是否为 List 查询操作的返回字段'; +COMMENT ON COLUMN infra_codegen_column.html_type IS '显示类型'; +COMMENT ON COLUMN infra_codegen_column.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_column.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_column.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_column.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_column.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_column IS '代码生成表字段定义'; + +DROP SEQUENCE IF EXISTS infra_codegen_column_seq; +CREATE SEQUENCE infra_codegen_column_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_table; +CREATE TABLE infra_codegen_table +( + id int8 NOT NULL, + data_source_config_id int8 NOT NULL, + scene int2 NOT NULL DEFAULT 1, + table_name varchar(200) NOT NULL DEFAULT '', + table_comment varchar(500) NOT NULL DEFAULT '', + remark varchar(500) NULL DEFAULT NULL, + module_name varchar(30) NOT NULL, + business_name varchar(30) NOT NULL, + class_name varchar(100) NOT NULL DEFAULT '', + class_comment varchar(50) NOT NULL, + author varchar(50) NOT NULL, + template_type int2 NOT NULL DEFAULT 1, + front_type int2 NOT NULL, + parent_menu_id int8 NULL DEFAULT NULL, + master_table_id int8 NULL DEFAULT NULL, + sub_join_column_id int8 NULL DEFAULT NULL, + sub_join_many bool NULL DEFAULT NULL, + tree_parent_column_id int8 NULL DEFAULT NULL, + tree_name_column_id int8 NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_codegen_table + ADD CONSTRAINT pk_infra_codegen_table PRIMARY KEY (id); + +COMMENT ON COLUMN infra_codegen_table.id IS '编号'; +COMMENT ON COLUMN infra_codegen_table.data_source_config_id IS '数据源配置的编号'; +COMMENT ON COLUMN infra_codegen_table.scene IS '生成场景'; +COMMENT ON COLUMN infra_codegen_table.table_name IS '表名称'; +COMMENT ON COLUMN infra_codegen_table.table_comment IS '表描述'; +COMMENT ON COLUMN infra_codegen_table.remark IS '备注'; +COMMENT ON COLUMN infra_codegen_table.module_name IS '模块名'; +COMMENT ON COLUMN infra_codegen_table.business_name IS '业务名'; +COMMENT ON COLUMN infra_codegen_table.class_name IS '类名称'; +COMMENT ON COLUMN infra_codegen_table.class_comment IS '类描述'; +COMMENT ON COLUMN infra_codegen_table.author IS '作者'; +COMMENT ON COLUMN infra_codegen_table.template_type IS '模板类型'; +COMMENT ON COLUMN infra_codegen_table.front_type IS '前端类型'; +COMMENT ON COLUMN infra_codegen_table.parent_menu_id IS '父菜单编号'; +COMMENT ON COLUMN infra_codegen_table.master_table_id IS '主表的编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_column_id IS '子表关联主表的字段编号'; +COMMENT ON COLUMN infra_codegen_table.sub_join_many IS '主表与子表是否一对多'; +COMMENT ON COLUMN infra_codegen_table.tree_parent_column_id IS '树表的父字段编号'; +COMMENT ON COLUMN infra_codegen_table.tree_name_column_id IS '树表的名字字段编号'; +COMMENT ON COLUMN infra_codegen_table.creator IS '创建者'; +COMMENT ON COLUMN infra_codegen_table.create_time IS '创建时间'; +COMMENT ON COLUMN infra_codegen_table.updater IS '更新者'; +COMMENT ON COLUMN infra_codegen_table.update_time IS '更新时间'; +COMMENT ON COLUMN infra_codegen_table.deleted IS '是否删除'; +COMMENT ON TABLE infra_codegen_table IS '代码生成表定义'; + +DROP SEQUENCE IF EXISTS infra_codegen_table_seq; +CREATE SEQUENCE infra_codegen_table_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_config; +CREATE TABLE infra_config +( + id int4 NOT NULL, + category varchar(50) NOT NULL, + type int2 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + config_key varchar(100) NOT NULL DEFAULT '', + value varchar(500) NOT NULL DEFAULT '', + visible bool NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_config + ADD CONSTRAINT pk_infra_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_config.id IS '参数主键'; +COMMENT ON COLUMN infra_config.category IS '参数分组'; +COMMENT ON COLUMN infra_config.type IS '参数类型'; +COMMENT ON COLUMN infra_config.name IS '参数名称'; +COMMENT ON COLUMN infra_config.config_key IS '参数键名'; +COMMENT ON COLUMN infra_config.value IS '参数键值'; +COMMENT ON COLUMN infra_config.visible IS '是否可见'; +COMMENT ON COLUMN infra_config.remark IS '备注'; +COMMENT ON COLUMN infra_config.creator IS '创建者'; +COMMENT ON COLUMN infra_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_config.updater IS '更新者'; +COMMENT ON COLUMN infra_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_config IS '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', '0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2024-04-03 17:22:28', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', '1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', '1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', '0'); +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 'test2', 2, 'test3', 'test4', 'test5', '1', 'test6', '1', '2023-12-03 09:55:16', '1', '2023-12-03 09:55:27', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_config_seq; +CREATE SEQUENCE infra_config_seq + START 13; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_data_source_config; +CREATE TABLE infra_data_source_config +( + id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + url varchar(1024) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NOT NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_data_source_config + ADD CONSTRAINT pk_infra_data_source_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_data_source_config.id IS '主键编号'; +COMMENT ON COLUMN infra_data_source_config.name IS '参数名称'; +COMMENT ON COLUMN infra_data_source_config.url IS '数据源连接'; +COMMENT ON COLUMN infra_data_source_config.username IS '用户名'; +COMMENT ON COLUMN infra_data_source_config.password IS '密码'; +COMMENT ON COLUMN infra_data_source_config.creator IS '创建者'; +COMMENT ON COLUMN infra_data_source_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_data_source_config.updater IS '更新者'; +COMMENT ON COLUMN infra_data_source_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_data_source_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_data_source_config IS '数据源配置表'; + +DROP SEQUENCE IF EXISTS infra_data_source_config_seq; +CREATE SEQUENCE infra_data_source_config_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS infra_file; +CREATE TABLE infra_file +( + id int8 NOT NULL, + config_id int8 NULL DEFAULT NULL, + name varchar(256) NULL DEFAULT NULL, + path varchar(512) NOT NULL, + url varchar(1024) NOT NULL, + type varchar(128) NULL DEFAULT NULL, + size int4 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file + ADD CONSTRAINT pk_infra_file PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file.id IS '文件编号'; +COMMENT ON COLUMN infra_file.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file.name IS '文件名'; +COMMENT ON COLUMN infra_file.path IS '文件路径'; +COMMENT ON COLUMN infra_file.url IS '文件 URL'; +COMMENT ON COLUMN infra_file.type IS '文件类型'; +COMMENT ON COLUMN infra_file.size IS '文件大小'; +COMMENT ON COLUMN infra_file.creator IS '创建者'; +COMMENT ON COLUMN infra_file.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file.updater IS '更新者'; +COMMENT ON COLUMN infra_file.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file.deleted IS '是否删除'; +COMMENT ON TABLE infra_file IS '文件表'; + +DROP SEQUENCE IF EXISTS infra_file_seq; +CREATE SEQUENCE infra_file_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_config; +CREATE TABLE infra_file_config +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + storage int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + master bool NOT NULL, + config varchar(4096) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file_config + ADD CONSTRAINT pk_infra_file_config PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_config.id IS '编号'; +COMMENT ON COLUMN infra_file_config.name IS '配置名'; +COMMENT ON COLUMN infra_file_config.storage IS '存储器'; +COMMENT ON COLUMN infra_file_config.remark IS '备注'; +COMMENT ON COLUMN infra_file_config.master IS '是否为主配置'; +COMMENT ON COLUMN infra_file_config.config IS '存储配置'; +COMMENT ON COLUMN infra_file_config.creator IS '创建者'; +COMMENT ON COLUMN infra_file_config.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_config.updater IS '更新者'; +COMMENT ON COLUMN infra_file_config.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_config.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_config IS '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (4, '数据库', 1, '我是数据库', '0', '{"@class":"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', '1', '2022-03-15 23:56:24', '1', '2024-02-28 22:54:07', '0'); +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (22, '七牛存储器', 20, '', '1', '{"@class":"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3.cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS","accessSecret":"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY"}', '1', '2024-01-13 22:11:12', '1', '2024-04-03 19:38:34', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_file_config_seq; +CREATE SEQUENCE infra_file_config_seq + START 23; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_content; +CREATE TABLE infra_file_content +( + id int8 NOT NULL, + config_id int8 NOT NULL, + path varchar(512) NOT NULL, + content bytea NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_file_content + ADD CONSTRAINT pk_infra_file_content PRIMARY KEY (id); + +COMMENT ON COLUMN infra_file_content.id IS '编号'; +COMMENT ON COLUMN infra_file_content.config_id IS '配置编号'; +COMMENT ON COLUMN infra_file_content.path IS '文件路径'; +COMMENT ON COLUMN infra_file_content.content IS '文件内容'; +COMMENT ON COLUMN infra_file_content.creator IS '创建者'; +COMMENT ON COLUMN infra_file_content.create_time IS '创建时间'; +COMMENT ON COLUMN infra_file_content.updater IS '更新者'; +COMMENT ON COLUMN infra_file_content.update_time IS '更新时间'; +COMMENT ON COLUMN infra_file_content.deleted IS '是否删除'; +COMMENT ON TABLE infra_file_content IS '文件表'; + +DROP SEQUENCE IF EXISTS infra_file_content_seq; +CREATE SEQUENCE infra_file_content_seq + START 1; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS infra_job; +CREATE TABLE infra_job +( + id int8 NOT NULL, + name varchar(32) NOT NULL, + status int2 NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) NULL DEFAULT NULL, + cron_expression varchar(32) NOT NULL, + retry_count int4 NOT NULL DEFAULT 0, + retry_interval int4 NOT NULL DEFAULT 0, + monitor_timeout int4 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_job + ADD CONSTRAINT pk_infra_job PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job.id IS '任务编号'; +COMMENT ON COLUMN infra_job.name IS '任务名称'; +COMMENT ON COLUMN infra_job.status IS '任务状态'; +COMMENT ON COLUMN infra_job.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job.cron_expression IS 'CRON 表达式'; +COMMENT ON COLUMN infra_job.retry_count IS '重试次数'; +COMMENT ON COLUMN infra_job.retry_interval IS '重试间隔'; +COMMENT ON COLUMN infra_job.monitor_timeout IS '监控超时时间'; +COMMENT ON COLUMN infra_job.creator IS '创建者'; +COMMENT ON COLUMN infra_job.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job.updater IS '更新者'; +COMMENT ON COLUMN infra_job.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job.deleted IS '是否删除'; +COMMENT ON TABLE infra_job IS '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2023-07-09 20:51:41', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 14:36:26', '1', '2023-07-22 15:39:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 15:36:23', '1', '2023-07-22 15:39:54', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-23 21:03:44', '1', '2023-07-23 21:09:00', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (21, '交易订单的自动过期 Job', 2, 'tradeOrderAutoCancelJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-25 23:43:26', '1', '2023-09-26 19:23:30', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (22, '交易订单的自动收货 Job', 2, 'tradeOrderAutoReceiveJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 19:23:53', '1', '2023-09-26 23:38:08', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (23, '交易订单的自动评论 Job', 2, 'tradeOrderAutoCommentJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-26 23:38:29', '1', '2023-09-27 11:03:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (24, '佣金解冻 Job', 2, 'brokerageRecordUnfreezeJob', '', '0 * * * * ?', 3, 0, 0, '1', '2023-09-28 22:01:46', '1', '2023-09-28 22:01:56', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (25, '访问日志清理 Job', 2, 'accessLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 10:59:41', '1', '2023-10-03 11:01:10', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (26, '错误日志清理 Job', 2, 'errorLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:00:43', '1', '2023-10-03 11:01:12', '0'); +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (27, '任务日志清理 Job', 2, 'jobLogCleanJob', '', '0 0 0 * * ?', 3, 0, 0, '1', '2023-10-03 11:01:33', '1', '2023-10-03 11:01:42', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS infra_job_seq; +CREATE SEQUENCE infra_job_seq + START 28; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_job_log; +CREATE TABLE infra_job_log +( + id int8 NOT NULL, + job_id int8 NOT NULL, + handler_name varchar(64) NOT NULL, + handler_param varchar(255) NULL DEFAULT NULL, + execute_index int2 NOT NULL DEFAULT 1, + begin_time timestamp NOT NULL, + end_time timestamp NULL DEFAULT NULL, + duration int4 NULL DEFAULT NULL, + status int2 NOT NULL, + result varchar(4000) NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE infra_job_log + ADD CONSTRAINT pk_infra_job_log PRIMARY KEY (id); + +COMMENT ON COLUMN infra_job_log.id IS '日志编号'; +COMMENT ON COLUMN infra_job_log.job_id IS '任务编号'; +COMMENT ON COLUMN infra_job_log.handler_name IS '处理器的名字'; +COMMENT ON COLUMN infra_job_log.handler_param IS '处理器的参数'; +COMMENT ON COLUMN infra_job_log.execute_index IS '第几次执行'; +COMMENT ON COLUMN infra_job_log.begin_time IS '开始执行时间'; +COMMENT ON COLUMN infra_job_log.end_time IS '结束执行时间'; +COMMENT ON COLUMN infra_job_log.duration IS '执行时长'; +COMMENT ON COLUMN infra_job_log.status IS '任务状态'; +COMMENT ON COLUMN infra_job_log.result IS '结果数据'; +COMMENT ON COLUMN infra_job_log.creator IS '创建者'; +COMMENT ON COLUMN infra_job_log.create_time IS '创建时间'; +COMMENT ON COLUMN infra_job_log.updater IS '更新者'; +COMMENT ON COLUMN infra_job_log.update_time IS '更新时间'; +COMMENT ON COLUMN infra_job_log.deleted IS '是否删除'; +COMMENT ON TABLE infra_job_log IS '定时任务日志表'; + +DROP SEQUENCE IF EXISTS infra_job_log_seq; +CREATE SEQUENCE infra_job_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS system_dept; +CREATE TABLE system_dept +( + id int8 NOT NULL, + name varchar(30) NOT NULL DEFAULT '', + parent_id int8 NOT NULL DEFAULT 0, + sort int4 NOT NULL DEFAULT 0, + leader_user_id int8 NULL DEFAULT NULL, + phone varchar(11) NULL DEFAULT NULL, + email varchar(50) NULL DEFAULT NULL, + status int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_dept + ADD CONSTRAINT pk_system_dept PRIMARY KEY (id); + +COMMENT ON COLUMN system_dept.id IS '部门id'; +COMMENT ON COLUMN system_dept.name IS '部门名称'; +COMMENT ON COLUMN system_dept.parent_id IS '父部门id'; +COMMENT ON COLUMN system_dept.sort IS '显示顺序'; +COMMENT ON COLUMN system_dept.leader_user_id IS '负责人'; +COMMENT ON COLUMN system_dept.phone IS '联系电话'; +COMMENT ON COLUMN system_dept.email IS '邮箱'; +COMMENT ON COLUMN system_dept.status IS '部门状态(0正常 1停用)'; +COMMENT ON COLUMN system_dept.creator IS '创建者'; +COMMENT ON COLUMN system_dept.create_time IS '创建时间'; +COMMENT ON COLUMN system_dept.updater IS '更新者'; +COMMENT ON COLUMN system_dept.update_time IS '更新时间'; +COMMENT ON COLUMN system_dept.deleted IS '是否删除'; +COMMENT ON COLUMN system_dept.tenant_id IS '租户编号'; +COMMENT ON TABLE system_dept IS '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, '芋道源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-11-14 23:30:36', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:53:35', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2024-03-24 20:56:04', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:15', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, '运维部门', 101, 5, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2023-12-02 09:28:22', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-02-16 08:35:45', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', '0', 121); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', '0', 122); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, '产品部门', 101, 100, 1, NULL, NULL, 1, '1', '2023-12-02 09:45:13', '1', '2023-12-02 09:45:31', '0', 1); +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, '支持部门', 102, 3, 104, NULL, NULL, 1, '1', '2023-12-02 09:47:38', '1', '2023-12-02 09:47:38', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dept_seq; +CREATE SEQUENCE system_dept_seq + START 114; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_data; +CREATE TABLE system_dict_data +( + id int8 NOT NULL, + sort int4 NOT NULL DEFAULT 0, + label varchar(100) NOT NULL DEFAULT '', + value varchar(100) NOT NULL DEFAULT '', + dict_type varchar(100) NOT NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + color_type varchar(100) NULL DEFAULT '', + css_class varchar(100) NULL DEFAULT '', + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_dict_data + ADD CONSTRAINT pk_system_dict_data PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_data.id IS '字典编码'; +COMMENT ON COLUMN system_dict_data.sort IS '字典排序'; +COMMENT ON COLUMN system_dict_data.label IS '字典标签'; +COMMENT ON COLUMN system_dict_data.value IS '字典键值'; +COMMENT ON COLUMN system_dict_data.dict_type IS '字典类型'; +COMMENT ON COLUMN system_dict_data.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_data.color_type IS '颜色类型'; +COMMENT ON COLUMN system_dict_data.css_class IS 'css 样式'; +COMMENT ON COLUMN system_dict_data.remark IS '备注'; +COMMENT ON COLUMN system_dict_data.creator IS '创建者'; +COMMENT ON COLUMN system_dict_data.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_data.updater IS '更新者'; +COMMENT ON COLUMN system_dict_data.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_data.deleted IS '是否删除'; +COMMENT ON TABLE system_dict_data IS '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', '2022-03-29 00:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 2, '女', '2', 'system_user_sex', 0, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 23:30:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:05:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:06:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (16, 0, '其它', '0', 'infra_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (17, 1, '查询', '1', 'infra_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (18, 2, '新增', '2', 'infra_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (19, 3, '修改', '3', 'infra_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (20, 4, '删除', '4', 'infra_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (22, 5, '导出', '5', 'infra_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (23, 6, '导入', '6', 'infra_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', '2022-02-16 13:23:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:09:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', '2022-03-10 16:33:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', '2022-03-10 16:33:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', '2022-02-16 19:33:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', '2022-02-16 19:07:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', '2022-02-16 19:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', '2022-02-16 19:07:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', '2021-02-26 00:16:27', '1', '2022-02-16 10:22:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', '2021-02-26 00:16:34', '1', '2022-02-16 10:22:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2022-02-16 10:09:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-16 10:26:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-16 10:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-16 10:26:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-16 10:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-16 10:28:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-16 10:28:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-16 10:28:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-16 13:11:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-16 13:11:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-16 13:11:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-16 13:11:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', '2022-02-16 10:00:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', '2022-02-16 10:00:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', '2022-02-16 10:00:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', '2021-12-03 10:40:24', '1', '2023-07-19 20:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2023-07-19 20:08:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2023-07-19 20:08:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2023-07-19 20:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2023-07-19 20:09:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', '2021-12-03 10:42:55', '1', '2023-07-19 20:09:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2023-07-19 20:09:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', '1', '2023-07-19 10:08:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', '1', '2023-07-19 10:08:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', '2023-07-19 10:08:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', '2023-07-19 18:04:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', '2023-07-19 18:05:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', '2023-07-19 18:04:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (600, 5, '首页', '1', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (601, 4, '秒杀活动页', '2', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (602, 3, '砍价活动页', '3', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (603, 2, '限时折扣页', '4', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (604, 1, '满减送页', '5', 'promotion_banner_position', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', '2021-12-10 16:44:59', '1', '2023-07-19 10:14:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', '1', '2023-07-19 10:15:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:46:26', '1', '2023-07-19 10:15:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1127, 1, '审批中', '1', 'bpm_process_instance_status', 0, 'default', '', '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2024-03-16 16:11:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1128, 2, '审批通过', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2024-03-16 16:11:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1129, 1, '审批中', '1', 'bpm_task_status', 0, 'primary', '', '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2024-03-08 22:41:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1130, 2, '审批通过', '2', 'bpm_task_status', 0, 'success', '', '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1131, 3, '审批不通过', '3', 'bpm_task_status', 0, 'danger', '', '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2024-03-08 22:41:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1132, 4, '已取消', '4', 'bpm_task_status', 0, 'info', '', '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2024-03-08 22:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1135, 10, '角色', '10', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '1', '2024-03-06 02:53:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '1', '2024-03-06 02:53:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_candidate_strategy', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2024-03-06 02:53:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1138, 30, '用户', '30', 'bpm_task_candidate_strategy', 0, 'info', '', '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '1', '2024-03-06 02:53:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1139, 40, '用户组', '40', 'bpm_task_candidate_strategy', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1140, 60, '流程表达式', '60', 'bpm_task_candidate_strategy', 0, 'danger', '', '任务分配规则的类型 - 流程表达式', '103', '2022-01-12 23:34:43', '1', '2024-03-06 02:53:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1141, 22, '岗位', '22', 'bpm_task_candidate_strategy', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '1', '2024-03-06 02:53:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', '2022-03-15 00:25:28', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', '2022-03-15 00:25:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', '2022-03-15 00:26:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', '2022-03-15 00:26:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', '2022-03-15 00:26:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', '2022-05-09 23:58:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', '2022-10-24 21:19:47', '1', '2022-10-24 21:20:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', '2022-10-24 21:20:54', '1', '2022-10-24 21:21:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', '2022-10-24 21:21:11', '1', '2022-10-24 21:21:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', '2022-11-01 12:46:41', '1', '2022-11-01 12:50:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', '2022-11-01 12:46:51', '1', '2022-11-01 12:50:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', '2022-11-02 00:07:34', '1', '2022-11-04 00:07:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', '2022-11-02 00:07:54', '1', '2022-11-04 00:07:52', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1169, 1, '通用劵', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', '2022-11-02 00:28:22', '1', '2023-09-28 00:27:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1170, 2, '商品劵', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', '2022-11-02 00:28:34', '1', '2023-09-28 00:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1171, 1, '未使用', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', '2022-11-04 00:15:08', '1', '2023-10-03 12:54:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', '2022-11-04 00:15:21', '1', '2022-11-04 19:16:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', '2022-11-04 00:15:43', '1', '2022-11-04 19:16:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', '2022-11-04 19:13:00', '1', '2022-11-04 19:13:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', '2022-11-04 19:13:13', '1', '2022-11-04 19:14:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', '2022-11-04 22:54:49', '1', '2022-11-04 22:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', '2022-11-04 22:55:06', '1', '2022-11-04 22:55:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', '2022-11-04 22:55:41', '1', '2022-11-04 22:55:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', '2022-11-04 22:56:10', '1', '2022-11-04 22:56:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', '2022-11-04 22:59:45', '1', '2022-11-04 22:59:45', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', '2022-11-04 23:00:02', '1', '2022-11-04 23:00:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', '2022-11-19 20:53:33', '1', '2022-11-19 20:54:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', '2022-11-19 20:54:36', '1', '2022-11-19 20:58:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', '2022-11-19 20:56:56', '1', '2022-11-19 20:59:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', '2022-11-19 20:59:54', '1', '2022-11-19 21:00:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', '2022-11-19 21:00:33', '1', '2022-11-19 21:00:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', '2022-11-19 21:01:29', '1', '2022-11-19 21:01:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', '2022-11-19 21:02:17', '1', '2022-11-19 21:02:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', '2022-11-19 21:02:37', '1', '2022-11-19 21:03:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', '2022-11-19 21:05:05', '1', '2022-11-19 21:38:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', '2022-11-19 21:05:32', '1', '2022-11-19 21:38:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', '2022-11-19 21:39:19', '1', '2022-11-19 21:39:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', '2022-11-19 21:39:38', '1', '2022-11-19 21:39:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', '2022-12-10 10:51:11', '1', '2022-12-10 10:51:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', '2022-12-10 10:51:30', '1', '2022-12-10 10:51:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', '2022-12-10 10:54:16', '1', '2022-12-10 10:52:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', '2022-12-10 10:54:42', '1', '2022-12-10 10:52:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', '2022-12-10 10:55:02', '1', '2022-12-10 10:59:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', '2022-12-10 16:34:14', '1', '2022-12-10 16:34:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', '2022-12-10 16:34:26', '1', '2022-12-10 16:34:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1201, 2, '拼团订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', '2022-12-10 16:34:36', '1', '2022-12-10 16:34:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1202, 3, '砍价订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', '2022-12-10 16:34:48', '1', '2022-12-10 16:34:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', '2022-12-10 16:49:29', '1', '2022-12-10 16:49:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', '2022-12-10 16:49:53', '1', '2022-12-10 16:51:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', '2022-12-10 16:50:13', '1', '2022-12-10 16:51:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1209, 1, '售后中', '1', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2022-12-10 20:59:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1210, 2, '已退款', '2', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2022-12-10 20:59:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:20:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:21:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:23:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', '2023-01-26 09:53:49', '1', '2023-01-26 16:36:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', '2023-01-26 09:54:28', '1', '2023-01-26 16:36:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', '2023-01-26 09:54:50', '1', '2023-01-26 16:36:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', '2023-01-26 09:55:06', '1', '2023-01-26 16:36:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', '2023-01-28 10:35:59', '1', '2023-01-28 10:35:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', '2023-01-28 10:36:20', '1', '2023-01-28 10:36:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', '2023-02-18 23:32:24', '1', '2023-07-19 20:09:23', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:03:55', '1', '2023-04-13 00:03:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1335, 11, '订单积分抵扣', '11', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-10-11 07:41:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-08-20 11:59:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', '2023-07-19 18:05:37', '1', '2023-07-19 18:05:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', '2023-07-19 18:10:47', '1', '2023-07-19 18:11:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', '2023-07-19 18:11:05', '1', '2023-07-19 18:11:27', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', '2023-07-19 20:07:47', '1', '2023-07-19 20:09:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', '2023-07-19 20:08:06', '1', '2023-07-19 20:09:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', '2023-07-20 12:23:17', '1', '2023-07-20 12:23:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', '2023-07-20 12:23:26', '1', '2023-07-20 12:23:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', '2023-07-29 11:10:51', '1', '2023-07-29 03:14:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1349, 12, '订单积分抵扣(整单取消)', '12', 'member_point_biz_type', 0, '', '', '', '1', '2023-08-20 12:00:03', '1', '2023-10-11 07:42:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1352, 11, '下单奖励', '11', 'member_experience_biz_type', 0, 'success', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1353, 12, '下单奖励(整单取消)', '12', 'member_experience_biz_type', 0, 'warning', '', NULL, '', '2023-08-22 12:41:01', '1', '2023-10-11 07:45:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:04:55', '1', '2023-08-23 00:04:55', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:05:05', '1', '2023-08-23 00:05:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1358, 3, '品类劵', '3', 'promotion_product_scope', 0, 'default', '', '', '1', '2023-09-01 23:43:07', '1', '2023-09-28 00:27:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1359, 1, '人人分销', '1', 'brokerage_enabled_condition', 0, '', '', '所有用户都可以分销', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1360, 2, '指定分销', '2', 'brokerage_enabled_condition', 0, '', '', '仅可后台手动设置推广员', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1361, 1, '首次绑定', '1', 'brokerage_bind_mode', 0, '', '', '只要用户没有推广人,随时都可以绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1362, 2, '注册绑定', '2', 'brokerage_bind_mode', 0, '', '', '仅新用户注册时才能绑定推广关系', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1363, 3, '覆盖绑定', '3', 'brokerage_bind_mode', 0, '', '', '如果用户已经有推广人,推广人会被变更', '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1364, 1, '钱包', '1', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1365, 2, '银行卡', '2', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1366, 3, '微信', '3', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1367, 4, '支付宝', '4', 'brokerage_withdraw_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1368, 1, '订单返佣', '1', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1369, 2, '申请提现', '2', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1370, 3, '申请提现驳回', '3', 'brokerage_record_biz_type', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1371, 0, '待结算', '0', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1372, 1, '已结算', '1', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1373, 2, '已取消', '2', 'brokerage_record_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1374, 0, '审核中', '0', 'brokerage_withdraw_status', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1375, 10, '审核通过', '10', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1376, 11, '提现成功', '11', 'brokerage_withdraw_status', 0, 'success', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1377, 20, '审核不通过', '20', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1378, 21, '提现失败', '21', 'brokerage_withdraw_status', 0, 'danger', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1379, 0, '工商银行', '0', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1380, 1, '建设银行', '1', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1381, 2, '农业银行', '2', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1382, 3, '中国银行', '3', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1383, 4, '交通银行', '4', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1384, 5, '招商银行', '5', 'brokerage_bank_name', 0, '', '', NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1385, 21, '钱包', 'wallet', 'pay_channel_code', 0, 'primary', '', '', '1', '2023-10-01 21:46:19', '1', '2023-10-01 21:48:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1386, 1, '砍价中', '1', 'promotion_bargain_record_status', 0, 'default', '', '', '1', '2023-10-05 10:41:26', '1', '2023-10-05 10:41:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1387, 2, '砍价成功', '2', 'promotion_bargain_record_status', 0, 'success', '', '', '1', '2023-10-05 10:41:39', '1', '2023-10-05 10:41:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1388, 3, '砍价失败', '3', 'promotion_bargain_record_status', 0, 'warning', '', '', '1', '2023-10-05 10:41:57', '1', '2023-10-05 10:41:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1389, 1, '拼团中', '1', 'promotion_combination_record_status', 0, '', '', '', '1', '2023-10-08 07:24:44', '1', '2023-10-08 07:24:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1390, 2, '拼团成功', '2', 'promotion_combination_record_status', 0, 'success', '', '', '1', '2023-10-08 07:24:56', '1', '2023-10-08 07:24:56', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1391, 3, '拼团失败', '3', 'promotion_combination_record_status', 0, 'warning', '', '', '1', '2023-10-08 07:25:11', '1', '2023-10-08 07:25:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1392, 2, '管理员修改', '2', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:41:34', '1', '2023-10-11 07:41:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1393, 13, '订单积分抵扣(单个退款)', '13', 'member_point_biz_type', 0, '', '', '', '1', '2023-10-11 07:42:29', '1', '2023-10-11 07:42:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1394, 21, '订单积分奖励', '21', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:44', '1', '2023-10-11 07:42:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1395, 22, '订单积分奖励(整单取消)', '22', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:42:55', '1', '2023-10-11 07:43:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1396, 23, '订单积分奖励(单个退款)', '23', 'member_point_biz_type', 0, 'default', '', '', '1', '2023-10-11 07:43:16', '1', '2023-10-11 07:43:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1397, 13, '下单奖励(单个退款)', '13', 'member_experience_biz_type', 0, 'warning', '', '', '1', '2023-10-11 07:45:24', '1', '2023-10-11 07:45:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1398, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1399, 6, '支付宝', '6', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:38', '1', '2023-10-18 21:55:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1400, 7, '微信支付', '7', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:53', '1', '2023-10-18 21:55:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1401, 8, '其他', '8', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1402, 1, 'IT', '1', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:15', '1', '2024-02-18 23:30:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1403, 2, '金融业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:29', '1', '2024-02-18 23:30:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1404, 3, '房地产', '3', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:41', '1', '2024-02-18 23:30:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1405, 4, '商业服务', '4', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:54', '1', '2024-02-18 23:30:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1406, 5, '运输/物流', '5', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:03', '1', '2024-02-18 23:31:00', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1407, 6, '生产', '6', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:13', '1', '2024-02-18 23:31:08', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1408, 7, '政府', '7', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:27', '1', '2024-02-18 23:31:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1409, 8, '文化传媒', '8', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:37', '1', '2024-02-18 23:31:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', '2023-10-28 23:07:13', '1', '2023-10-28 23:07:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', '2023-10-28 23:07:35', '1', '2023-10-28 23:07:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', '2023-10-28 23:07:53', '1', '2023-10-28 23:07:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:29', '1', '2023-10-28 23:08:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:39', '1', '2023-10-28 23:08:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:47', '1', '2023-10-28 23:08:47', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:58', '1', '2023-10-28 23:08:58', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:12', '1', '2023-10-28 23:09:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:22', '1', '2023-10-28 23:09:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:39', '1', '2023-10-28 23:09:39', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:04', '1', '2023-10-28 23:10:04', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:18', '1', '2023-10-28 23:10:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:33', '1', '2023-10-28 23:10:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1435, 10, 'Gitee', '10', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:42', '1', '2023-11-04 13:04:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1436, 20, '钉钉', '20', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:04:54', '1', '2023-11-04 13:04:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1437, 30, '企业微信', '30', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:09', '1', '2023-11-04 13:05:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1438, 31, '微信公众平台', '31', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:18', '1', '2023-11-04 13:05:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1439, 32, '微信开放平台', '32', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:30', '1', '2023-11-04 13:05:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1440, 34, '微信小程序', '34', 'system_social_type', 0, '', '', '', '1', '2023-11-04 13:05:38', '1', '2023-11-04 13:07:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1441, 1, '上架', '1', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:34', '1', '2023-10-30 21:49:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1442, 0, '下架', '0', 'crm_product_status', 0, 'success', '', '', '1', '2023-10-30 21:49:13', '1', '2023-10-30 21:49:13', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1443, 15, '子表', '15', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-13 23:06:16', '1', '2023-11-13 23:06:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1444, 10, '主表(标准模式)', '10', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:32:49', '1', '2023-11-14 12:32:49', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1445, 11, '主表(ERP 模式)', '11', 'infra_codegen_template_type', 0, 'default', '', '', '1', '2023-11-14 12:33:05', '1', '2023-11-14 12:33:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1446, 12, '主表(内嵌模式)', '12', 'infra_codegen_template_type', 0, '', '', '', '1', '2023-11-14 12:33:31', '1', '2023-11-14 12:33:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1447, 1, '负责人', '1', 'crm_permission_level', 0, 'default', '', '', '1', '2023-11-30 09:53:12', '1', '2023-11-30 09:53:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1448, 2, '只读', '2', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:29', '1', '2023-11-30 09:53:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1449, 3, '读写', '3', 'crm_permission_level', 0, '', '', '', '1', '2023-11-30 09:53:36', '1', '2023-11-30 09:53:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1450, 0, '未提交', '0', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:56:59', '1', '2023-11-30 18:56:59', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1451, 10, '审批中', '10', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:10', '1', '2023-11-30 18:57:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1452, 20, '审核通过', '20', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:24', '1', '2023-11-30 18:57:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1453, 30, '审核不通过', '30', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:32', '1', '2023-11-30 18:57:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1454, 40, '已取消', '40', 'crm_audit_status', 0, '', '', '', '1', '2023-11-30 18:57:42', '1', '2023-11-30 18:57:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1456, 1, '支票', '1', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:29', '1', '2023-10-18 21:54:29', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1457, 2, '现金', '2', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:41', '1', '2023-10-18 21:54:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1458, 3, '邮政汇款', '3', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:54:53', '1', '2023-10-18 21:54:53', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1459, 4, '电汇', '4', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:07', '1', '2023-10-18 21:55:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1460, 5, '网上转账', '5', 'crm_receivable_return_type', 0, 'default', '', '', '1', '2023-10-18 21:55:24', '1', '2023-10-18 21:55:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1461, 1, '个', '1', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:26', '1', '2023-12-05 23:02:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1462, 2, '块', '2', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:34', '1', '2023-12-05 23:02:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1463, 3, '只', '3', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:02:57', '1', '2023-12-05 23:02:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1464, 4, '把', '4', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:05', '1', '2023-12-05 23:03:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1465, 5, '枚', '5', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:14', '1', '2023-12-05 23:03:14', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1466, 6, '瓶', '6', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:20', '1', '2023-12-05 23:03:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1467, 7, '盒', '7', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:30', '1', '2023-12-05 23:03:30', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1468, 8, '台', '8', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:41', '1', '2023-12-05 23:03:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1469, 9, '吨', '9', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:03:48', '1', '2023-12-05 23:03:48', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1470, 10, '千克', '10', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:03', '1', '2023-12-05 23:04:03', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1471, 11, '米', '11', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:12', '1', '2023-12-05 23:04:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1472, 12, '箱', '12', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:25', '1', '2023-12-05 23:04:25', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1473, 13, '套', '13', 'crm_product_unit', 0, '', '', '', '1', '2023-12-05 23:04:34', '1', '2023-12-05 23:04:34', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1474, 1, '打电话', '1', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:20', '1', '2024-01-15 20:48:20', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1475, 2, '发短信', '2', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:48:31', '1', '2024-01-15 20:48:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1476, 3, '上门拜访', '3', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:07', '1', '2024-01-15 20:49:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1477, 4, '微信沟通', '4', 'crm_follow_up_type', 0, '', '', '', '1', '2024-01-15 20:49:15', '1', '2024-01-15 20:49:15', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1478, 4, '钱包余额', '4', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:37', '1', '2023-10-28 16:28:37', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1479, 3, '银行卡', '3', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:28:21', '1', '2023-10-28 16:28:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1480, 2, '微信余额', '2', 'pay_transfer_type', 0, 'info', '', '', '1', '2023-10-28 16:28:07', '1', '2023-10-28 16:28:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1481, 1, '支付宝余额', '1', 'pay_transfer_type', 0, 'default', '', '', '1', '2023-10-28 16:27:44', '1', '2023-10-28 16:27:44', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1482, 4, '转账失败', '30', 'pay_transfer_status', 0, 'warning', '', '', '1', '2023-10-28 16:24:16', '1', '2023-10-28 16:24:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1483, 3, '转账成功', '20', 'pay_transfer_status', 0, 'success', '', '', '1', '2023-10-28 16:23:50', '1', '2023-10-28 16:23:50', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1484, 2, '转账进行中', '10', 'pay_transfer_status', 0, 'info', '', '', '1', '2023-10-28 16:23:12', '1', '2023-10-28 16:23:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1485, 1, '等待转账', '0', 'pay_transfer_status', 0, 'default', '', '', '1', '2023-10-28 16:21:43', '1', '2023-10-28 16:23:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1486, 10, '其它入库', '10', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:07:25', '1', '2024-02-05 18:07:43', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1487, 11, '其它入库(作废)', '11', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:08:07', '1', '2024-02-05 19:20:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1488, 20, '其它出库', '20', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-05 18:08:51', '1', '2024-02-05 18:08:51', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1489, 21, '其它出库(作废)', '21', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-05 18:09:00', '1', '2024-02-05 19:20:10', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1490, 10, '未审核', '10', 'erp_audit_status', 0, 'default', '', '', '1', '2024-02-06 00:00:21', '1', '2024-02-06 00:00:21', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1491, 20, '已审核', '20', 'erp_audit_status', 0, 'success', '', '', '1', '2024-02-06 00:00:35', '1', '2024-02-06 00:00:35', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1492, 30, '调拨入库', '30', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:19', '1', '2024-02-07 12:36:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1493, 31, '调拨入库(作废)', '31', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:29', '1', '2024-02-07 20:37:11', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1494, 32, '调拨出库', '32', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-07 20:34:38', '1', '2024-02-07 12:36:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1495, 33, '调拨出库(作废)', '33', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-07 20:34:49', '1', '2024-02-07 20:37:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1496, 40, '盘盈入库', '40', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:53:00', '1', '2024-02-08 08:53:09', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1497, 41, '盘盈入库(作废)', '41', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:53:39', '1', '2024-02-16 19:40:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1498, 42, '盘亏出库', '42', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-08 08:54:16', '1', '2024-02-08 08:54:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1499, 43, '盘亏出库(作废)', '43', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-08 08:54:31', '1', '2024-02-16 19:40:46', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1500, 50, '销售出库', '50', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-11 21:47:25', '1', '2024-02-11 21:50:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1501, 51, '销售出库(作废)', '51', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-11 21:47:37', '1', '2024-02-11 21:51:12', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1502, 60, '销售退货入库', '60', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-12 06:51:05', '1', '2024-02-12 06:51:05', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1503, 61, '销售退货入库(作废)', '61', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-12 06:51:18', '1', '2024-02-12 06:51:18', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1504, 70, '采购入库', '70', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:02', '1', '2024-02-16 13:10:02', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1505, 71, '采购入库(作废)', '71', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:10', '1', '2024-02-16 19:40:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1506, 80, '采购退货出库', '80', 'erp_stock_record_biz_type', 0, '', '', '', '1', '2024-02-16 13:10:17', '1', '2024-02-16 13:10:17', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1507, 81, '采购退货出库(作废)', '81', 'erp_stock_record_biz_type', 0, 'danger', '', '', '1', '2024-02-16 13:10:26', '1', '2024-02-16 19:40:33', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1509, 3, '审批不通过', '3', 'bpm_process_instance_status', 0, 'danger', '', '', '1', '2024-03-16 16:12:06', '1', '2024-03-16 16:12:06', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1510, 4, '已取消', '4', 'bpm_process_instance_status', 0, 'warning', '', '', '1', '2024-03-16 16:12:22', '1', '2024-03-16 16:12:22', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1511, 5, '已退回', '5', 'bpm_task_status', 0, 'warning', '', '', '1', '2024-03-16 19:10:46', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1512, 6, '委派中', '6', 'bpm_task_status', 0, 'primary', '', '', '1', '2024-03-17 10:06:22', '1', '2024-03-08 22:41:40', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1513, 7, '审批通过中', '7', 'bpm_task_status', 0, 'success', '', '', '1', '2024-03-17 10:06:47', '1', '2024-03-08 22:41:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1514, 0, '待审批', '0', 'bpm_task_status', 0, 'info', '', '', '1', '2024-03-17 10:07:11', '1', '2024-03-08 22:41:42', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1515, 35, '发起人自选', '35', 'bpm_task_candidate_strategy', 0, '', '', '', '1', '2024-03-22 19:45:16', '1', '2024-03-22 19:45:16', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1516, 1, '执行监听器', 'execution', 'bpm_process_listener_type', 0, 'primary', '', '', '1', '2024-03-23 12:54:03', '1', '2024-03-23 19:14:19', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1517, 1, '任务监听器', 'task', 'bpm_process_listener_type', 0, 'success', '', '', '1', '2024-03-23 12:54:13', '1', '2024-03-23 19:14:24', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1526, 1, 'Java 类', 'class', 'bpm_process_listener_value_type', 0, 'primary', '', '', '1', '2024-03-23 15:08:45', '1', '2024-03-23 19:14:32', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1527, 2, '表达式', 'expression', 'bpm_process_listener_value_type', 0, 'success', '', '', '1', '2024-03-23 15:09:06', '1', '2024-03-23 19:14:38', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1528, 3, '代理表达式', 'delegateExpression', 'bpm_process_listener_value_type', 0, 'info', '', '', '1', '2024-03-23 15:11:23', '1', '2024-03-23 19:14:41', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1529, 1, '天', '1', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:26', '1', '2024-03-29 22:50:26', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1530, 2, '周', '2', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:36', '1', '2024-03-29 22:50:36', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1531, 3, '月', '3', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:50:46', '1', '2024-03-29 22:50:54', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1532, 4, '季度', '4', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:01', '1', '2024-03-29 22:51:01', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1533, 5, '年', '5', 'date_interval', 0, '', '', '', '1', '2024-03-29 22:51:07', '1', '2024-03-29 22:51:07', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1534, 1, '赢单', '1', 'crm_business_end_status_type', 0, 'success', '', '', '1', '2024-04-13 23:26:57', '1', '2024-04-13 23:26:57', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1535, 2, '输单', '2', 'crm_business_end_status_type', 0, 'primary', '', '', '1', '2024-04-13 23:27:31', '1', '2024-04-13 23:27:31', '0'); +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1536, 3, '无效', '3', 'crm_business_end_status_type', 0, 'info', '', '', '1', '2024-04-13 23:27:59', '1', '2024-04-13 23:27:59', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dict_data_seq; +CREATE SEQUENCE system_dict_data_seq + START 1537; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_type; +CREATE TABLE system_dict_type +( + id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + type varchar(100) NOT NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + deleted_time timestamp NULL DEFAULT NULL +); + +ALTER TABLE system_dict_type + ADD CONSTRAINT pk_system_dict_type PRIMARY KEY (id); + +COMMENT ON COLUMN system_dict_type.id IS '字典主键'; +COMMENT ON COLUMN system_dict_type.name IS '字典名称'; +COMMENT ON COLUMN system_dict_type.type IS '字典类型'; +COMMENT ON COLUMN system_dict_type.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_dict_type.remark IS '备注'; +COMMENT ON COLUMN system_dict_type.creator IS '创建者'; +COMMENT ON COLUMN system_dict_type.create_time IS '创建时间'; +COMMENT ON COLUMN system_dict_type.updater IS '更新者'; +COMMENT ON COLUMN system_dict_type.update_time IS '更新时间'; +COMMENT ON COLUMN system_dict_type.deleted IS '是否删除'; +COMMENT ON COLUMN system_dict_type.deleted_time IS '删除时间'; +COMMENT ON TABLE system_dict_type IS '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-05-16 20:29:32', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (9, '操作类型', 'infra_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2024-03-14 12:44:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '1', '2022-05-16 20:26:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2023-07-10 10:11:39', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', '2021-12-03 10:53:29', '1', '2023-07-19 18:09:43', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2023-07-19 10:13:17', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (140, '流程实例的结果', 'bpm_task_status', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2024-03-08 22:42:03', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (142, '任务分配规则的类型', 'bpm_task_candidate_strategy', 0, 'BPM 任务的候选人的策略', '103', '2022-01-12 23:21:04', '103', '2024-03-06 02:53:59', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', '2022-03-10 16:33:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', '2022-03-15 00:24:38', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', '2022-10-24 21:19:04', '1', '2022-10-24 21:19:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', '2022-11-01 12:46:06', '1', '2022-11-01 12:46:06', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', '2022-11-02 00:06:20', '1', '2022-11-04 00:08:26', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', '2022-11-02 00:28:01', '1', '2022-11-02 00:28:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', '2022-11-04 00:14:49', '1', '2022-11-04 00:14:49', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', '2022-11-04 19:12:27', '1', '2022-11-04 19:12:27', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', '2022-11-04 22:54:23', '1', '2022-11-04 22:54:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', '2022-11-04 22:59:23', '1', '2022-11-04 22:59:23', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', '2022-11-19 20:52:56', '1', '2022-11-19 20:52:56', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', '2022-11-19 21:04:09', '1', '2022-11-19 21:04:09', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', '2022-11-19 21:39:04', '1', '2022-11-19 21:39:04', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (160, '终端', 'terminal', 0, '终端', '1', '2022-12-10 10:50:50', '1', '2022-12-10 10:53:11', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', '2022-12-10 16:33:54', '1', '2022-12-10 16:33:54', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', '2022-12-10 16:48:44', '1', '2022-12-10 16:48:44', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', '2022-12-10 20:58:08', '1', '2022-12-10 20:58:08', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', '2023-01-16 23:29:56', '1', '2023-01-16 23:29:56', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', '2023-01-17 22:17:09', '1', '2023-01-17 22:17:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', '2023-07-20 12:23:03', '1', '2023-07-20 12:23:03', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', '2023-08-23 00:03:14', '1', '2023-08-23 00:03:14', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (176, '分佣模式', 'brokerage_enabled_condition', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (177, '分销关系绑定模式', 'brokerage_bind_mode', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (178, '佣金提现类型', 'brokerage_withdraw_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (179, '佣金记录业务类型', 'brokerage_record_biz_type', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (180, '佣金记录状态', 'brokerage_record_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (181, '佣金提现状态', 'brokerage_withdraw_status', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (182, '佣金提现银行', 'brokerage_bank_name', 0, NULL, '', '2023-09-28 02:46:05', '', '2023-09-28 02:46:05', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (183, '砍价记录的状态', 'promotion_bargain_record_status', 0, '', '1', '2023-10-05 10:41:08', '1', '2023-10-05 10:41:08', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (184, '拼团记录的状态', 'promotion_combination_record_status', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-10-08 07:24:25', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (185, '回款-回款方式', 'crm_receivable_return_type', 0, '回款-回款方式', '1', '2023-10-18 21:54:10', '1', '2023-10-18 21:54:10', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (186, 'CRM 客户行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', '2023-10-28 22:57:07', '1', '2024-02-18 23:30:22', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', '2023-10-28 22:59:12', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', '2023-10-28 23:00:34', '1', '2023-10-28 15:11:16', '0', NULL); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (600, 'Banner 位置', 'promotion_banner_position', 0, '', '1', '2023-10-08 07:24:25', '1', '2023-11-04 13:04:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (601, '社交类型', 'system_social_type', 0, '', '1', '2023-11-04 13:03:54', '1', '2023-11-04 13:03:54', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (604, '产品状态', 'crm_product_status', 0, '', '1', '2023-10-30 21:47:59', '1', '2023-10-30 21:48:45', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (605, 'CRM 数据权限的级别', 'crm_permission_level', 0, '', '1', '2023-11-30 09:51:59', '1', '2023-11-30 09:51:59', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (606, 'CRM 审批状态', 'crm_audit_status', 0, '', '1', '2023-11-30 18:56:23', '1', '2023-11-30 18:56:23', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (607, 'CRM 产品单位', 'crm_product_unit', 0, '', '1', '2023-12-05 23:01:51', '1', '2023-12-05 23:01:51', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (608, 'CRM 跟进方式', 'crm_follow_up_type', 0, '', '1', '2024-01-15 20:48:05', '1', '2024-01-15 20:48:05', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (609, '支付转账类型', 'pay_transfer_type', 0, '', '1', '2023-10-28 16:27:18', '1', '2023-10-28 16:27:18', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (610, '转账订单状态', 'pay_transfer_status', 0, '', '1', '2023-10-28 16:18:32', '1', '2023-10-28 16:18:32', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (611, 'ERP 库存明细的业务类型', 'erp_stock_record_biz_type', 0, 'ERP 库存明细的业务类型', '1', '2024-02-05 18:07:02', '1', '2024-02-05 18:07:02', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (612, 'ERP 审批状态', 'erp_audit_status', 0, '', '1', '2024-02-06 00:00:07', '1', '2024-02-06 00:00:07', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (613, 'BPM 监听器类型', 'bpm_process_listener_type', 0, '', '1', '2024-03-23 12:52:24', '1', '2024-03-09 15:54:28', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (615, 'BPM 监听器值类型', 'bpm_process_listener_value_type', 0, '', '1', '2024-03-23 13:00:31', '1', '2024-03-23 13:00:31', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (616, '时间间隔', 'date_interval', 0, '', '1', '2024-03-29 22:50:09', '1', '2024-03-29 22:50:09', '0', '1970-01-01 00:00:00'); +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (619, 'CRM 商机结束状态类型', 'crm_business_end_status_type', 0, '', '1', '2024-04-13 23:23:00', '1', '2024-04-13 23:23:00', '0', '1970-01-01 00:00:00'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_dict_type_seq; +CREATE SEQUENCE system_dict_type_seq + START 620; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS system_login_log; +CREATE TABLE system_login_log +( + id int8 NOT NULL, + log_type int8 NOT NULL, + trace_id varchar(64) NOT NULL DEFAULT '', + user_id int8 NOT NULL DEFAULT 0, + user_type int2 NOT NULL DEFAULT 0, + username varchar(50) NOT NULL DEFAULT '', + result int2 NOT NULL, + user_ip varchar(50) NOT NULL, + user_agent varchar(512) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_login_log + ADD CONSTRAINT pk_system_login_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_login_log.id IS '访问ID'; +COMMENT ON COLUMN system_login_log.log_type IS '日志类型'; +COMMENT ON COLUMN system_login_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_login_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_login_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_login_log.username IS '用户账号'; +COMMENT ON COLUMN system_login_log.result IS '登陆结果'; +COMMENT ON COLUMN system_login_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_login_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_login_log.creator IS '创建者'; +COMMENT ON COLUMN system_login_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_login_log.updater IS '更新者'; +COMMENT ON COLUMN system_login_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_login_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_login_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_login_log IS '系统访问记录'; + +DROP SEQUENCE IF EXISTS system_login_log_seq; +CREATE SEQUENCE system_login_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_account; +CREATE TABLE system_mail_account +( + id int8 NOT NULL, + mail varchar(255) NOT NULL, + username varchar(255) NOT NULL, + password varchar(255) NOT NULL, + host varchar(255) NOT NULL, + port int4 NOT NULL, + ssl_enable bool NOT NULL DEFAULT '0', + starttls_enable bool NOT NULL DEFAULT '0', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_account + ADD CONSTRAINT pk_system_mail_account PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_account.id IS '主键'; +COMMENT ON COLUMN system_mail_account.mail IS '邮箱'; +COMMENT ON COLUMN system_mail_account.username IS '用户名'; +COMMENT ON COLUMN system_mail_account.password IS '密码'; +COMMENT ON COLUMN system_mail_account.host IS 'SMTP 服务器域名'; +COMMENT ON COLUMN system_mail_account.port IS 'SMTP 服务器端口'; +COMMENT ON COLUMN system_mail_account.ssl_enable IS '是否开启 SSL'; +COMMENT ON COLUMN system_mail_account.starttls_enable IS '是否开启 STARTTLS'; +COMMENT ON COLUMN system_mail_account.creator IS '创建者'; +COMMENT ON COLUMN system_mail_account.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_account.updater IS '更新者'; +COMMENT ON COLUMN system_mail_account.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_account.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_account IS '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (1, '7684413@qq.com', '7684413@qq.com', '1234576', '127.0.0.1', 8080, '0', '0', '1', '2023-01-25 17:39:52', '1', '2024-04-24 09:13:56', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, '1', '0', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', '0'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, '0', '0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', '1'); +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, '1', '0', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', '1'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_mail_account_seq; +CREATE SEQUENCE system_mail_account_seq + START 5; + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_log; +CREATE TABLE system_mail_log +( + id int8 NOT NULL, + user_id int8 NULL DEFAULT NULL, + user_type int2 NULL DEFAULT NULL, + to_mail varchar(255) NOT NULL, + account_id int8 NOT NULL, + from_mail varchar(255) NOT NULL, + template_id int8 NOT NULL, + template_code varchar(63) NOT NULL, + template_nickname varchar(255) NULL DEFAULT NULL, + template_title varchar(255) NOT NULL, + template_content varchar(10240) NOT NULL, + template_params varchar(255) NOT NULL, + send_status int2 NOT NULL DEFAULT 0, + send_time timestamp NULL DEFAULT NULL, + send_message_id varchar(255) NULL DEFAULT NULL, + send_exception varchar(4096) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_log + ADD CONSTRAINT pk_system_mail_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_log.id IS '编号'; +COMMENT ON COLUMN system_mail_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_mail_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_mail_log.to_mail IS '接收邮箱地址'; +COMMENT ON COLUMN system_mail_log.account_id IS '邮箱账号编号'; +COMMENT ON COLUMN system_mail_log.from_mail IS '发送邮箱地址'; +COMMENT ON COLUMN system_mail_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_mail_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_mail_log.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_mail_log.template_title IS '邮件标题'; +COMMENT ON COLUMN system_mail_log.template_content IS '邮件内容'; +COMMENT ON COLUMN system_mail_log.template_params IS '邮件参数'; +COMMENT ON COLUMN system_mail_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_mail_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_mail_log.send_message_id IS '发送返回的消息 ID'; +COMMENT ON COLUMN system_mail_log.send_exception IS '发送异常'; +COMMENT ON COLUMN system_mail_log.creator IS '创建者'; +COMMENT ON COLUMN system_mail_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_log.updater IS '更新者'; +COMMENT ON COLUMN system_mail_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_log.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_log IS '邮件日志表'; + +DROP SEQUENCE IF EXISTS system_mail_log_seq; +CREATE SEQUENCE system_mail_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_template; +CREATE TABLE system_mail_template +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + code varchar(63) NOT NULL, + account_id int8 NOT NULL, + nickname varchar(255) NULL DEFAULT NULL, + title varchar(255) NOT NULL, + content varchar(10240) NOT NULL, + params varchar(255) NOT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_mail_template + ADD CONSTRAINT pk_system_mail_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_mail_template.id IS '编号'; +COMMENT ON COLUMN system_mail_template.name IS '模板名称'; +COMMENT ON COLUMN system_mail_template.code IS '模板编码'; +COMMENT ON COLUMN system_mail_template.account_id IS '发送的邮箱账号编号'; +COMMENT ON COLUMN system_mail_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_mail_template.title IS '模板标题'; +COMMENT ON COLUMN system_mail_template.content IS '模板内容'; +COMMENT ON COLUMN system_mail_template.params IS '参数数组'; +COMMENT ON COLUMN system_mail_template.status IS '开启状态'; +COMMENT ON COLUMN system_mail_template.remark IS '备注'; +COMMENT ON COLUMN system_mail_template.creator IS '创建者'; +COMMENT ON COLUMN system_mail_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_mail_template.updater IS '更新者'; +COMMENT ON COLUMN system_mail_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_mail_template.deleted IS '是否删除'; +COMMENT ON TABLE system_mail_template IS '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '["code","name"]', 0, '3', '1', '2021-10-11 08:10:00', '1', '2023-12-02 19:51:14', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '["key01","key02"]', 0, NULL, '1', '2023-01-26 01:27:40', '1', '2023-01-27 10:32:16', '0'); +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', '2023-01-27 15:50:35', '1', '2023-01-27 16:34:49', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_mail_template_seq; +CREATE SEQUENCE system_mail_template_seq + START 16; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_menu; +CREATE TABLE system_menu +( + id int8 NOT NULL, + name varchar(50) NOT NULL, + permission varchar(100) NOT NULL DEFAULT '', + type int2 NOT NULL, + sort int4 NOT NULL DEFAULT 0, + parent_id int8 NOT NULL DEFAULT 0, + path varchar(200) NULL DEFAULT '', + icon varchar(100) NULL DEFAULT '#', + component varchar(255) NULL DEFAULT NULL, + component_name varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL DEFAULT 0, + visible bool NOT NULL DEFAULT '1', + keep_alive bool NOT NULL DEFAULT '1', + always_show bool NOT NULL DEFAULT '1', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_menu + ADD CONSTRAINT pk_system_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_menu.id IS '菜单ID'; +COMMENT ON COLUMN system_menu.name IS '菜单名称'; +COMMENT ON COLUMN system_menu.permission IS '权限标识'; +COMMENT ON COLUMN system_menu.type IS '菜单类型'; +COMMENT ON COLUMN system_menu.sort IS '显示顺序'; +COMMENT ON COLUMN system_menu.parent_id IS '父菜单ID'; +COMMENT ON COLUMN system_menu.path IS '路由地址'; +COMMENT ON COLUMN system_menu.icon IS '菜单图标'; +COMMENT ON COLUMN system_menu.component IS '组件路径'; +COMMENT ON COLUMN system_menu.component_name IS '组件名'; +COMMENT ON COLUMN system_menu.status IS '菜单状态'; +COMMENT ON COLUMN system_menu.visible IS '是否可见'; +COMMENT ON COLUMN system_menu.keep_alive IS '是否缓存'; +COMMENT ON COLUMN system_menu.always_show IS '是否总是显示'; +COMMENT ON COLUMN system_menu.creator IS '创建者'; +COMMENT ON COLUMN system_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_menu.updater IS '更新者'; +COMMENT ON COLUMN system_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_menu.deleted IS '是否删除'; +COMMENT ON TABLE system_menu IS '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'ep:tools', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:04:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'ep:monitor', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-03-01 08:28:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'fa:road', NULL, NULL, 0, '1', '1', '1', 'admin', '2021-09-20 16:26:19', '1', '2024-02-29 12:38:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'ep:avatar', 'system/user/index', 'SystemUser', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:02:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'ep:user', 'system/role/index', 'SystemRole', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'ep:menu', 'system/menu/index', 'SystemMenu', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:03:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'fa:address-card', 'system/dept/index', 'SystemDept', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'fa:address-book-o', 'system/post/index', 'SystemPost', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:06:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'ep:collection', 'system/dict/index', 'SystemDictType', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:07:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (106, '配置管理', '', 2, 8, 2, 'config', 'fa:connectdevelop', 'infra/config/index', 'InfraConfig', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:02:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (107, '通知公告', '', 2, 4, 2739, 'notice', 'ep:takeaway-box', 'system/notice/index', 'SystemNotice', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-22 23:56:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'ep:document-copy', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:08:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'fa:key', 'system/oauth2/token/index', 'SystemTokenClient', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:13:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (110, '定时任务', '', 2, 7, 2, 'job', 'fa-solid:tasks', 'infra/job/index', 'InfraJob', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:57:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (111, 'MySQL 监控', '', 2, 1, 2740, 'druid', 'fa-solid:box', 'infra/druid/index', 'InfraDruid', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:05:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (112, 'Java 监控', '', 2, 3, 2740, 'admin-server', 'ep:coffee-cup', 'infra/server/index', 'InfraAdminServer', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (113, 'Redis 监控', '', 2, 2, 2740, 'redis', 'fa:reddit-square', 'infra/redis/index', 'InfraRedis', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:06:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'fa:wpforms', 'infra/build/index', 'InfraBuild', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'ep:document-copy', 'infra/codegen/index', 'InfraCodegen', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 08:51:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (116, 'API 接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'fa:fighter-jet', 'infra/swagger/index', 'InfraSwagger', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-04-23 00:01:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'ep:position', 'system/operatelog/index', 'SystemOperateLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:09:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'ep:promotion', 'system/loginlog/index', 'SystemLoginLog', 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2024-02-29 01:10:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, '1', '1', '1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, '1', '1', '1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1070, '代码生成案例', '', 1, 1, 2, 'demo', 'ep:aim', 'infra/testDemo/index', NULL, 0, '1', '1', '1', '', '2021-02-06 12:42:49', '1', '2023-11-15 23:45:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1077, '链路追踪', '', 2, 4, 2740, 'skywalking', 'fa:eye', 'infra/skywalking/index', 'InfraSkyWalking', 0, '1', '1', '1', '', '2021-02-08 20:41:31', '1', '2024-04-23 00:07:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'ep:place', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2024-02-29 08:54:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1083, 'API 日志', '', 2, 4, 2, 'log', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '', '2021-02-26 02:18:24', '1', '2024-04-22 23:58:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'ep:warning-filled', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2024-02-29 08:55:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, '1', '1', '1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'ep:upload-filled', 'infra/file/index', 'InfraFile', 0, '1', '1', '1', '', '2021-03-12 20:16:20', '1', '2024-02-29 08:53:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, '1', '1', '1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1093, '短信管理', '', 1, 1, 2739, 'sms', 'ep:message', NULL, NULL, 0, '1', '1', '1', '1', '2021-04-05 01:10:16', '1', '2024-04-22 23:56:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'fa:stack-exchange', 'system/sms/channel/index', 'SystemSmsChannel', 0, '1', '1', '1', '', '2021-04-01 11:07:15', '1', '2024-02-29 01:15:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'ep:connection', 'system/sms/template/index', 'SystemSmsTemplate', 0, '1', '1', '1', '', '2021-04-01 17:35:17', '1', '2024-02-29 01:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'fa:edit', 'system/sms/log/index', 'SystemSmsLog', 0, '1', '1', '1', '', '2021-04-11 08:37:05', '1', '2024-02-29 08:49:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, '1', '1', '1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1117, '支付管理', '', 1, 30, 0, '/pay', 'ep:money', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-25 16:43:41', '1', '2024-02-29 08:58:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'fa:leanpub', 'bpm/oa/leave/index', 'BpmOALeave', 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2024-02-29 12:38:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, '1', '1', '1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'fa:apple', 'pay/app/index', 'PayApp', 0, '1', '1', '1', '', '2021-11-10 01:13:30', '1', '2024-02-29 08:59:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', NULL, 0, '1', '1', '1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'ep:house', 'system/tenant/index', 'SystemTenant', 0, '1', '1', '1', '', '2021-12-14 12:31:43', '1', '2024-02-29 01:01:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', NULL, 0, '1', '1', '1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'fa:registered', 'pay/refund/index', 'PayRefund', 0, '1', '1', '1', '', '2021-12-25 08:29:07', '1', '2024-02-29 08:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:29:07', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'fa:cc-paypal', 'pay/order/index', 'PayOrder', 0, '1', '1', '1', '', '2021-12-25 08:49:43', '1', '2024-02-29 08:59:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'fa:medium', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:26:36', '1', '2024-02-29 12:43:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'fa:dedent', NULL, NULL, 0, '1', '1', '1', '1', '2021-12-30 20:28:30', '1', '2024-02-29 12:36:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1187, '流程表单', '', 2, 2, 1186, 'form', 'fa:hdd-o', 'bpm/form/index', 'BpmForm', 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2024-03-19 12:25:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, '1', '1', '1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1193, '流程模型', '', 2, 1, 1186, 'model', 'fa-solid:project-diagram', 'bpm/model/index', 'BpmModel', 0, '1', '1', '1', '1', '2021-12-31 23:24:58', '1', '2024-03-19 12:25:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:01:35', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1200, '审批中心', '', 2, 20, 1185, 'task', 'fa:tasks', NULL, NULL, 0, '1', '1', '1', '1', '2022-01-07 23:51:48', '1', '2024-03-21 00:33:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1201, '我的流程', '', 2, 1, 1200, 'my', 'fa-solid:book', 'bpm/processInstance/index', 'BpmProcessInstanceMy', 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2024-03-21 23:52:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'fa:slack', 'bpm/task/todo/index', 'BpmTodoTask', 0, '1', '1', '1', '1', '2022-01-08 10:33:37', '1', '2024-02-29 12:37:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'fa:delicious', 'bpm/task/done/index', 'BpmDoneTask', 0, '1', '1', '1', '1', '2022-01-08 10:34:13', '1', '2024-02-29 12:37:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1209, '用户分组', '', 2, 4, 1186, 'user-group', 'fa:user-secret', 'bpm/group/index', 'BpmUserGroup', 0, '1', '1', '1', '', '2022-01-14 02:14:20', '1', '2024-03-21 23:55:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, '1', '1', '1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'fa-solid:house-user', NULL, NULL, 0, '1', '1', '1', '1', '2022-02-20 01:41:13', '1', '2024-02-29 00:59:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'fa:bars', 'system/tenantPackage/index', 'SystemTenantPackage', 0, '1', '1', '1', '', '2022-02-19 17:44:06', '1', '2024-02-29 01:01:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, '1', '1', '1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'fa-solid:file-signature', 'infra/fileConfig/index', 'InfraFileConfig', 0, '1', '1', '1', '', '2022-03-15 14:35:28', '1', '2024-02-29 08:52:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, '1', '1', '1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1243, '文件管理', '', 2, 6, 2, 'file', 'ep:files', NULL, '', 0, '1', '1', '1', '1', '2022-03-16 23:47:40', '1', '2024-04-23 00:02:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'ep:avatar', NULL, NULL, 0, '1', '1', '1', '1', '2022-04-23 01:03:15', '1', '2023-12-08 23:40:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'ep:data-analysis', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, '1', '1', '1', '', '2022-04-27 14:37:32', '1', '2024-02-29 08:51:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, '1', '1', '1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1261, 'OAuth 2.0', '', 2, 10, 1, 'oauth2', 'fa:dashcube', NULL, NULL, 0, '1', '1', '1', '1', '2022-05-09 23:38:17', '1', '2024-02-29 01:12:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'fa:hdd-o', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2024-02-29 01:13:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, '1', '1', '1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1281, '报表管理', '', 2, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, '1', '1', '1', '1', '2022-07-10 20:22:15', '1', '2024-02-29 12:33:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'GoView', 0, '1', '1', '1', '1', '2022-07-10 20:26:36', '1', '2024-02-29 12:33:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2000, '商品中心', '', 1, 60, 2362, 'product', 'fa:product-hunt', NULL, NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-09-30 11:52:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2002, '商品分类', '', 2, 2, 2000, 'category', 'ep:cellphone', 'mall/product/category/index', 'ProductCategory', 0, '1', '1', '1', '', '2022-07-29 15:53:53', '1', '2023-08-21 10:27:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2003, '分类查询', 'product:category:query', 3, 1, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2004, '分类创建', 'product:category:create', 3, 2, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2005, '分类更新', 'product:category:update', 3, 3, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2006, '分类删除', 'product:category:delete', 3, 4, 2002, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-29 15:53:53', '', '2022-07-29 15:53:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2008, '商品品牌', '', 2, 3, 2000, 'brand', 'ep:chicken', 'mall/product/brand/index', 'ProductBrand', 0, '1', '1', '1', '', '2022-07-30 13:52:44', '1', '2023-08-21 10:27:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2009, '品牌查询', 'product:brand:query', 3, 1, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2010, '品牌创建', 'product:brand:create', 3, 2, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2011, '品牌更新', 'product:brand:update', 3, 3, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2012, '品牌删除', 'product:brand:delete', 3, 4, 2008, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 13:52:44', '', '2022-07-30 13:52:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2014, '商品列表', '', 2, 1, 2000, 'spu', 'ep:apple', 'mall/product/spu/index', 'ProductSpu', 0, '1', '1', '1', '', '2022-07-30 14:22:58', '1', '2023-08-21 10:27:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2015, '商品查询', 'product:spu:query', 3, 1, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2016, '商品创建', 'product:spu:create', 3, 2, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2017, '商品更新', 'product:spu:update', 3, 3, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2018, '商品删除', 'product:spu:delete', 3, 4, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2019, '商品属性', '', 2, 4, 2000, 'property', 'ep:cold-drink', 'mall/product/property/index', 'ProductProperty', 0, '1', '1', '1', '', '2022-08-01 14:55:35', '1', '2023-08-26 11:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2020, '规格查询', 'product:property:query', 3, 1, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2021, '规格创建', 'product:property:create', 3, 2, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2022, '规格更新', 'product:property:update', 3, 3, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2023, '规格删除', 'product:property:delete', 3, 4, 2019, '', '', '', NULL, 0, '1', '1', '1', '', '2022-08-01 14:55:35', '', '2022-12-12 20:26:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2025, 'Banner', '', 2, 100, 2387, 'banner', 'fa:bandcamp', 'mall/promotion/banner/index', NULL, 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2026, 'Banner查询', 'promotion:banner:query', 3, 1, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2027, 'Banner创建', 'promotion:banner:create', 3, 2, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2028, 'Banner更新', 'promotion:banner:update', 3, 3, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2029, 'Banner删除', 'promotion:banner:delete', 3, 4, 2025, '', '', '', '', 0, '1', '1', '1', '', '2022-08-01 14:56:14', '1', '2023-10-24 20:20:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2030, '营销中心', '', 1, 70, 2362, 'promotion', 'ep:present', NULL, NULL, 0, '1', '1', '1', '1', '2022-10-31 21:25:09', '1', '2023-09-30 11:54:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2032, '优惠劵列表', '', 2, 1, 2365, 'template', 'ep:discount', 'mall/promotion/coupon/template/index', 'PromotionCouponTemplate', 0, '1', '1', '1', '', '2022-10-31 22:27:14', '1', '2023-10-03 12:40:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2033, '优惠劵模板查询', 'promotion:coupon-template:query', 3, 1, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2034, '优惠劵模板创建', 'promotion:coupon-template:create', 3, 2, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2035, '优惠劵模板更新', 'promotion:coupon-template:update', 3, 3, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2036, '优惠劵模板删除', 'promotion:coupon-template:delete', 3, 4, 2032, '', '', '', NULL, 0, '1', '1', '1', '', '2022-10-31 22:27:14', '', '2022-10-31 22:27:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2038, '领取记录', '', 2, 2, 2365, 'list', 'ep:collection-tag', 'mall/promotion/coupon/index', 'PromotionCoupon', 0, '1', '1', '1', '', '2022-11-03 23:21:31', '1', '2023-10-03 12:55:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2039, '优惠劵查询', 'promotion:coupon:query', 3, 1, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2040, '优惠劵删除', 'promotion:coupon:delete', 3, 4, 2038, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-03 23:21:31', '', '2022-11-03 23:21:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2041, '满减送', '', 2, 10, 2390, 'reward-activity', 'ep:goblet-square-full', 'mall/promotion/rewardActivity/index', 'PromotionRewardActivity', 0, '1', '1', '1', '', '2022-11-04 23:47:49', '1', '2023-10-21 19:24:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2042, '满减送活动查询', 'promotion:reward-activity:query', 3, 1, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2043, '满减送活动创建', 'promotion:reward-activity:create', 3, 2, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:49', '', '2022-11-04 23:47:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2044, '满减送活动更新', 'promotion:reward-activity:update', 3, 3, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2045, '满减送活动删除', 'promotion:reward-activity:delete', 3, 4, 2041, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-04 23:47:50', '', '2022-11-04 23:47:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, '1', '1', '1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2047, '限时折扣', '', 2, 7, 2390, 'discount-activity', 'ep:timer', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, '1', '1', '1', '', '2022-11-05 17:12:15', '1', '2023-10-21 19:24:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, '1', '1', '1', '', '2022-11-06 22:24:49', '1', '2023-06-24 18:57:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, '1', '1', '1', '', '2022-11-15 19:46:50', '1', '2023-06-24 18:57:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:48:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, '1', '1', '1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2072, '订单中心', '', 1, 65, 2362, 'trade', 'ep:eleme', NULL, NULL, 0, '1', '1', '1', '1', '2022-11-19 18:57:19', '1', '2023-09-30 11:54:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2073, '售后退款', '', 2, 2, 2072, 'after-sale', 'ep:refrigerator', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, '1', '1', '1', '', '2022-11-19 20:15:32', '1', '2023-10-01 21:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, '1', '1', '1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2075, '秒杀活动关闭', 'promotion:seckill-activity:close', 3, 5, 2059, '', '', '', '', 0, '1', '1', '1', '1', '2022-11-28 20:20:15', '1', '2023-10-03 18:34:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2076, '订单列表', '', 2, 1, 2072, 'order', 'ep:list', 'mall/trade/order/index', 'TradeOrder', 0, '1', '1', '1', '1', '2022-12-10 21:05:44', '1', '2023-10-01 21:42:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'fa:map-marker', 'system/area/index', 'SystemArea', 0, '1', '1', '1', '1', '2022-12-23 17:35:05', '1', '2024-02-29 08:50:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'ep:compass', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-01 20:11:04', '1', '2024-02-29 12:39:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'fa:user', 'mp/account/index', 'MpAccount', 0, '1', '1', '1', '1', '2023-01-01 20:13:31', '1', '2024-02-29 12:42:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2086, '新增账号', 'mp:account:create', 3, 1, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-01 20:21:40', '1', '2023-01-07 17:32:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2087, '修改账号', 'mp:account:update', 3, 2, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:32:46', '1', '2023-01-07 17:32:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2088, '查询账号', 'mp:account:query', 3, 0, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:07', '1', '2023-01-07 17:33:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2089, '删除账号', 'mp:account:delete', 3, 3, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:21', '1', '2023-01-07 17:33:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2090, '生成二维码', 'mp:account:qr-code', 3, 4, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 17:33:58', '1', '2023-01-07 17:33:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2091, '清空 API 配额', 'mp:account:clear-quota', 3, 5, 2085, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-07 18:20:32', '1', '2023-01-07 18:20:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2092, '数据统计', 'mp:statistics:query', 2, 2, 2084, 'statistics', 'ep:trend-charts', 'mp/statistics/index', 'MpStatistics', 0, '1', '1', '1', '1', '2023-01-07 20:17:36', '1', '2024-02-29 12:42:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2093, '标签管理', '', 2, 3, 2084, 'tag', 'ep:collection-tag', 'mp/tag/index', 'MpTag', 0, '1', '1', '1', '1', '2023-01-08 11:37:32', '1', '2024-02-29 12:42:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2094, '查询标签', 'mp:tag:query', 3, 0, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:03', '1', '2023-01-08 11:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2095, '新增标签', 'mp:tag:create', 3, 1, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:23', '1', '2023-01-08 11:59:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2096, '修改标签', 'mp:tag:update', 3, 2, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 11:59:41', '1', '2023-01-08 11:59:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2097, '删除标签', 'mp:tag:delete', 3, 3, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:04', '1', '2023-01-08 12:00:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2098, '同步标签', 'mp:tag:sync', 3, 4, 2093, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 12:00:29', '1', '2023-01-08 12:00:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2099, '粉丝管理', '', 2, 4, 2084, 'user', 'fa:user-secret', 'mp/user/index', 'MpUser', 0, '1', '1', '1', '1', '2023-01-08 16:51:20', '1', '2024-02-29 12:42:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2100, '查询粉丝', 'mp:user:query', 3, 0, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:16:59', '1', '2023-01-08 17:17:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2101, '修改粉丝', 'mp:user:update', 3, 1, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:11', '1', '2023-01-08 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2102, '同步粉丝', 'mp:user:sync', 3, 2, 2099, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-08 17:17:40', '1', '2023-01-08 17:17:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2103, '消息管理', '', 2, 5, 2084, 'message', 'ep:message', 'mp/message/index', 'MpMessage', 0, '1', '1', '1', '1', '2023-01-08 18:44:19', '1', '2024-02-29 12:42:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2104, '图文发表记录', '', 2, 10, 2084, 'free-publish', 'ep:edit-pen', 'mp/freePublish/index', 'MpFreePublish', 0, '1', '1', '1', '1', '2023-01-13 00:30:50', '1', '2024-02-29 12:43:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2105, '查询发布列表', 'mp:free-publish:query', 3, 1, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:17', '1', '2023-01-13 07:19:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2106, '发布草稿', 'mp:free-publish:submit', 3, 2, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:19:46', '1', '2023-01-13 07:19:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2107, '删除发布记录', 'mp:free-publish:delete', 3, 3, 2104, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 07:20:01', '1', '2023-01-13 07:20:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2108, '图文草稿箱', '', 2, 9, 2084, 'draft', 'ep:edit', 'mp/draft/index', 'MpDraft', 0, '1', '1', '1', '1', '2023-01-13 07:40:21', '1', '2024-02-29 12:43:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2109, '新建草稿', 'mp:draft:create', 3, 1, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-13 23:15:30', '1', '2023-01-13 23:15:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2110, '修改草稿', 'mp:draft:update', 3, 2, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:08:47', '1', '2023-01-14 10:08:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2111, '查询草稿', 'mp:draft:query', 3, 0, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:01', '1', '2023-01-14 10:09:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2112, '删除草稿', 'mp:draft:delete', 3, 3, 2108, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 10:09:19', '1', '2023-01-14 10:09:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2113, '素材管理', '', 2, 8, 2084, 'material', 'ep:basketball', 'mp/material/index', 'MpMaterial', 0, '1', '1', '1', '1', '2023-01-14 14:12:07', '1', '2024-02-29 12:43:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2114, '上传临时素材', 'mp:material:upload-temporary', 3, 1, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:33:55', '1', '2023-01-14 15:33:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2115, '上传永久素材', 'mp:material:upload-permanent', 3, 2, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:34:14', '1', '2023-01-14 15:34:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2116, '删除素材', 'mp:material:delete', 3, 3, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:35:37', '1', '2023-01-14 15:35:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2117, '上传图文图片', 'mp:material:upload-news-image', 3, 4, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:36:31', '1', '2023-01-14 15:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2118, '查询素材', 'mp:material:query', 3, 5, 2113, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-14 15:39:22', '1', '2023-01-14 15:39:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2119, '菜单管理', '', 2, 6, 2084, 'menu', 'ep:menu', 'mp/menu/index', 'MpMenu', 0, '1', '1', '1', '1', '2023-01-14 17:43:54', '1', '2024-02-29 12:42:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2120, '自动回复', '', 2, 7, 2084, 'auto-reply', 'fa-solid:republican', 'mp/autoReply/index', 'MpAutoReply', 0, '1', '1', '1', '1', '2023-01-15 22:13:09', '1', '2024-02-29 12:43:10', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2121, '查询回复', 'mp:auto-reply:query', 3, 0, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:41', '1', '2023-01-16 22:28:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2122, '新增回复', 'mp:auto-reply:create', 3, 1, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:28:54', '1', '2023-01-16 22:28:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2123, '修改回复', 'mp:auto-reply:update', 3, 2, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:05', '1', '2023-01-16 22:29:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2124, '删除回复', 'mp:auto-reply:delete', 3, 3, 2120, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-16 22:29:34', '1', '2023-01-16 22:29:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2125, '查询菜单', 'mp:menu:query', 3, 0, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:05:41', '1', '2023-01-17 23:05:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2126, '保存菜单', 'mp:menu:save', 3, 1, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:01', '1', '2023-01-17 23:06:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2127, '删除菜单', 'mp:menu:delete', 3, 2, 2119, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:06:16', '1', '2023-01-17 23:06:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2128, '查询消息', 'mp:message:query', 3, 0, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:14', '1', '2023-01-17 23:07:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2129, '发送消息', 'mp:message:send', 3, 1, 2103, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-17 23:07:26', '1', '2023-01-17 23:07:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2130, '邮箱管理', '', 2, 2, 2739, 'mail', 'fa-solid:mail-bulk', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-25 17:27:44', '1', '2024-04-22 23:56:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'fa:universal-access', 'system/mail/account/index', 'SystemMailAccount', 0, '1', '1', '1', '', '2023-01-25 09:33:48', '1', '2024-02-29 08:48:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'fa:tag', 'system/mail/template/index', 'SystemMailTemplate', 0, '1', '1', '1', '', '2023-01-25 12:05:31', '1', '2024-02-29 08:48:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'fa:edit', 'system/mail/log/index', 'SystemMailLog', 0, '1', '1', '1', '', '2023-01-26 02:16:50', '1', '2024-02-29 08:48:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-26 02:16:50', '', '2023-01-26 02:16:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-26 23:29:15', '1', '2023-01-26 23:29:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2144, '站内信管理', '', 1, 3, 2739, 'notify', 'ep:message-box', NULL, NULL, 0, '1', '1', '1', '1', '2023-01-28 10:25:18', '1', '2024-04-22 23:56:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'fa:archive', 'system/notify/template/index', 'SystemNotifyTemplate', 0, '1', '1', '1', '', '2023-01-28 02:26:42', '1', '2024-02-29 08:49:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-01-28 10:54:43', '1', '2023-01-28 10:54:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'fa:edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, '1', '1', '1', '', '2023-01-28 04:28:22', '1', '2024-02-29 08:49:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, '1', '1', '1', '', '2023-01-28 04:28:22', '', '2023-01-28 04:28:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'JimuReport', 0, '1', '1', '1', '1', '2023-02-07 00:03:19', '1', '2024-02-29 12:34:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:14', '1', '2023-02-07 19:25:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2155, '更新项目', 'report:go-view-project:update', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2023-02-07 19:25:34', '1', '2024-04-24 20:01:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2157, '使用 SQL 查询数据', 'report:go-view-data:get-by-sql', 3, 3, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:15', '1', '2023-02-07 19:26:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2158, '使用 HTTP 查询数据', 'report:go-view-data:get-by-http', 3, 4, 2153, '', '', '', NULL, 0, '1', '1', '1', '1', '2023-02-07 19:26:35', '1', '2023-02-07 19:26:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'ep:document', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:46:28', '1', '2023-12-02 21:32:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'ep:document-copy', NULL, NULL, 0, '1', '1', '1', '1', '2023-02-10 22:47:07', '1', '2023-12-02 21:32:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2161, '接入示例', '', 1, 99, 1117, 'demo', 'fa-solid:dragon', 'pay/demo/index', NULL, 0, '1', '1', '1', '', '2023-02-11 14:21:42', '1', '2024-01-18 23:50:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, '1', '1', '1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2164, '配送管理', '', 1, 3, 2072, 'delivery', 'ep:shopping-cart', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:18:02', '1', '2023-09-28 10:58:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', 'ep:bicycle', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:22:06', '1', '2023-08-30 21:02:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', 'ep:add-location', '', '', 0, '1', '1', '1', '1', '2023-05-18 09:23:14', '1', '2023-08-30 21:03:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', 'ep:compass', 'mall/trade/delivery/express/index', 'Express', 0, '1', '1', '1', '1', '2023-05-18 09:27:21', '1', '2023-08-30 21:02:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', 'ep:coordinate', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, '1', '1', '1', '1', '2023-05-20 06:48:10', '1', '2023-08-30 21:03:13', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', 'ep:basketball', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, '1', '1', '1', '1', '2023-05-25 10:50:00', '1', '2023-08-30 21:03:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, '1', '1', '1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, '1', '1', '1', '1', '2023-06-24 17:39:13', '1', '2023-06-24 18:55:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'ep:bicycle', NULL, NULL, 0, '1', '1', '1', '1', '2023-06-10 00:42:03', '1', '2023-08-20 09:23:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2275, '会员配置', '', 2, 0, 2262, 'config', 'fa:archive', 'member/config/index', 'MemberConfig', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2023-10-01 23:41:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2276, '会员配置查询', 'member:config:query', 3, 1, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:48:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2277, '会员配置保存', 'member:config:save', 3, 2, 2275, '', '', '', '', 0, '1', '1', '1', '', '2023-06-10 02:07:44', '1', '2024-04-24 19:49:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2281, '签到配置', '', 2, 2, 2300, 'config', 'ep:calendar', 'member/signin/config/index', 'SignInConfig', 0, '1', '1', '1', '', '2023-06-10 03:26:12', '1', '2023-08-20 19:25:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2287, '会员积分', '', 2, 10, 2262, 'record', 'fa:asterisk', 'member/point/record/index', 'PointRecord', 0, '1', '1', '1', '', '2023-06-10 04:18:50', '1', '2023-10-01 23:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:18:50', '', '2023-06-10 04:18:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2293, '签到记录', '', 2, 3, 2300, 'record', 'ep:chicken', 'member/signin/record/index', 'SignInRecord', 0, '1', '1', '1', '', '2023-06-10 04:48:22', '1', '2023-08-20 19:26:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, '1', '1', '1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2300, '会员签到', '', 1, 11, 2262, 'signin', 'ep:alarm-clock', '', '', 0, '1', '1', '1', '1', '2023-06-27 22:49:53', '1', '2023-08-20 09:23:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2301, '回调通知', '', 2, 5, 1117, 'notify', 'ep:mute-notification', 'pay/notify/index', 'PayNotify', 0, '1', '1', '1', '', '2023-07-20 04:41:32', '1', '2024-01-18 23:56:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2302, '支付通知查询', 'pay:notify:query', 3, 1, 2301, '', '', '', NULL, 0, '1', '1', '1', '', '2023-07-20 04:41:32', '', '2023-07-20 04:41:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2303, '拼团活动', '', 2, 3, 2030, 'combination', 'fa:group', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:19:54', '1', '2023-08-12 17:20:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2304, '拼团商品', '', 2, 1, 2303, 'acitivity', 'ep:apple', 'mall/promotion/combination/activity/index', 'PromotionCombinationActivity', 0, '1', '1', '1', '1', '2023-08-12 17:22:03', '1', '2023-08-12 17:22:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2305, '拼团活动查询', 'promotion:combination-activity:query', 3, 1, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:32', '1', '2023-11-24 11:57:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2306, '拼团活动创建', 'promotion:combination-activity:create', 3, 2, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:54:49', '1', '2023-08-12 17:54:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2307, '拼团活动更新', 'promotion:combination-activity:update', 3, 3, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:04', '1', '2023-08-12 17:55:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2308, '拼团活动删除', 'promotion:combination-activity:delete', 3, 4, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:23', '1', '2023-08-12 17:55:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2309, '拼团活动关闭', 'promotion:combination-activity:close', 3, 5, 2304, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-12 17:55:37', '1', '2023-10-06 10:51:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2310, '砍价活动', '', 2, 4, 2030, 'bargain', 'ep:box', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:27:25', '1', '2023-08-13 00:27:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2311, '砍价商品', '', 2, 1, 2310, 'activity', 'ep:burger', 'mall/promotion/bargain/activity/index', 'PromotionBargainActivity', 0, '1', '1', '1', '1', '2023-08-13 00:28:49', '1', '2023-10-05 01:16:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2312, '砍价活动查询', 'promotion:bargain-activity:query', 3, 1, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:30', '1', '2023-08-13 00:32:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2313, '砍价活动创建', 'promotion:bargain-activity:create', 3, 2, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:44', '1', '2023-08-13 00:32:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2314, '砍价活动更新', 'promotion:bargain-activity:update', 3, 3, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:32:55', '1', '2023-08-13 00:32:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2315, '砍价活动删除', 'promotion:bargain-activity:delete', 3, 4, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:34:50', '1', '2023-08-13 00:34:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2316, '砍价活动关闭', 'promotion:bargain-activity:close', 3, 5, 2311, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-13 00:35:02', '1', '2023-08-13 00:35:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2317, '会员管理', '', 2, 0, 2262, 'user', 'ep:avatar', 'member/user/index', 'MemberUser', 0, '1', '1', '1', '', '2023-08-19 04:12:15', '1', '2023-08-24 00:50:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2318, '会员用户查询', 'member:user:query', 3, 1, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2319, '会员用户更新', 'member:user:update', 3, 3, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-19 04:12:15', '', '2023-08-19 04:12:15', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2320, '会员标签', '', 2, 1, 2262, 'tag', 'ep:collection-tag', 'member/tag/index', 'MemberTag', 0, '1', '1', '1', '', '2023-08-20 01:03:08', '1', '2023-08-20 09:23:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2321, '会员标签查询', 'member:tag:query', 3, 1, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2322, '会员标签创建', 'member:tag:create', 3, 2, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2323, '会员标签更新', 'member:tag:update', 3, 3, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2324, '会员标签删除', 'member:tag:delete', 3, 4, 2320, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-20 01:03:08', '', '2023-08-20 01:03:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2325, '会员等级', '', 2, 2, 2262, 'level', 'fa:level-up', 'member/level/index', 'MemberLevel', 0, '1', '1', '1', '', '2023-08-22 12:41:01', '1', '2023-08-22 21:47:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2326, '会员等级查询', 'member:level:query', 3, 1, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2327, '会员等级创建', 'member:level:create', 3, 2, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2328, '会员等级更新', 'member:level:update', 3, 3, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2329, '会员等级删除', 'member:level:delete', 3, 4, 2325, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 12:41:02', '', '2023-08-22 12:41:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2330, '会员分组', '', 2, 3, 2262, 'group', 'fa:group', 'member/group/index', 'MemberGroup', 0, '1', '1', '1', '', '2023-08-22 13:50:06', '1', '2023-10-01 23:42:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2331, '用户分组查询', 'member:group:query', 3, 1, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2332, '用户分组创建', 'member:group:create', 3, 2, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2333, '用户分组更新', 'member:group:update', 3, 3, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2334, '用户分组删除', 'member:group:delete', 3, 4, 2330, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-22 13:50:06', '', '2023-08-22 13:50:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2335, '用户等级修改', 'member:user:update-level', 3, 5, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-08-23 16:49:05', '', '2023-08-23 16:50:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2336, '商品评论', '', 2, 5, 2000, 'comment', 'ep:comment', 'mall/product/comment/index', 'ProductComment', 0, '1', '1', '1', '1', '2023-08-26 11:03:00', '1', '2023-08-26 11:03:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2337, '评论查询', 'product:comment:query', 3, 1, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:01', '1', '2023-08-26 11:04:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2338, '添加自评', 'product:comment:create', 3, 2, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:23', '1', '2023-08-26 11:08:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2339, '商家回复', 'product:comment:update', 3, 3, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:37', '1', '2023-08-26 11:04:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2340, '显隐评论', 'product:comment:update', 3, 4, 2336, '', '', '', '', 0, '1', '1', '1', '1', '2023-08-26 11:04:55', '1', '2023-08-26 11:04:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2341, '优惠劵发送', 'promotion:coupon:send', 3, 2, 2038, '', '', '', '', 0, '1', '1', '1', '1', '2023-09-02 00:03:14', '1', '2023-09-02 00:03:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2342, '交易配置', '', 2, 0, 2072, 'config', 'ep:setting', 'mall/trade/config/index', 'TradeConfig', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:30:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2343, '交易中心配置查询', 'trade:config:query', 3, 1, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2344, '交易中心配置保存', 'trade:config:save', 3, 2, 2342, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2345, '分销管理', '', 1, 4, 2072, 'brokerage', 'fa-solid:project-diagram', '', '', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2023-09-28 10:58:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2346, '分销用户', '', 2, 0, 2345, 'brokerage-user', 'fa-solid:user-tie', 'mall/trade/brokerage/user/index', 'TradeBrokerageUser', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2347, '分销用户查询', 'trade:brokerage-user:query', 3, 1, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2348, '分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2349, '分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2350, '分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2351, '分销用户修改推广员', 'trade:brokerage-user:update-bind-user', 3, 5, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2352, '分销用户清除推广员', 'trade:brokerage-user:clear-bind-user', 3, 6, 2346, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2353, '佣金记录', '', 2, 1, 2345, 'brokerage-record', 'fa:money', 'mall/trade/brokerage/record/index', 'TradeBrokerageRecord', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2354, '佣金记录查询', 'trade:brokerage-record:query', 3, 1, 2353, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2355, '佣金提现', '', 2, 2, 2345, 'brokerage-withdraw', 'fa:credit-card', 'mall/trade/brokerage/withdraw/index', 'TradeBrokerageWithdraw', 0, '1', '1', '1', '', '2023-09-28 02:46:22', '1', '2024-02-26 20:33:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2356, '佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2357, '佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, 2355, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-28 02:46:22', '', '2023-09-28 02:46:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2358, '统计中心', '', 1, 75, 2362, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2023-09-30 11:54:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2359, '交易统计', '', 2, 4, 2358, 'trade', 'fa-solid:credit-card', 'mall/statistics/trade/index', 'TradeStatistics', 0, '1', '1', '1', '', '2023-09-30 03:22:40', '1', '2024-02-26 20:42:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2360, '交易统计查询', 'statistics:trade:query', 3, 1, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2361, '交易统计导出', 'statistics:trade:export', 3, 2, 2359, '', '', '', NULL, 0, '1', '1', '1', '', '2023-09-30 03:22:40', '', '2023-09-30 03:22:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2362, '商城系统', '', 1, 59, 0, '/mall', 'ep:shop', '', '', 0, '1', '1', '1', '1', '2023-09-30 11:52:02', '1', '2023-09-30 11:52:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2363, '用户积分修改', 'member:user:update-point', 3, 6, 2317, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-01 14:39:43', '', '2023-10-01 14:39:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2364, '用户余额修改', 'member:user:update-balance', 3, 7, 2317, '', '', '', '', 0, '1', '1', '1', '', '2023-10-01 14:39:43', '1', '2023-10-01 22:42:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2365, '优惠劵', '', 1, 2, 2030, 'coupon', 'fa-solid:disease', '', '', 0, '1', '1', '1', '1', '2023-10-03 12:39:15', '1', '2023-10-05 00:16:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2366, '砍价记录', '', 2, 2, 2310, 'record', 'ep:list', 'mall/promotion/bargain/record/index', 'PromotionBargainRecord', 0, '1', '1', '1', '', '2023-10-05 02:49:06', '1', '2023-10-05 10:50:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2367, '砍价记录查询', 'promotion:bargain-record:query', 3, 1, 2366, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-05 02:49:06', '', '2023-10-05 02:49:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2368, '助力记录查询', 'promotion:bargain-help:query', 3, 2, 2366, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-05 12:27:49', '1', '2023-10-05 12:27:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2369, '拼团记录', 'promotion:combination-record:query', 2, 2, 2303, 'record', 'ep:avatar', 'mall/promotion/combination/record/index.vue', 'PromotionCombinationRecord', 0, '1', '1', '1', '1', '2023-10-08 07:10:22', '1', '2023-10-08 07:34:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2374, '会员统计', '', 2, 2, 2358, 'member', 'ep:avatar', 'mall/statistics/member/index', 'MemberStatistics', 0, '1', '1', '1', '', '2023-10-11 04:39:24', '1', '2024-02-26 20:41:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2375, '会员统计查询', 'statistics:member:query', 3, 1, 2374, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-11 04:39:24', '', '2023-10-11 04:39:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2376, '订单核销', 'trade:order:pick-up', 3, 10, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2023-10-14 17:11:58', '1', '2023-10-14 17:11:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2377, '文章分类', '', 2, 0, 2387, 'article/category', 'fa:certificate', 'mall/promotion/article/category/index', 'ArticleCategory', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:38:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2378, '分类查询', 'promotion:article-category:query', 3, 1, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2379, '分类创建', 'promotion:article-category:create', 3, 2, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2380, '分类更新', 'promotion:article-category:update', 3, 3, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2381, '分类删除', 'promotion:article-category:delete', 3, 4, 2377, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2382, '文章列表', '', 2, 2, 2387, 'article', 'ep:connection', 'mall/promotion/article/index', 'Article', 0, '1', '1', '1', '', '2023-10-16 01:26:18', '1', '2023-10-16 09:41:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2383, '文章管理查询', 'promotion:article:query', 3, 1, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2384, '文章管理创建', 'promotion:article:create', 3, 2, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2385, '文章管理更新', 'promotion:article:update', 3, 3, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2386, '文章管理删除', 'promotion:article:delete', 3, 4, 2382, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-16 01:26:18', '', '2023-10-16 01:26:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2387, '内容管理', '', 1, 1, 2030, 'content', 'ep:collection', '', '', 0, '1', '1', '1', '1', '2023-10-16 09:37:31', '1', '2023-10-16 09:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2388, '商城首页', '', 2, 1, 2362, 'home', 'ep:home-filled', 'mall/home/index', 'MallHome', 0, '1', '1', '1', '', '2023-10-16 12:10:33', '', '2023-10-16 12:10:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2389, '核销订单', '', 2, 2, 2166, 'pick-up-order', 'ep:list', 'mall/trade/delivery/pickUpOrder/index', 'PickUpOrder', 0, '1', '1', '1', '', '2023-10-19 16:09:51', '', '2023-10-19 16:09:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2390, '优惠活动', '', 1, 99, 2030, 'youhui', 'ep:aim', '', '', 0, '1', '1', '1', '1', '2023-10-21 19:23:49', '1', '2023-10-21 19:23:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2391, '客户管理', '', 2, 10, 2397, 'customer', 'fa:address-book-o', 'crm/customer/index', 'CrmCustomer', 0, '1', '1', '1', '', '2023-10-29 09:04:21', '1', '2024-02-17 17:13:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2392, '客户查询', 'crm:customer:query', 3, 1, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2393, '客户创建', 'crm:customer:create', 3, 2, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2394, '客户更新', 'crm:customer:update', 3, 3, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2395, '客户删除', 'crm:customer:delete', 3, 4, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2396, '客户导出', 'crm:customer:export', 3, 5, 2391, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 09:04:21', '', '2023-10-29 09:04:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2397, 'CRM 系统', '', 1, 200, 0, '/crm', 'ep:avatar', '', '', 0, '1', '1', '1', '1', '2023-10-29 17:08:30', '1', '2024-02-04 15:37:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2398, '合同管理', '', 2, 50, 2397, 'contract', 'ep:notebook', 'crm/contract/index', 'CrmContract', 0, '1', '1', '1', '', '2023-10-29 10:50:41', '1', '2024-02-17 17:15:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2399, '合同查询', 'crm:contract:query', 3, 1, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2400, '合同创建', 'crm:contract:create', 3, 2, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2401, '合同更新', 'crm:contract:update', 3, 3, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2402, '合同删除', 'crm:contract:delete', 3, 4, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2403, '合同导出', 'crm:contract:export', 3, 5, 2398, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 10:50:41', '', '2023-10-29 10:50:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2404, '线索管理', '', 2, 8, 2397, 'clue', 'fa:pagelines', 'crm/clue/index', 'CrmClue', 0, '1', '1', '1', '', '2023-10-29 11:06:29', '1', '2024-02-17 17:15:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2405, '线索查询', 'crm:clue:query', 3, 1, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2406, '线索创建', 'crm:clue:create', 3, 2, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2407, '线索更新', 'crm:clue:update', 3, 3, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2408, '线索删除', 'crm:clue:delete', 3, 4, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2409, '线索导出', 'crm:clue:export', 3, 5, 2404, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:06:29', '', '2023-10-29 11:06:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2410, '商机管理', '', 2, 40, 2397, 'business', 'fa:bus', 'crm/business/index', 'CrmBusiness', 0, '1', '1', '1', '', '2023-10-29 11:12:35', '1', '2024-02-17 17:14:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2411, '商机查询', 'crm:business:query', 3, 1, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2412, '商机创建', 'crm:business:create', 3, 2, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2413, '商机更新', 'crm:business:update', 3, 3, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2414, '商机删除', 'crm:business:delete', 3, 4, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2415, '商机导出', 'crm:business:export', 3, 5, 2410, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:12:35', '', '2023-10-29 11:12:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2416, '联系人管理', '', 2, 20, 2397, 'contact', 'fa:address-book-o', 'crm/contact/index', 'CrmContact', 0, '1', '1', '1', '', '2023-10-29 11:14:56', '1', '2024-02-17 17:13:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2417, '联系人查询', 'crm:contact:query', 3, 1, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2418, '联系人创建', 'crm:contact:create', 3, 2, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2419, '联系人更新', 'crm:contact:update', 3, 3, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2420, '联系人删除', 'crm:contact:delete', 3, 4, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2421, '联系人导出', 'crm:contact:export', 3, 5, 2416, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:14:56', '', '2023-10-29 11:14:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2422, '回款管理', '', 2, 60, 2397, 'receivable', 'ep:money', 'crm/receivable/index', 'CrmReceivable', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2423, '回款管理查询', 'crm:receivable:query', 3, 1, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2424, '回款管理创建', 'crm:receivable:create', 3, 2, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2425, '回款管理更新', 'crm:receivable:update', 3, 3, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2426, '回款管理删除', 'crm:receivable:delete', 3, 4, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2427, '回款管理导出', 'crm:receivable:export', 3, 5, 2422, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2428, '回款计划', '', 2, 61, 2397, 'receivable-plan', 'fa:money', 'crm/receivable/plan/index', 'CrmReceivablePlan', 0, '1', '1', '1', '', '2023-10-29 11:18:09', '1', '2024-02-17 17:16:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2429, '回款计划查询', 'crm:receivable-plan:query', 3, 1, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2430, '回款计划创建', 'crm:receivable-plan:create', 3, 2, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2431, '回款计划更新', 'crm:receivable-plan:update', 3, 3, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2432, '回款计划删除', 'crm:receivable-plan:delete', 3, 4, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2433, '回款计划导出', 'crm:receivable-plan:export', 3, 5, 2428, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 11:18:09', '', '2023-10-29 11:18:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2435, '商城装修', '', 2, 20, 2030, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2436, '装修模板', '', 2, 1, 2435, 'diy-template', 'fa6-solid:brush', 'mall/promotion/diy/template/index', 'DiyTemplate', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2437, '装修模板查询', 'promotion:diy-template:query', 3, 1, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2438, '装修模板创建', 'promotion:diy-template:create', 3, 2, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2439, '装修模板更新', 'promotion:diy-template:update', 3, 3, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2440, '装修模板删除', 'promotion:diy-template:delete', 3, 4, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2441, '装修模板使用', 'promotion:diy-template:use', 3, 5, 2436, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2442, '装修页面', '', 2, 2, 2435, 'diy-page', 'foundation:page-edit', 'mall/promotion/diy/page/index', 'DiyPage', 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2443, '装修页面查询', 'promotion:diy-page:query', 3, 1, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:25', '', '2023-10-29 14:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2444, '装修页面创建', 'promotion:diy-page:create', 3, 2, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2445, '装修页面更新', 'promotion:diy-page:update', 3, 3, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2446, '装修页面删除', 'promotion:diy-page:delete', 3, 4, 2442, '', '', '', NULL, 0, '1', '1', '1', '', '2023-10-29 14:19:26', '', '2023-10-29 14:19:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2447, '三方登录', '', 1, 10, 1, 'social', 'fa:rocket', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:12:01', '1', '2024-02-29 01:14:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2448, '三方应用', '', 2, 1, 2447, 'client', 'ep:set-up', 'views/system/social/client/index.vue', 'SocialClient', 0, '1', '1', '1', '1', '2023-11-04 12:17:19', '1', '2023-11-04 12:17:19', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2449, '三方应用查询', 'system:social-client:query', 3, 1, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:12', '1', '2023-11-04 12:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2450, '三方应用创建', 'system:social-client:create', 3, 2, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:43:58', '1', '2023-11-04 12:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2451, '三方应用更新', 'system:social-client:update', 3, 3, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:27', '1', '2023-11-04 12:44:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2452, '三方应用删除', 'system:social-client:delete', 3, 4, 2448, '', '', '', '', 0, '1', '1', '1', '1', '2023-11-04 12:44:43', '1', '2023-11-04 12:44:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2453, '三方用户', 'system:social-user:query', 2, 2, 2447, 'user', 'ep:avatar', 'system/social/user/index.vue', 'SocialUser', 0, '1', '1', '1', '1', '2023-11-04 14:01:05', '1', '2023-11-04 14:01:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2472, '主子表(内嵌)', '', 2, 12, 1070, 'demo03-inner', 'fa:power-off', 'infra/demo/demo03/inner/index', 'Demo03StudentInner', 0, '1', '1', '1', '', '2023-11-13 04:39:51', '1', '2023-11-16 23:53:46', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2478, '单表(增删改查)', '', 2, 1, 1070, 'demo01-contact', 'ep:bicycle', 'infra/demo/demo01/index', 'Demo01Contact', 0, '1', '1', '1', '', '2023-11-15 14:42:30', '1', '2023-11-16 20:34:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2479, '示例联系人查询', 'infra:demo01-contact:query', 3, 1, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2480, '示例联系人创建', 'infra:demo01-contact:create', 3, 2, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2481, '示例联系人更新', 'infra:demo01-contact:update', 3, 3, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2482, '示例联系人删除', 'infra:demo01-contact:delete', 3, 4, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2483, '示例联系人导出', 'infra:demo01-contact:export', 3, 5, 2478, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-15 14:42:30', '', '2023-11-15 14:42:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2484, '树表(增删改查)', '', 2, 2, 1070, 'demo02-category', 'fa:tree', 'infra/demo/demo02/index', 'Demo02Category', 0, '1', '1', '1', '', '2023-11-16 12:18:27', '1', '2023-11-16 20:35:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2485, '示例分类查询', 'infra:demo02-category:query', 3, 1, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2486, '示例分类创建', 'infra:demo02-category:create', 3, 2, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2487, '示例分类更新', 'infra:demo02-category:update', 3, 3, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2488, '示例分类删除', 'infra:demo02-category:delete', 3, 4, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2489, '示例分类导出', 'infra:demo02-category:export', 3, 5, 2484, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:18:27', '', '2023-11-16 12:18:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2490, '主子表(标准)', '', 2, 10, 1070, 'demo03-normal', 'fa:battery-3', 'infra/demo/demo03/normal/index', 'Demo03StudentNormal', 0, '1', '1', '1', '', '2023-11-16 12:53:37', '1', '2023-11-16 23:10:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2491, '学生查询', 'infra:demo03-student:query', 3, 1, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2492, '学生创建', 'infra:demo03-student:create', 3, 2, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2493, '学生更新', 'infra:demo03-student:update', 3, 3, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2494, '学生删除', 'infra:demo03-student:delete', 3, 4, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2495, '学生导出', 'infra:demo03-student:export', 3, 5, 2490, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-16 12:53:37', '', '2023-11-16 12:53:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2497, '主子表(ERP)', '', 2, 11, 1070, 'demo03-erp', 'ep:calendar', 'infra/demo/demo03/erp/index', 'Demo03StudentERP', 0, '1', '1', '1', '', '2023-11-16 15:50:59', '1', '2023-11-17 13:19:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2516, '客户公海配置', '', 2, 0, 2524, 'customer-pool-config', 'ep:data-analysis', 'crm/customer/poolConfig/index', 'CrmCustomerPoolConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:31', '1', '2024-01-03 19:52:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2517, '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, 2516, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:31', '', '2023-11-18 13:33:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2518, '客户限制配置', '', 2, 1, 2524, 'customer-limit-config', 'ep:avatar', 'crm/customer/limitConfig/index', 'CrmCustomerLimitConfig', 0, '1', '1', '1', '', '2023-11-18 13:33:53', '1', '2024-02-24 16:43:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2519, '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2520, '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2521, '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2522, '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2523, '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, 2518, '', '', '', NULL, 0, '1', '1', '1', '', '2023-11-18 13:33:53', '', '2023-11-18 13:33:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2524, '系统配置', '', 1, 999, 2397, 'config', 'ep:connection', '', '', 0, '1', '1', '1', '1', '2023-11-18 21:58:00', '1', '2024-02-17 17:14:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2525, 'WebSocket', '', 2, 5, 2, 'websocket', 'ep:connection', 'infra/webSocket/index', 'InfraWebSocket', 0, '1', '1', '1', '1', '2023-11-23 19:41:55', '1', '2024-04-23 00:02:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2526, '产品管理', '', 2, 80, 2397, 'product', 'fa:product-hunt', 'crm/product/index', 'CrmProduct', 0, '1', '1', '1', '1', '2023-12-05 22:45:26', '1', '2024-02-20 20:36:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2527, '产品查询', 'crm:product:query', 3, 1, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:16', '1', '2023-12-05 22:47:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2528, '产品创建', 'crm:product:create', 3, 2, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:47:41', '1', '2023-12-05 22:47:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2529, '产品更新', 'crm:product:update', 3, 3, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:03', '1', '2023-12-05 22:48:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2530, '产品删除', 'crm:product:delete', 3, 4, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:17', '1', '2023-12-05 22:48:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2531, '产品导出', 'crm:product:export', 3, 5, 2526, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-05 22:48:29', '1', '2023-12-05 22:48:29', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2532, '产品分类配置', '', 2, 3, 2524, 'product/category', 'fa-solid:window-restore', 'crm/product/category/index', 'CrmProductCategory', 0, '1', '1', '1', '1', '2023-12-06 12:52:36', '1', '2023-12-06 12:52:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2533, '产品分类查询', 'crm:product-category:query', 3, 1, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:23', '1', '2023-12-06 12:53:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2534, '产品分类创建', 'crm:product-category:create', 3, 2, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:41', '1', '2023-12-06 12:53:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2535, '产品分类更新', 'crm:product-category:update', 3, 3, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:53:59', '1', '2023-12-06 12:53:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2536, '产品分类删除', 'crm:product-category:delete', 3, 4, 2532, '', '', '', '', 0, '1', '1', '1', '1', '2023-12-06 12:54:14', '1', '2023-12-06 12:54:14', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2543, '关联商机', 'crm:contact:create-business', 3, 10, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:25', '1', '2024-01-02 17:28:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2544, '取关商机', 'crm:contact:delete-business', 3, 11, 2416, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-02 17:28:43', '1', '2024-01-02 17:28:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2545, '商品统计', '', 2, 3, 2358, 'product', 'fa:product-hunt', 'mall/statistics/product/index', 'ProductStatistics', 0, '1', '1', '1', '', '2023-12-15 18:54:28', '1', '2024-02-26 20:41:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2546, '客户公海', '', 2, 30, 2397, 'customer/pool', 'fa-solid:swimming-pool', 'crm/customer/pool/index', 'CrmCustomerPool', 0, '1', '1', '1', '1', '2024-01-15 21:29:34', '1', '2024-02-17 17:14:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2547, '订单查询', 'trade:order:query', 3, 1, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:00', '1', '2024-01-16 08:52:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2548, '订单更新', 'trade:order:update', 3, 2, 2076, '', '', '', '', 0, '1', '1', '1', '1', '2024-01-16 08:52:21', '1', '2024-01-16 08:52:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2549, '支付&退款案例', '', 2, 1, 2161, 'order', 'fa:paypal', 'pay/demo/order/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:45:00', '1', '2024-01-18 23:47:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2550, '转账案例', '', 2, 2, 2161, 'transfer', 'fa:transgender-alt', 'pay/demo/transfer/index', '', 0, '1', '1', '1', '1', '2024-01-18 23:51:16', '1', '2024-01-18 23:51:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2551, '钱包管理', '', 1, 4, 1117, 'wallet', 'ep:wallet', '', '', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '1', '2024-02-29 08:58:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2552, '充值套餐', '', 2, 2, 2551, 'wallet-recharge-package', 'fa:leaf', 'pay/wallet/rechargePackage/index', 'WalletRechargePackage', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2553, '钱包充值套餐查询', 'pay:wallet-recharge-package:query', 3, 1, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2554, '钱包充值套餐创建', 'pay:wallet-recharge-package:create', 3, 2, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2555, '钱包充值套餐更新', 'pay:wallet-recharge-package:update', 3, 3, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2556, '钱包充值套餐删除', 'pay:wallet-recharge-package:delete', 3, 4, 2552, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2557, '钱包余额', '', 2, 1, 2551, 'wallet-balance', 'fa:leaf', 'pay/wallet/balance/index', 'WalletBalance', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2558, '钱包余额查询', 'pay:wallet:query', 3, 1, 2557, '', '', '', NULL, 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2559, '转账订单', '', 2, 3, 1117, 'transfer', 'ep:credit-card', 'pay/transfer/index', 'PayTransfer', 0, '1', '1', '1', '', '2023-12-29 02:32:54', '', '2023-12-29 02:32:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2560, '数据统计', '', 1, 200, 2397, 'statistics', 'ep:data-line', '', '', 0, '1', '1', '1', '1', '2024-01-26 22:50:35', '1', '2024-02-24 20:10:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2561, '排行榜', 'crm:statistics-rank:query', 2, 1, 2560, 'ranking', 'fa:area-chart', 'crm/statistics/rank/index', 'CrmStatisticsRank', 0, '1', '1', '1', '1', '2024-01-26 22:52:09', '1', '2024-04-24 19:39:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2562, '客户导入', 'crm:customer:import', 3, 6, 2391, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-01 13:09:00', '1', '2024-02-01 13:09:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2563, 'ERP 系统', '', 1, 300, 0, '/erp', 'fa-solid:store', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:37:25', '1', '2024-02-04 15:37:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2564, '产品管理', '', 1, 40, 2563, 'product', 'fa:product-hunt', '', '', 0, '1', '1', '1', '1', '2024-02-04 15:38:43', '1', '2024-02-04 15:38:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2565, '产品信息', '', 2, 0, 2564, 'product', 'fa-solid:apple-alt', 'erp/product/product/index', 'ErpProduct', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-05 14:42:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2566, '产品查询', 'erp:product:query', 3, 1, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:21:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2567, '产品创建', 'erp:product:create', 3, 2, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2568, '产品更新', 'erp:product:update', 3, 3, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2569, '产品删除', 'erp:product:delete', 3, 4, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:22', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2570, '产品导出', 'erp:product:export', 3, 5, 2565, '', '', '', '', 0, '1', '1', '1', '', '2024-02-04 07:52:15', '1', '2024-02-04 17:22:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2571, '产品分类', '', 2, 1, 2564, 'product-category', 'fa:certificate', 'erp/product/category/index', 'ErpProductCategory', 0, '1', '1', '1', '', '2024-02-04 09:21:04', '1', '2024-02-04 17:24:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2572, '分类查询', 'erp:product-category:query', 3, 1, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2573, '分类创建', 'erp:product-category:create', 3, 2, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2574, '分类更新', 'erp:product-category:update', 3, 3, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2575, '分类删除', 'erp:product-category:delete', 3, 4, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2576, '分类导出', 'erp:product-category:export', 3, 5, 2571, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 09:21:04', '', '2024-02-04 09:21:04', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2577, '产品单位', '', 2, 2, 2564, 'unit', 'ep:opportunity', 'erp/product/unit/index', 'ErpProductUnit', 0, '1', '1', '1', '', '2024-02-04 11:54:08', '1', '2024-02-04 19:54:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2578, '单位查询', 'erp:product-unit:query', 3, 1, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2579, '单位创建', 'erp:product-unit:create', 3, 2, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2580, '单位更新', 'erp:product-unit:update', 3, 3, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2581, '单位删除', 'erp:product-unit:delete', 3, 4, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2582, '单位导出', 'erp:product-unit:export', 3, 5, 2577, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 11:54:08', '', '2024-02-04 11:54:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2583, '库存管理', '', 1, 30, 2563, 'stock', 'fa:window-restore', '', '', 0, '1', '1', '1', '1', '2024-02-05 00:29:37', '1', '2024-02-05 00:29:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2584, '仓库信息', '', 2, 0, 2583, 'warehouse', 'ep:house', 'erp/stock/warehouse/index', 'ErpWarehouse', 0, '1', '1', '1', '', '2024-02-04 17:12:09', '1', '2024-02-05 01:12:53', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2585, '仓库查询', 'erp:warehouse:query', 3, 1, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2586, '仓库创建', 'erp:warehouse:create', 3, 2, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2587, '仓库更新', 'erp:warehouse:update', 3, 3, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2588, '仓库删除', 'erp:warehouse:delete', 3, 4, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2589, '仓库导出', 'erp:warehouse:export', 3, 5, 2584, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-04 17:12:09', '', '2024-02-04 17:12:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2590, '产品库存', '', 2, 1, 2583, 'stock', 'ep:coffee', 'erp/stock/stock/index', 'ErpStock', 0, '1', '1', '1', '', '2024-02-05 06:40:50', '1', '2024-02-05 14:42:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2591, '库存查询', 'erp:stock:query', 3, 1, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2592, '库存导出', 'erp:stock:export', 3, 5, 2590, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 06:40:50', '', '2024-02-05 06:40:50', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2593, '出入库明细', '', 2, 2, 2583, 'record', 'fa-solid:blog', 'erp/stock/record/index', 'ErpStockRecord', 0, '1', '1', '1', '', '2024-02-05 10:27:21', '1', '2024-02-06 17:26:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2594, '库存明细查询', 'erp:stock-record:query', 3, 1, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2595, '库存明细导出', 'erp:stock-record:export', 3, 5, 2593, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 10:27:21', '', '2024-02-05 10:27:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2596, '其它入库', '', 2, 3, 2583, 'in', 'ep:zoom-in', 'erp/stock/in/index', 'ErpStockIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:51', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2597, '其它入库单查询', 'erp:stock-in:query', 3, 1, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2598, '其它入库单创建', 'erp:stock-in:create', 3, 2, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2599, '其它入库单更新', 'erp:stock-in:update', 3, 3, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2600, '其它入库单删除', 'erp:stock-in:delete', 3, 4, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2601, '其它入库单导出', 'erp:stock-in:export', 3, 5, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2602, '采购管理', '', 1, 10, 2563, 'purchase', 'fa:buysellads', '', '', 0, '1', '1', '1', '1', '2024-02-06 16:01:01', '1', '2024-02-06 16:01:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2603, '供应商信息', '', 2, 4, 2602, 'supplier', 'fa:superpowers', 'erp/purchase/supplier/index', 'ErpSupplier', 0, '1', '1', '1', '', '2024-02-06 08:21:55', '1', '2024-02-06 16:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2604, '供应商查询', 'erp:supplier:query', 3, 1, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2605, '供应商创建', 'erp:supplier:create', 3, 2, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2606, '供应商更新', 'erp:supplier:update', 3, 3, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2607, '供应商删除', 'erp:supplier:delete', 3, 4, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2608, '供应商导出', 'erp:supplier:export', 3, 5, 2603, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-06 08:21:55', '', '2024-02-06 08:21:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2609, '其它入库单审批', 'erp:stock-in:update-status', 3, 6, 2596, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-05 16:08:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2610, '其它出库', '', 2, 4, 2583, 'out', 'ep:zoom-out', 'erp/stock/out/index', 'ErpStockOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-07 19:06:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2611, '其它出库单查询', 'erp:stock-out:query', 3, 1, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:39', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2612, '其它出库单创建', 'erp:stock-out:create', 3, 2, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2613, '其它出库单更新', 'erp:stock-out:update', 3, 3, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2614, '其它出库单删除', 'erp:stock-out:delete', 3, 4, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2615, '其它出库单导出', 'erp:stock-out:export', 3, 5, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2616, '其它出库单审批', 'erp:stock-out:update-status', 3, 6, 2610, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 06:43:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2617, '销售管理', '', 1, 20, 2563, 'sale', 'fa:sellsy', '', '', 0, '1', '1', '1', '1', '2024-02-07 15:12:32', '1', '2024-02-07 15:12:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2618, '客户信息', '', 2, 4, 2617, 'customer', 'ep:avatar', 'erp/sale/customer/index', 'ErpCustomer', 0, '1', '1', '1', '', '2024-02-07 07:21:45', '1', '2024-02-07 15:22:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2619, '客户查询', 'erp:customer:query', 3, 1, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2620, '客户创建', 'erp:customer:create', 3, 2, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2621, '客户更新', 'erp:customer:update', 3, 3, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2622, '客户删除', 'erp:customer:delete', 3, 4, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2623, '客户导出', 'erp:customer:export', 3, 5, 2618, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-07 07:21:45', '', '2024-02-07 07:21:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2624, '库存调拨', '', 2, 5, 2583, 'move', 'ep:folder-remove', 'erp/stock/move/index', 'ErpStockMove', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-16 18:53:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2625, '库存调度单查询', 'erp:stock-move:query', 3, 1, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2626, '库存调度单创建', 'erp:stock-move:create', 3, 2, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2627, '库存调度单更新', 'erp:stock-move:update', 3, 3, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2628, '库存调度单删除', 'erp:stock-move:delete', 3, 4, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2629, '库存调度单导出', 'erp:stock-move:export', 3, 5, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2630, '库存调度单审批', 'erp:stock-move:update-status', 3, 6, 2624, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2631, '库存盘点', '', 2, 6, 2583, 'check', 'ep:circle-check-filled', 'erp/stock/check/index', 'ErpStockCheck', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-08 08:31:09', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2632, '库存盘点单查询', 'erp:stock-check:query', 3, 1, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2633, '库存盘点单创建', 'erp:stock-check:create', 3, 2, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2634, '库存盘点单更新', 'erp:stock-check:update', 3, 3, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2635, '库存盘点单删除', 'erp:stock-check:delete', 3, 4, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2636, '库存盘点单导出', 'erp:stock-check:export', 3, 5, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2637, '库存盘点单审批', 'erp:stock-check:update-status', 3, 6, 2631, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2638, '销售订单', '', 2, 1, 2617, 'order', 'fa:first-order', 'erp/sale/order/index', 'ErpSaleOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 21:59:20', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2639, '销售订单查询', 'erp:sale-order:query', 3, 1, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2640, '销售订单创建', 'erp:sale-order:create', 3, 2, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2641, '销售订单更新', 'erp:sale-order:update', 3, 3, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2642, '销售订单删除', 'erp:sale-order:delete', 3, 4, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2643, '销售订单导出', 'erp:sale-order:export', 3, 5, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2644, '销售订单审批', 'erp:sale-order:update-status', 3, 6, 2638, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2645, '财务管理', '', 1, 50, 2563, 'finance', 'ep:money', '', '', 0, '1', '1', '1', '1', '2024-02-10 08:05:58', '1', '2024-02-10 08:06:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2646, '结算账户', '', 2, 10, 2645, 'account', 'fa:universal-access', 'erp/finance/account/index', 'ErpAccount', 0, '1', '1', '1', '', '2024-02-10 00:15:07', '1', '2024-02-14 08:24:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2647, '结算账户查询', 'erp:account:query', 3, 1, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2648, '结算账户创建', 'erp:account:create', 3, 2, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2649, '结算账户更新', 'erp:account:update', 3, 3, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2650, '结算账户删除', 'erp:account:delete', 3, 4, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2651, '结算账户导出', 'erp:account:export', 3, 5, 2646, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-10 00:15:07', '', '2024-02-10 00:15:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2652, '销售出库', '', 2, 2, 2617, 'out', 'ep:sold-out', 'erp/sale/out/index', 'ErpSaleOut', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-10 22:02:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2653, '销售出库查询', 'erp:sale-out:query', 3, 1, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2654, '销售出库创建', 'erp:sale-out:create', 3, 2, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2655, '销售出库更新', 'erp:sale-out:update', 3, 3, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2656, '销售出库删除', 'erp:sale-out:delete', 3, 4, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2657, '销售出库导出', 'erp:sale-out:export', 3, 5, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2658, '销售出库审批', 'erp:sale-out:update-status', 3, 6, 2652, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2659, '销售退货', '', 2, 3, 2617, 'return', 'fa-solid:bone', 'erp/sale/return/index', 'ErpSaleReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 06:12:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2660, '销售退货查询', 'erp:sale-return:query', 3, 1, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2661, '销售退货创建', 'erp:sale-return:create', 3, 2, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2662, '销售退货更新', 'erp:sale-return:update', 3, 3, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:55', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2663, '销售退货删除', 'erp:sale-return:delete', 3, 4, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2664, '销售退货导出', 'erp:sale-return:export', 3, 5, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:12:59', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2665, '销售退货审批', 'erp:sale-return:update-status', 3, 6, 2659, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-07 11:13:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2666, '采购订单', '', 2, 1, 2602, 'order', 'fa-solid:border-all', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 08:51:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2667, '采购订单查询', 'erp:purchase-order:query', 3, 1, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2668, '采购订单创建', 'erp:purchase-order:create', 3, 2, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2669, '采购订单更新', 'erp:purchase-order:update', 3, 3, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2670, '采购订单删除', 'erp:purchase-order:delete', 3, 4, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2671, '采购订单导出', 'erp:purchase-order:export', 3, 5, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2672, '采购订单审批', 'erp:purchase-order:update-status', 3, 6, 2666, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2673, '采购入库', '', 2, 2, 2602, 'in', 'fa-solid:gopuram', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 11:19:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2674, '采购入库查询', 'erp:purchase-in:query', 3, 1, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2675, '采购入库创建', 'erp:purchase-in:create', 3, 2, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2676, '采购入库更新', 'erp:purchase-in:update', 3, 3, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2677, '采购入库删除', 'erp:purchase-in:delete', 3, 4, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2678, '采购入库导出', 'erp:purchase-in:export', 3, 5, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2679, '采购入库审批', 'erp:purchase-in:update-status', 3, 6, 2673, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2680, '采购退货', '', 2, 3, 2602, 'return', 'ep:minus', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-12 20:51:02', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2681, '采购退货查询', 'erp:purchase-return:query', 3, 1, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2682, '采购退货创建', 'erp:purchase-return:create', 3, 2, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2683, '采购退货更新', 'erp:purchase-return:update', 3, 3, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2684, '采购退货删除', 'erp:purchase-return:delete', 3, 4, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2685, '采购退货导出', 'erp:purchase-return:export', 3, 5, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2686, '采购退货审批', 'erp:purchase-return:update-status', 3, 6, 2680, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2687, '付款单', '', 2, 1, 2645, 'payment', 'ep:caret-right', 'erp/finance/payment/index', 'ErpFinancePayment', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-14 08:24:23', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2688, '付款单查询', 'erp:finance-payment:query', 3, 1, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2689, '付款单创建', 'erp:finance-payment:create', 3, 2, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2690, '付款单更新', 'erp:finance-payment:update', 3, 3, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2691, '付款单删除', 'erp:finance-payment:delete', 3, 4, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2692, '付款单导出', 'erp:finance-payment:export', 3, 5, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2693, '付款单审批', 'erp:finance-payment:update-status', 3, 6, 2687, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2694, '收款单', '', 2, 2, 2645, 'receipt', 'ep:expand', 'erp/finance/receipt/index', 'ErpFinanceReceipt', 0, '1', '1', '1', '', '2024-02-05 16:08:56', '1', '2024-02-15 19:35:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2695, '收款单查询', 'erp:finance-receipt:query', 3, 1, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2696, '收款单创建', 'erp:finance-receipt:create', 3, 2, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:54', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2697, '收款单更新', 'erp:finance-receipt:update', 3, 3, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:44:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2698, '收款单删除', 'erp:finance-receipt:delete', 3, 4, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:00', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2699, '收款单导出', 'erp:finance-receipt:export', 3, 5, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2700, '收款单审批', 'erp:finance-receipt:update-status', 3, 6, 2694, '', '', '', NULL, 0, '1', '1', '1', '', '2024-02-05 16:08:56', '', '2024-02-12 00:45:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2701, '待办事项', '', 2, 0, 2397, 'backlog', 'fa-solid:tasks', 'crm/backlog/index', 'CrmBacklog', 0, '1', '1', '1', '1', '2024-02-17 17:17:11', '1', '2024-02-17 17:17:11', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2702, 'ERP 首页', 'erp:statistics:query', 2, 0, 2563, 'home', 'ep:home-filled', 'erp/home/index.vue', 'ErpHome', 0, '1', '1', '1', '1', '2024-02-18 16:49:40', '1', '2024-02-26 21:12:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2703, '商机状态配置', '', 2, 4, 2524, 'business-status', 'fa-solid:charging-station', 'crm/business/status/index', 'CrmBusinessStatus', 0, '1', '1', '1', '1', '2024-02-21 20:15:17', '1', '2024-02-21 20:15:17', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2704, '商机状态查询', 'crm:business-status:query', 3, 1, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:36', '1', '2024-02-21 20:36:06', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2705, '商机状态创建', 'crm:business-status:create', 3, 2, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:35:57', '1', '2024-02-21 20:35:57', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2706, '商机状态更新', 'crm:business-status:update', 3, 3, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:21', '1', '2024-02-21 20:36:21', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2707, '商机状态删除', 'crm:business-status:delete', 3, 4, 2703, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-21 20:36:36', '1', '2024-02-21 20:36:36', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2708, '合同配置', '', 2, 5, 2524, 'contract-config', 'ep:connection', 'crm/contract/config/index', 'CrmContractConfig', 0, '1', '1', '1', '1', '2024-02-24 16:44:40', '1', '2024-02-24 16:44:48', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2709, '客户公海配置查询', 'crm:customer-pool-config:query', 3, 2, 2516, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:19', '1', '2024-02-24 16:45:28', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2710, '合同配置更新', 'crm:contract-config:update', 3, 1, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:45:56', '1', '2024-02-24 16:45:56', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2711, '合同配置查询', 'crm:contract-config:query', 3, 2, 2708, '', '', '', '', 0, '1', '1', '1', '1', '2024-02-24 16:46:16', '1', '2024-02-24 16:46:16', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2712, '客户分析', 'crm:statistics-customer:query', 2, 0, 2560, 'customer', 'ep:avatar', 'views/crm/statistics/customer/index.vue', 'CrmStatisticsCustomer', 0, '1', '1', '1', '1', '2024-03-09 16:43:56', '1', '2024-04-24 19:42:52', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2713, '抄送我的', 'bpm:process-instance-cc:query', 2, 30, 1200, 'copy', 'ep:copy-document', 'bpm/task/copy/index', 'BpmProcessInstanceCopy', 0, '1', '1', '1', '1', '2024-03-17 21:50:23', '1', '2024-04-24 19:55:12', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2714, '流程分类', '', 2, 3, 1186, 'category', 'fa:object-ungroup', 'bpm/category/index', 'BpmCategory', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-21 23:51:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2715, '分类查询', 'bpm:category:query', 3, 1, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2716, '分类创建', 'bpm:category:create', 3, 2, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:31', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2717, '分类更新', 'bpm:category:update', 3, 3, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2718, '分类删除', 'bpm:category:delete', 3, 4, 2714, '', '', '', '', 0, '1', '1', '1', '', '2024-03-08 02:00:51', '1', '2024-03-19 14:36:41', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2720, '发起流程', '', 2, 0, 1200, 'create', 'fa-solid:grin-stars', 'bpm/processInstance/create/index', 'BpmProcessInstanceCreate', 0, '1', '0', '1', '1', '2024-03-19 19:46:05', '1', '2024-03-23 19:03:42', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2721, '流程实例', '', 2, 10, 1186, 'process-instance/manager', 'fa:square', 'bpm/processInstance/manager/index', 'BpmProcessInstanceManager', 0, '1', '1', '1', '1', '2024-03-21 23:57:30', '1', '2024-03-21 23:57:30', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2722, '流程实例的查询(管理员)', 'bpm:process-instance:manager-query', 3, 1, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:18:27', '1', '2024-03-22 08:19:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2723, '流程实例的取消(管理员)', 'bpm:process-instance:cancel-by-admin', 3, 2, 2721, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:19:25', '1', '2024-03-22 08:19:25', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2724, '流程任务', '', 2, 11, 1186, 'process-tasnk', 'ep:collection-tag', 'bpm/task/manager/index', 'BpmManagerTask', 0, '1', '1', '1', '1', '2024-03-22 08:43:22', '1', '2024-03-22 08:43:27', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2725, '流程任务的查询(管理员)', 'bpm:task:mananger-query', 3, 1, 2724, '', '', '', '', 0, '1', '1', '1', '1', '2024-03-22 08:43:49', '1', '2024-03-22 08:43:49', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2726, '流程监听器', '', 2, 5, 1186, 'process-listener', 'fa:assistive-listening-systems', 'bpm/processListener/index', 'BpmProcessListener', 0, '1', '1', '1', '', '2024-03-09 16:05:34', '1', '2024-03-23 13:13:38', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2727, '流程监听器查询', 'bpm:process-listener:query', 3, 1, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2728, '流程监听器创建', 'bpm:process-listener:create', 3, 2, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2729, '流程监听器更新', 'bpm:process-listener:update', 3, 3, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2730, '流程监听器删除', 'bpm:process-listener:delete', 3, 4, 2726, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 16:05:34', '', '2024-03-09 16:05:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2731, '流程表达式', '', 2, 6, 1186, 'process-expression', 'fa:wpexplorer', 'bpm/processExpression/index', 'BpmProcessExpression', 0, '1', '1', '1', '', '2024-03-09 22:35:08', '1', '2024-03-23 19:43:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2732, '流程表达式查询', 'bpm:process-expression:query', 3, 1, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2733, '流程表达式创建', 'bpm:process-expression:create', 3, 2, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2734, '流程表达式更新', 'bpm:process-expression:update', 3, 3, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2735, '流程表达式删除', 'bpm:process-expression:delete', 3, 4, 2731, '', '', '', NULL, 0, '1', '1', '1', '', '2024-03-09 22:35:08', '', '2024-03-09 22:35:08', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2736, '员工业绩', 'crm:statistics-performance:query', 2, 3, 2560, 'performance', 'ep:dish-dot', 'crm/statistics/performance/index', 'CrmStatisticsPerformance', 0, '1', '1', '1', '1', '2024-04-05 13:49:20', '1', '2024-04-24 19:42:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2737, '客户画像', 'crm:statistics-portrait:query', 2, 4, 2560, 'portrait', 'ep:picture', 'crm/statistics/portrait/index', 'CrmStatisticsPortrait', 0, '1', '1', '1', '1', '2024-04-05 13:57:40', '1', '2024-04-24 19:42:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2738, '销售漏斗', 'crm:statistics-funnel:query', 2, 5, 2560, 'funnel', 'ep:grape', 'crm/statistics/funnel/index', 'CrmStatisticsFunnel', 0, '1', '1', '1', '1', '2024-04-13 10:53:26', '1', '2024-04-24 19:39:33', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2739, '消息中心', '', 1, 7, 1, 'messages', 'ep:chat-dot-round', '', '', 0, '1', '1', '1', '1', '2024-04-22 23:54:30', '1', '2024-04-23 09:36:35', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2740, '监控中心', '', 1, 10, 2, 'monitors', 'ep:monitor', '', '', 0, '1', '1', '1', '1', '2024-04-23 00:04:44', '1', '2024-04-23 00:04:44', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2741, '领取公海客户', 'crm:customer:receive', 3, 1, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:47:45', '1', '2024-04-24 19:47:45', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2742, '分配公海客户', 'crm:customer:distribute', 3, 2, 2546, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:48:05', '1', '2024-04-24 19:48:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2743, '商品统计查询', 'statistics:product:query', 3, 1, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:05', '1', '2024-04-24 19:50:05', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2744, '商品统计导出', 'statistics:product:export', 3, 2, 2545, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:50:26', '1', '2024-04-24 19:50:26', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2745, '支付渠道查询', 'pay:channel:query', 3, 10, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:01', '1', '2024-04-24 19:53:01', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2746, '支付渠道创建', 'pay:channel:create', 3, 11, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:18', '1', '2024-04-24 19:53:18', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2747, '支付渠道更新', 'pay:channel:update', 3, 12, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:53:32', '1', '2024-04-24 19:53:58', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2748, '支付渠道删除', 'pay:channel:delete', 3, 13, 1126, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:54:34', '1', '2024-04-24 19:54:34', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2749, '商品收藏查询', 'product:favorite:query', 3, 10, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:55:47', '1', '2024-04-24 19:55:47', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2750, '商品浏览查询', 'product:browse-history:query', 3, 20, 2014, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:57:43', '1', '2024-04-24 19:57:43', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2751, '售后同意', 'trade:after-sale:agree', 3, 2, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:58:40', '1', '2024-04-24 19:58:40', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2752, '售后不同意', 'trade:after-sale:disagree', 3, 3, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 19:59:03', '1', '2024-04-24 19:59:03', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2753, '售后确认退货', 'trade:after-sale:receive', 3, 4, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:07', '1', '2024-04-24 20:00:07', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2754, '售后确认退款', 'trade:after-sale:refund', 3, 5, 2073, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:00:24', '1', '2024-04-24 20:00:24', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2755, '删除项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:01:37', '1', '2024-04-24 20:01:37', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2756, '会员等级记录查询', 'member:level-record:query', 3, 10, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:32', '1', '2024-04-24 20:02:32', '0'); +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2757, '会员经验记录查询', 'member:experience-record:query', 3, 11, 2325, '', '', '', '', 0, '1', '1', '1', '1', '2024-04-24 20:02:51', '1', '2024-04-24 20:02:51', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_menu_seq; +CREATE SEQUENCE system_menu_seq + START 2758; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS system_notice; +CREATE TABLE system_notice +( + id int8 NOT NULL, + title varchar(50) NOT NULL, + content text NOT NULL, + type int2 NOT NULL, + status int2 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notice + ADD CONSTRAINT pk_system_notice PRIMARY KEY (id); + +COMMENT ON COLUMN system_notice.id IS '公告ID'; +COMMENT ON COLUMN system_notice.title IS '公告标题'; +COMMENT ON COLUMN system_notice.content IS '公告内容'; +COMMENT ON COLUMN system_notice.type IS '公告类型(1通知 2公告)'; +COMMENT ON COLUMN system_notice.status IS '公告状态(0正常 1关闭)'; +COMMENT ON COLUMN system_notice.creator IS '创建者'; +COMMENT ON COLUMN system_notice.create_time IS '创建时间'; +COMMENT ON COLUMN system_notice.updater IS '更新者'; +COMMENT ON COLUMN system_notice.update_time IS '更新时间'; +COMMENT ON COLUMN system_notice.deleted IS '是否删除'; +COMMENT ON COLUMN system_notice.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notice IS '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '芋道的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '维护通知:2018-07-01 系统凌晨维护', '

11112222

', 2, 1, 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 20:07:26', '0', 1); +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', '0', 121); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_notice_seq; +CREATE SEQUENCE system_notice_seq + START 5; + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_message; +CREATE TABLE system_notify_message +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + template_id int8 NOT NULL, + template_code varchar(64) NOT NULL, + template_nickname varchar(63) NOT NULL, + template_content varchar(1024) NOT NULL, + template_type int4 NOT NULL, + template_params varchar(255) NOT NULL, + read_status bool NOT NULL, + read_time timestamp NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notify_message + ADD CONSTRAINT pk_system_notify_message PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_message.id IS '用户ID'; +COMMENT ON COLUMN system_notify_message.user_id IS '用户id'; +COMMENT ON COLUMN system_notify_message.user_type IS '用户类型'; +COMMENT ON COLUMN system_notify_message.template_id IS '模版编号'; +COMMENT ON COLUMN system_notify_message.template_code IS '模板编码'; +COMMENT ON COLUMN system_notify_message.template_nickname IS '模版发送人名称'; +COMMENT ON COLUMN system_notify_message.template_content IS '模版内容'; +COMMENT ON COLUMN system_notify_message.template_type IS '模版类型'; +COMMENT ON COLUMN system_notify_message.template_params IS '模版参数'; +COMMENT ON COLUMN system_notify_message.read_status IS '是否已读'; +COMMENT ON COLUMN system_notify_message.read_time IS '阅读时间'; +COMMENT ON COLUMN system_notify_message.creator IS '创建者'; +COMMENT ON COLUMN system_notify_message.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_message.updater IS '更新者'; +COMMENT ON COLUMN system_notify_message.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_message.deleted IS '是否删除'; +COMMENT ON COLUMN system_notify_message.tenant_id IS '租户编号'; +COMMENT ON TABLE system_notify_message IS '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:44:08', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 1, 2, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{"name":"1","what":"2"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 11:45:04', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 103, 2, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{"name":"哈哈"}', '0', NULL, '1', '2023-01-28 21:02:20', '1', '2023-01-28 21:02:20', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-02-10 00:47:04', '1', '2023-01-28 22:21:42', '1', '2023-02-10 00:47:04', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 1, 2, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{"name":"芋艿","what":"写代码"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 22:22:07', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 1, 2, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{"name":"2","what":"3"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:45:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 1, 2, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{"name":"123"}', '1', '2023-01-29 10:52:06', '1', '2023-01-28 23:50:21', '1', '2023-01-29 10:52:06', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-28 08:35:46","price":"0.09"}', '0', NULL, '1', '2023-09-28 16:36:22', '1', '2023-09-28 16:36:22', '0', 1); +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 247, 1, 4, 'brokerage_withdraw_audit_approve', 'system', '您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, '{"reason":null,"createTime":"2023-09-30 20:59:40","price":"1.00"}', '0', NULL, '1', '2023-10-03 12:11:34', '1', '2023-10-03 12:11:34', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_notify_message_seq; +CREATE SEQUENCE system_notify_message_seq + START 11; + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_template; +CREATE TABLE system_notify_template +( + id int8 NOT NULL, + name varchar(63) NOT NULL, + code varchar(64) NOT NULL, + nickname varchar(255) NOT NULL, + content varchar(1024) NOT NULL, + type int2 NOT NULL, + params varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_notify_template + ADD CONSTRAINT pk_system_notify_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_notify_template.id IS '主键'; +COMMENT ON COLUMN system_notify_template.name IS '模板名称'; +COMMENT ON COLUMN system_notify_template.code IS '模版编码'; +COMMENT ON COLUMN system_notify_template.nickname IS '发送人名称'; +COMMENT ON COLUMN system_notify_template.content IS '模版内容'; +COMMENT ON COLUMN system_notify_template.type IS '类型'; +COMMENT ON COLUMN system_notify_template.params IS '参数数组'; +COMMENT ON COLUMN system_notify_template.status IS '状态'; +COMMENT ON COLUMN system_notify_template.remark IS '备注'; +COMMENT ON COLUMN system_notify_template.creator IS '创建者'; +COMMENT ON COLUMN system_notify_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_notify_template.updater IS '更新者'; +COMMENT ON COLUMN system_notify_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_notify_template.deleted IS '是否删除'; +COMMENT ON TABLE system_notify_template IS '站内信模板表'; + +DROP SEQUENCE IF EXISTS system_notify_template_seq; +CREATE SEQUENCE system_notify_template_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_access_token; +CREATE TABLE system_oauth2_access_token +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + user_info varchar(512) NOT NULL, + access_token varchar(255) NOT NULL, + refresh_token varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_access_token + ADD CONSTRAINT pk_system_oauth2_access_token PRIMARY KEY (id); + +CREATE INDEX idx_system_oauth2_access_token_01 ON system_oauth2_access_token (access_token); +CREATE INDEX idx_system_oauth2_access_token_02 ON system_oauth2_access_token (refresh_token); + +COMMENT ON COLUMN system_oauth2_access_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_access_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_access_token.user_info IS '用户信息'; +COMMENT ON COLUMN system_oauth2_access_token.access_token IS '访问令牌'; +COMMENT ON COLUMN system_oauth2_access_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_access_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_access_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_access_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_access_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_access_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_access_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_access_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_access_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_access_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_access_token IS 'OAuth2 访问令牌'; + +DROP SEQUENCE IF EXISTS system_oauth2_access_token_seq; +CREATE SEQUENCE system_oauth2_access_token_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_approve; +CREATE TABLE system_oauth2_approve +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + scope varchar(255) NOT NULL DEFAULT '', + approved bool NOT NULL DEFAULT '0', + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_approve + ADD CONSTRAINT pk_system_oauth2_approve PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_approve.id IS '编号'; +COMMENT ON COLUMN system_oauth2_approve.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_approve.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_approve.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_approve.scope IS '授权范围'; +COMMENT ON COLUMN system_oauth2_approve.approved IS '是否接受'; +COMMENT ON COLUMN system_oauth2_approve.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_approve.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_approve.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_approve.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_approve.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_approve.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_approve.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_approve IS 'OAuth2 批准表'; + +DROP SEQUENCE IF EXISTS system_oauth2_approve_seq; +CREATE SEQUENCE system_oauth2_approve_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_client; +CREATE TABLE system_oauth2_client +( + id int8 NOT NULL, + client_id varchar(255) NOT NULL, + secret varchar(255) NOT NULL, + name varchar(255) NOT NULL, + logo varchar(255) NOT NULL, + description varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + access_token_validity_seconds int4 NOT NULL, + refresh_token_validity_seconds int4 NOT NULL, + redirect_uris varchar(255) NOT NULL, + authorized_grant_types varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + auto_approve_scopes varchar(255) NULL DEFAULT NULL, + authorities varchar(255) NULL DEFAULT NULL, + resource_ids varchar(255) NULL DEFAULT NULL, + additional_information varchar(4096) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_client + ADD CONSTRAINT pk_system_oauth2_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_client.id IS '编号'; +COMMENT ON COLUMN system_oauth2_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_client.secret IS '客户端密钥'; +COMMENT ON COLUMN system_oauth2_client.name IS '应用名'; +COMMENT ON COLUMN system_oauth2_client.logo IS '应用图标'; +COMMENT ON COLUMN system_oauth2_client.description IS '应用描述'; +COMMENT ON COLUMN system_oauth2_client.status IS '状态'; +COMMENT ON COLUMN system_oauth2_client.access_token_validity_seconds IS '访问令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.refresh_token_validity_seconds IS '刷新令牌的有效期'; +COMMENT ON COLUMN system_oauth2_client.redirect_uris IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_client.authorized_grant_types IS '授权类型'; +COMMENT ON COLUMN system_oauth2_client.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_client.auto_approve_scopes IS '自动通过的授权范围'; +COMMENT ON COLUMN system_oauth2_client.authorities IS '权限'; +COMMENT ON COLUMN system_oauth2_client.resource_ids IS '资源'; +COMMENT ON COLUMN system_oauth2_client.additional_information IS '附加信息'; +COMMENT ON COLUMN system_oauth2_client.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_client.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_client.deleted IS '是否删除'; +COMMENT ON TABLE system_oauth2_client IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 2592000, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', '[]', '["user.read","user.write"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2024-02-22 16:31:52', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', '啦啦啦啦', 0, 1800, 43200, '["https://www.iocoder.cn"]', '["password","authorization_code","implicit"]', '["user_info","projects"]', '["user_info"]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2023-12-02 21:01:01', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["authorization_code","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-09-29 13:28:31', '1', '2022-09-29 13:28:31', '0'); +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '["http://127.0.0.1:18080"]', '["password","refresh_token"]', '["user.read","user.write"]', '[]', '[]', '[]', NULL, '1', '2022-10-04 17:40:16', '1', '2022-10-04 20:31:21', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_oauth2_client_seq; +CREATE SEQUENCE system_oauth2_client_seq + START 43; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_code; +CREATE TABLE system_oauth2_code +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + code varchar(32) NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT '', + expires_time timestamp NOT NULL, + redirect_uri varchar(255) NULL DEFAULT NULL, + state varchar(255) NOT NULL DEFAULT '', + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_code + ADD CONSTRAINT pk_system_oauth2_code PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_code.id IS '编号'; +COMMENT ON COLUMN system_oauth2_code.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_code.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_code.code IS '授权码'; +COMMENT ON COLUMN system_oauth2_code.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_code.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_code.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_code.redirect_uri IS '可重定向的 URI 地址'; +COMMENT ON COLUMN system_oauth2_code.state IS '状态'; +COMMENT ON COLUMN system_oauth2_code.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_code.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_code IS 'OAuth2 授权码表'; + +DROP SEQUENCE IF EXISTS system_oauth2_code_seq; +CREATE SEQUENCE system_oauth2_code_seq + START 1; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_refresh_token; +CREATE TABLE system_oauth2_refresh_token +( + id int8 NOT NULL, + user_id int8 NOT NULL, + refresh_token varchar(32) NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + scopes varchar(255) NULL DEFAULT NULL, + expires_time timestamp NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_oauth2_refresh_token + ADD CONSTRAINT pk_system_oauth2_refresh_token PRIMARY KEY (id); + +COMMENT ON COLUMN system_oauth2_refresh_token.id IS '编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_id IS '用户编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN system_oauth2_refresh_token.user_type IS '用户类型'; +COMMENT ON COLUMN system_oauth2_refresh_token.client_id IS '客户端编号'; +COMMENT ON COLUMN system_oauth2_refresh_token.scopes IS '授权范围'; +COMMENT ON COLUMN system_oauth2_refresh_token.expires_time IS '过期时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.creator IS '创建者'; +COMMENT ON COLUMN system_oauth2_refresh_token.create_time IS '创建时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.updater IS '更新者'; +COMMENT ON COLUMN system_oauth2_refresh_token.update_time IS '更新时间'; +COMMENT ON COLUMN system_oauth2_refresh_token.deleted IS '是否删除'; +COMMENT ON COLUMN system_oauth2_refresh_token.tenant_id IS '租户编号'; +COMMENT ON TABLE system_oauth2_refresh_token IS 'OAuth2 刷新令牌'; + +DROP SEQUENCE IF EXISTS system_oauth2_refresh_token_seq; +CREATE SEQUENCE system_oauth2_refresh_token_seq + START 1; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS system_operate_log; +CREATE TABLE system_operate_log +( + id int8 NOT NULL, + trace_id varchar(64) NOT NULL DEFAULT '', + user_id int8 NOT NULL, + user_type int2 NOT NULL DEFAULT 0, + type varchar(50) NOT NULL, + sub_type varchar(50) NOT NULL, + biz_id int8 NOT NULL, + action varchar(2000) NOT NULL DEFAULT '', + extra varchar(2000) NOT NULL DEFAULT '', + request_method varchar(16) NULL DEFAULT '', + request_url varchar(255) NULL DEFAULT '', + user_ip varchar(50) NULL DEFAULT NULL, + user_agent varchar(200) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_operate_log + ADD CONSTRAINT pk_system_operate_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_operate_log.id IS '日志主键'; +COMMENT ON COLUMN system_operate_log.trace_id IS '链路追踪编号'; +COMMENT ON COLUMN system_operate_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_operate_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_operate_log.type IS '操作模块类型'; +COMMENT ON COLUMN system_operate_log.sub_type IS '操作名'; +COMMENT ON COLUMN system_operate_log.biz_id IS '操作数据模块编号'; +COMMENT ON COLUMN system_operate_log.action IS '操作内容'; +COMMENT ON COLUMN system_operate_log.extra IS '拓展字段'; +COMMENT ON COLUMN system_operate_log.request_method IS '请求方法名'; +COMMENT ON COLUMN system_operate_log.request_url IS '请求地址'; +COMMENT ON COLUMN system_operate_log.user_ip IS '用户 IP'; +COMMENT ON COLUMN system_operate_log.user_agent IS '浏览器 UA'; +COMMENT ON COLUMN system_operate_log.creator IS '创建者'; +COMMENT ON COLUMN system_operate_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_operate_log.updater IS '更新者'; +COMMENT ON COLUMN system_operate_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_operate_log.deleted IS '是否删除'; +COMMENT ON COLUMN system_operate_log.tenant_id IS '租户编号'; +COMMENT ON TABLE system_operate_log IS '操作日志记录 V2 版本'; + +DROP SEQUENCE IF EXISTS system_operate_log_seq; +CREATE SEQUENCE system_operate_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS system_post; +CREATE TABLE system_post +( + id int8 NOT NULL, + code varchar(64) NOT NULL, + name varchar(50) NOT NULL, + sort int4 NOT NULL, + status int2 NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_post + ADD CONSTRAINT pk_system_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_post.id IS '岗位ID'; +COMMENT ON COLUMN system_post.code IS '岗位编码'; +COMMENT ON COLUMN system_post.name IS '岗位名称'; +COMMENT ON COLUMN system_post.sort IS '显示顺序'; +COMMENT ON COLUMN system_post.status IS '状态(0正常 1停用)'; +COMMENT ON COLUMN system_post.remark IS '备注'; +COMMENT ON COLUMN system_post.creator IS '创建者'; +COMMENT ON COLUMN system_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_post.updater IS '更新者'; +COMMENT ON COLUMN system_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_post IS '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2023-02-11 15:19:04', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2023-11-15 09:18:20', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2023-12-02 10:04:37', '0', 1); +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 'HR', '人力资源', 5, 0, '', '1', '2024-03-24 20:45:40', '1', '2024-03-24 20:45:40', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_post_seq; +CREATE SEQUENCE system_post_seq + START 6; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS system_role; +CREATE TABLE system_role +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + code varchar(100) NOT NULL, + sort int4 NOT NULL, + data_scope int2 NOT NULL DEFAULT 1, + data_scope_dept_ids varchar(500) NOT NULL DEFAULT '', + status int2 NOT NULL, + type int2 NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_role + ADD CONSTRAINT pk_system_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_role.id IS '角色ID'; +COMMENT ON COLUMN system_role.name IS '角色名称'; +COMMENT ON COLUMN system_role.code IS '角色权限字符串'; +COMMENT ON COLUMN system_role.sort IS '显示顺序'; +COMMENT ON COLUMN system_role.data_scope IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT ON COLUMN system_role.data_scope_dept_ids IS '数据范围(指定部门数组)'; +COMMENT ON COLUMN system_role.status IS '角色状态(0正常 1停用)'; +COMMENT ON COLUMN system_role.type IS '角色类型'; +COMMENT ON COLUMN system_role.remark IS '备注'; +COMMENT ON COLUMN system_role.creator IS '创建者'; +COMMENT ON COLUMN system_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_role.updater IS '更新者'; +COMMENT ON COLUMN system_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role IS '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 'CRM 管理员', 'crm_admin', 2, 1, '', 0, 1, 'CRM 专属角色', '1', '2024-02-24 10:51:13', '1', '2024-02-24 02:51:32', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '我想测试', '', '2021-01-06 13:49:35', '1', '2024-03-24 22:22:45', '0', 1); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_role_seq; +CREATE SEQUENCE system_role_seq + START 112; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_role_menu; +CREATE TABLE system_role_menu +( + id int8 NOT NULL, + role_id int8 NOT NULL, + menu_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_role_menu + ADD CONSTRAINT pk_system_role_menu PRIMARY KEY (id); + +COMMENT ON COLUMN system_role_menu.id IS '自增编号'; +COMMENT ON COLUMN system_role_menu.role_id IS '角色ID'; +COMMENT ON COLUMN system_role_menu.menu_id IS '菜单ID'; +COMMENT ON COLUMN system_role_menu.creator IS '创建者'; +COMMENT ON COLUMN system_role_menu.create_time IS '创建时间'; +COMMENT ON COLUMN system_role_menu.updater IS '更新者'; +COMMENT ON COLUMN system_role_menu.update_time IS '更新时间'; +COMMENT ON COLUMN system_role_menu.deleted IS '是否删除'; +COMMENT ON COLUMN system_role_menu.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role_menu IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1626, 101, 1196, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1729, 109, 100, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1730, 109, 101, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1731, 109, 1063, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1732, 109, 1064, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1733, 109, 1001, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1734, 109, 1065, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1735, 109, 1002, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1736, 109, 1003, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1737, 109, 1004, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1738, 109, 1005, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1739, 109, 1006, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1740, 109, 1007, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1741, 109, 1008, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1742, 109, 1009, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1743, 109, 1010, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1744, 109, 1011, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1745, 109, 1012, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1746, 111, 100, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1747, 111, 101, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1748, 111, 1063, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1749, 111, 1064, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1750, 111, 1001, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1751, 111, 1065, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1752, 111, 1002, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1753, 111, 1003, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1754, 111, 1004, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1755, 111, 1005, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1756, 111, 1006, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1757, 111, 1007, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1758, 111, 1008, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1759, 111, 1009, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1760, 111, 1010, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1761, 111, 1011, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1762, 111, 1012, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1763, 109, 100, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1764, 109, 101, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1765, 109, 1063, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1766, 109, 1064, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1767, 109, 1001, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1768, 109, 1065, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1769, 109, 1002, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1770, 109, 1003, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1771, 109, 1004, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1772, 109, 1005, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1773, 109, 1006, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1774, 109, 1007, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1775, 109, 1008, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1776, 109, 1009, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1777, 109, 1010, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1778, 109, 1011, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1779, 109, 1012, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1780, 111, 100, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1781, 111, 101, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1782, 111, 1063, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1783, 111, 1064, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1784, 111, 1001, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1785, 111, 1065, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1786, 111, 1002, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1787, 111, 1003, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1788, 111, 1004, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1789, 111, 1005, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1790, 111, 1006, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1791, 111, 1007, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1792, 111, 1008, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1793, 111, 1009, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1794, 111, 1010, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1795, 111, 1011, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1796, 111, 1012, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1797, 109, 100, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1798, 109, 101, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1799, 109, 1063, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1800, 109, 1064, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1801, 109, 1001, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1802, 109, 1065, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1803, 109, 1002, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1804, 109, 1003, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1805, 109, 1004, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1806, 109, 1005, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1807, 109, 1006, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1808, 109, 1007, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1809, 109, 1008, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1810, 109, 1009, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1811, 109, 1010, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1812, 109, 1011, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1813, 109, 1012, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1814, 111, 100, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1815, 111, 101, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1816, 111, 1063, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1817, 111, 1064, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1818, 111, 1001, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1819, 111, 1065, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1820, 111, 1002, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1821, 111, 1003, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1822, 111, 1004, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1823, 111, 1005, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1824, 111, 1006, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1825, 111, 1007, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1826, 111, 1008, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1827, 111, 1009, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1828, 111, 1010, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1829, 111, 1011, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1830, 111, 1012, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1831, 109, 103, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1832, 109, 1017, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1833, 109, 1018, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1834, 109, 1019, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1835, 109, 1020, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1836, 111, 103, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1837, 111, 1017, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1838, 111, 1018, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1839, 111, 1019, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1840, 111, 1020, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1841, 109, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1842, 109, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1843, 109, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1844, 109, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1845, 109, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1846, 111, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1847, 111, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1848, 111, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1849, 111, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1850, 111, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2003, 2, 1036, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2004, 2, 1037, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2005, 2, 1038, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2006, 2, 1039, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2013, 2, 1050, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2014, 2, 1051, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2015, 2, 1052, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2016, 2, 1053, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2017, 2, 1054, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2018, 2, 1056, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2019, 2, 1057, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2020, 2, 1058, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2022, 2, 1059, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2023, 2, 1060, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2034, 2, 1075, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2039, 2, 1087, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2044, 2, 1095, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2045, 2, 1096, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2046, 2, 1097, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2047, 2, 1098, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2048, 2, 1101, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2049, 2, 1102, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2050, 2, 1103, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2051, 2, 1104, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2052, 2, 1105, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2053, 2, 1106, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2054, 2, 1108, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2055, 2, 1109, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2061, 2, 1127, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2069, 2, 1135, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2070, 2, 1136, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2071, 2, 1137, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2073, 2, 1139, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2074, 2, 115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2075, 2, 1140, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2077, 2, 1141, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2078, 2, 1142, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2079, 2, 1143, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2080, 2, 1150, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2081, 2, 1161, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2082, 2, 1162, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2083, 2, 1163, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2084, 2, 1164, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2085, 2, 1165, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2086, 2, 1166, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2087, 2, 1173, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2088, 2, 1174, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2089, 2, 1175, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2102, 2, 1229, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2116, 2, 1254, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2117, 2, 1255, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2118, 2, 1256, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2119, 2, 1257, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2120, 2, 1258, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2121, 2, 1259, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2122, 2, 1260, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2142, 2, 1014, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2144, 2, 1016, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2152, 2, 1281, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2153, 2, 1282, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2154, 2, 2000, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2155, 2, 2002, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2156, 2, 2003, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2157, 2, 2004, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2158, 2, 2005, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2159, 2, 2006, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2160, 2, 2008, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2161, 2, 2009, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2162, 2, 2010, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2163, 2, 2011, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2164, 2, 2012, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2170, 2, 2019, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2171, 2, 2020, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2172, 2, 2021, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2173, 2, 2022, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2174, 2, 2023, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2175, 2, 2025, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2177, 2, 2027, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2178, 2, 2028, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2179, 2, 2029, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2180, 2, 2014, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2181, 2, 2015, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2182, 2, 2016, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2183, 2, 2017, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2184, 2, 2018, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2188, 101, 1024, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2189, 101, 1, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2190, 101, 1025, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2191, 101, 1026, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2192, 101, 1027, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2193, 101, 1028, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2194, 101, 1029, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2195, 101, 1030, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2196, 101, 1036, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2197, 101, 1037, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2198, 101, 1038, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2199, 101, 1039, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2200, 101, 1040, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2201, 101, 1042, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2202, 101, 1043, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2203, 101, 1045, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2204, 101, 1046, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2205, 101, 1048, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2206, 101, 2083, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2207, 101, 1063, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2208, 101, 1064, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2209, 101, 1065, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2210, 101, 1093, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2211, 101, 1094, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2212, 101, 1095, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2213, 101, 1096, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2214, 101, 1097, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2215, 101, 1098, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2216, 101, 1100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2217, 101, 1101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2218, 101, 1102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2219, 101, 1103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2220, 101, 1104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2221, 101, 1105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2222, 101, 1106, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2223, 101, 2130, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2224, 101, 1107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2225, 101, 2131, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2226, 101, 1108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2227, 101, 2132, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2228, 101, 1109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2229, 101, 2133, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2230, 101, 2134, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2232, 101, 2135, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2234, 101, 2136, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2236, 101, 2137, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2238, 101, 2138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2240, 101, 2139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2242, 101, 2140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2243, 101, 2141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2244, 101, 2142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2245, 101, 2143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2246, 101, 2144, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2247, 101, 2145, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2248, 101, 2146, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2249, 101, 2147, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2250, 101, 100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2251, 101, 2148, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2252, 101, 101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2253, 101, 2149, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2254, 101, 102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2255, 101, 2150, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2256, 101, 103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2257, 101, 2151, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2258, 101, 104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2259, 101, 2152, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2260, 101, 105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2261, 101, 107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2262, 101, 108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2263, 101, 109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2264, 101, 1138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2265, 101, 1139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2266, 101, 1140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2267, 101, 1141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2268, 101, 1142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2269, 101, 1143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2270, 101, 1224, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2271, 101, 1225, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2272, 101, 1226, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2273, 101, 1227, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2274, 101, 1228, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2275, 101, 1229, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2282, 101, 1261, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2283, 101, 1263, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2284, 101, 1264, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2285, 101, 1265, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2286, 101, 1266, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2287, 101, 1267, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2288, 101, 1001, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2289, 101, 1002, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2290, 101, 1003, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2291, 101, 1004, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2292, 101, 1005, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2293, 101, 1006, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2294, 101, 1007, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2295, 101, 1008, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2296, 101, 1009, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2297, 101, 1010, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2298, 101, 1011, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2299, 101, 1012, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2300, 101, 500, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2301, 101, 1013, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2302, 101, 501, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2303, 101, 1014, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2304, 101, 1015, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2305, 101, 1016, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2306, 101, 1017, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2307, 101, 1018, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2308, 101, 1019, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2309, 101, 1020, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2310, 101, 1021, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2311, 101, 1022, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2312, 101, 1023, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2929, 109, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2930, 109, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2931, 109, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2932, 109, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2933, 109, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2934, 109, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2935, 109, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2936, 109, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2937, 109, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2938, 109, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2939, 109, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2940, 109, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2941, 111, 1224, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2942, 111, 1225, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2943, 111, 1226, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2944, 111, 1227, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2945, 111, 1228, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2946, 111, 1229, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2947, 111, 1138, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2948, 111, 1139, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2949, 111, 1140, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2950, 111, 1141, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2951, 111, 1142, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2952, 111, 1143, '1', '2023-12-02 23:19:40', '1', '2023-12-02 23:19:40', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2993, 109, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2994, 109, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2995, 109, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2996, 109, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2997, 109, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2998, 109, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2999, 109, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3000, 109, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3001, 109, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3002, 109, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3003, 109, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3004, 109, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3005, 109, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3006, 109, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3007, 109, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3008, 109, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3009, 109, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3010, 109, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3011, 109, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3012, 109, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3013, 109, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3014, 109, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3015, 109, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3016, 109, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3017, 109, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3018, 109, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3019, 109, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3020, 109, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3021, 109, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3022, 109, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3023, 109, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3024, 109, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3025, 109, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3026, 109, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3027, 109, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3028, 109, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3029, 109, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3030, 109, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3031, 109, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3032, 109, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3033, 109, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3034, 109, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3035, 109, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3036, 109, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3037, 109, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3038, 109, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3039, 109, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3040, 109, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3041, 109, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3042, 109, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3043, 109, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3044, 109, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3045, 109, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3046, 109, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3047, 109, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3048, 109, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3049, 109, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3050, 109, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3051, 109, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3052, 109, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3053, 109, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3054, 109, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3055, 109, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3056, 109, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3057, 109, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3058, 109, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3059, 109, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3060, 109, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3061, 109, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3062, 109, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3063, 109, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3064, 109, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3065, 109, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3066, 109, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3067, 109, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3068, 109, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3069, 111, 2, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3070, 111, 1031, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3071, 111, 1032, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3072, 111, 1033, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3073, 111, 1034, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3074, 111, 1035, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3075, 111, 1050, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3076, 111, 1051, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3077, 111, 1052, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3078, 111, 1053, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3079, 111, 1054, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3080, 111, 1056, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3081, 111, 1057, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3082, 111, 1058, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3083, 111, 1059, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3084, 111, 1060, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3085, 111, 1066, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3086, 111, 1067, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3087, 111, 1070, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3088, 111, 1075, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3089, 111, 1076, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3090, 111, 1077, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3091, 111, 1078, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3092, 111, 1082, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3093, 111, 1083, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3094, 111, 1084, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3095, 111, 1085, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3096, 111, 1086, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3097, 111, 1087, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3098, 111, 1088, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3099, 111, 1089, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3100, 111, 1090, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3101, 111, 1091, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3102, 111, 1092, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3103, 111, 106, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3104, 111, 110, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3105, 111, 111, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3106, 111, 112, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3107, 111, 113, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3108, 111, 114, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3109, 111, 115, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3110, 111, 116, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3111, 111, 2472, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3112, 111, 2478, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3113, 111, 2479, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3114, 111, 2480, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3115, 111, 2481, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3116, 111, 2482, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3117, 111, 2483, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3118, 111, 2484, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3119, 111, 2485, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3120, 111, 2486, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3121, 111, 2487, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3122, 111, 2488, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3123, 111, 2489, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3124, 111, 2490, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3125, 111, 2491, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3126, 111, 2492, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3127, 111, 2493, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3128, 111, 2494, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3129, 111, 2495, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3130, 111, 2497, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3131, 111, 1237, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3132, 111, 1238, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3133, 111, 1239, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3134, 111, 1240, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3135, 111, 1241, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3136, 111, 1242, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3137, 111, 1243, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3138, 111, 2525, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3139, 111, 1255, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3140, 111, 1256, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3141, 111, 1257, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3142, 111, 1258, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3143, 111, 1259, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3144, 111, 1260, '1', '2023-12-02 23:41:02', '1', '2023-12-02 23:41:02', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3221, 109, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3222, 109, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3223, 109, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3224, 109, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3225, 109, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3226, 111, 102, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3227, 111, 1013, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3228, 111, 1014, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3229, 111, 1015, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3230, 111, 1016, '1', '2023-12-30 11:42:36', '1', '2023-12-30 11:42:36', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4163, 109, 5, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4164, 109, 1118, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4165, 109, 1119, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4166, 109, 1120, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4167, 109, 2713, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4168, 109, 2714, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4169, 109, 2715, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4170, 109, 2716, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4171, 109, 2717, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4172, 109, 2718, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4173, 109, 2720, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4174, 109, 1185, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4175, 109, 2721, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4176, 109, 1186, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4177, 109, 2722, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4178, 109, 1187, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4179, 109, 2723, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4180, 109, 1188, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4181, 109, 2724, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4182, 109, 1189, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4183, 109, 2725, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4184, 109, 1190, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4185, 109, 2726, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4186, 109, 1191, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4187, 109, 2727, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4188, 109, 1192, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4189, 109, 2728, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4190, 109, 1193, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4191, 109, 2729, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4192, 109, 1194, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4193, 109, 2730, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4194, 109, 1195, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4195, 109, 2731, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4196, 109, 1196, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4197, 109, 2732, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4198, 109, 1197, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4199, 109, 2733, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4200, 109, 1198, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4201, 109, 2734, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4202, 109, 1199, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4203, 109, 2735, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4204, 109, 1200, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4205, 109, 1201, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4206, 109, 1202, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4207, 109, 1207, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4208, 109, 1208, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4209, 109, 1209, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4210, 109, 1210, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4211, 109, 1211, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4212, 109, 1212, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4213, 109, 1213, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4214, 109, 1215, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4215, 109, 1216, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4216, 109, 1217, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4217, 109, 1218, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4218, 109, 1219, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4219, 109, 1220, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4220, 109, 1221, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4221, 109, 1222, '1', '2024-03-30 17:53:17', '1', '2024-03-30 17:53:17', '0', 121); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4222, 111, 5, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4223, 111, 1118, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4224, 111, 1119, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4225, 111, 1120, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4226, 111, 2713, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4227, 111, 2714, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4228, 111, 2715, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4229, 111, 2716, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4230, 111, 2717, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4231, 111, 2718, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4232, 111, 2720, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4233, 111, 1185, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4234, 111, 2721, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4235, 111, 1186, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4236, 111, 2722, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4237, 111, 1187, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4238, 111, 2723, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4239, 111, 1188, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4240, 111, 2724, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4241, 111, 1189, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4242, 111, 2725, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4243, 111, 1190, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4244, 111, 2726, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4245, 111, 1191, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4246, 111, 2727, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4247, 111, 1192, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4248, 111, 2728, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4249, 111, 1193, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4250, 111, 2729, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4251, 111, 1194, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4252, 111, 2730, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4253, 111, 1195, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4254, 111, 2731, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4255, 111, 1196, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4256, 111, 2732, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4257, 111, 1197, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4258, 111, 2733, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4259, 111, 1198, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4260, 111, 2734, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4261, 111, 1199, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4262, 111, 2735, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4263, 111, 1200, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4264, 111, 1201, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4265, 111, 1202, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4266, 111, 1207, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4267, 111, 1208, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4268, 111, 1209, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4269, 111, 1210, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4270, 111, 1211, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4271, 111, 1212, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4272, 111, 1213, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4273, 111, 1215, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4274, 111, 1216, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4275, 111, 1217, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4276, 111, 1218, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4277, 111, 1219, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4278, 111, 1220, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4279, 111, 1221, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4280, 111, 1222, '1', '2024-03-30 17:53:18', '1', '2024-03-30 17:53:18', '0', 122); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5777, 101, 2739, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5778, 101, 2740, '1', '2024-04-30 09:38:37', '1', '2024-04-30 09:38:37', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_role_menu_seq; +CREATE SEQUENCE system_role_menu_seq + START 5779; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_channel; +CREATE TABLE system_sms_channel +( + id int8 NOT NULL, + signature varchar(12) NOT NULL, + code varchar(63) NOT NULL, + status int2 NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + api_key varchar(128) NOT NULL, + api_secret varchar(128) NULL DEFAULT NULL, + callback_url varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_channel + ADD CONSTRAINT pk_system_sms_channel PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_channel.id IS '编号'; +COMMENT ON COLUMN system_sms_channel.signature IS '短信签名'; +COMMENT ON COLUMN system_sms_channel.code IS '渠道编码'; +COMMENT ON COLUMN system_sms_channel.status IS '开启状态'; +COMMENT ON COLUMN system_sms_channel.remark IS '备注'; +COMMENT ON COLUMN system_sms_channel.api_key IS '短信 API 的账号'; +COMMENT ON COLUMN system_sms_channel.api_secret IS '短信 API 的秘钥'; +COMMENT ON COLUMN system_sms_channel.callback_url IS '短信发送回调 URL'; +COMMENT ON COLUMN system_sms_channel.creator IS '创建者'; +COMMENT ON COLUMN system_sms_channel.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_channel.updater IS '更新者'; +COMMENT ON COLUMN system_sms_channel.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_channel.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_channel IS '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (2, 'Ballcat', 'ALIYUN', 0, '你要改哦,只有我可以用!!!!', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2023-12-02 22:10:17', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', '0'); +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, '仅测试', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2022-04-10 23:07:59', '1', '2023-12-02 22:10:08', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_sms_channel_seq; +CREATE SEQUENCE system_sms_channel_seq + START 7; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_code; +CREATE TABLE system_sms_code +( + id int8 NOT NULL, + mobile varchar(11) NOT NULL, + code varchar(6) NOT NULL, + create_ip varchar(15) NOT NULL, + scene int2 NOT NULL, + today_index int2 NOT NULL, + used int2 NOT NULL, + used_time timestamp NULL DEFAULT NULL, + used_ip varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_code + ADD CONSTRAINT pk_system_sms_code PRIMARY KEY (id); + +CREATE INDEX idx_system_sms_code_01 ON system_sms_code (mobile); + +COMMENT ON COLUMN system_sms_code.id IS '编号'; +COMMENT ON COLUMN system_sms_code.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_code.code IS '验证码'; +COMMENT ON COLUMN system_sms_code.create_ip IS '创建 IP'; +COMMENT ON COLUMN system_sms_code.scene IS '发送场景'; +COMMENT ON COLUMN system_sms_code.today_index IS '今日发送的第几条'; +COMMENT ON COLUMN system_sms_code.used IS '是否使用'; +COMMENT ON COLUMN system_sms_code.used_time IS '使用时间'; +COMMENT ON COLUMN system_sms_code.used_ip IS '使用 IP'; +COMMENT ON COLUMN system_sms_code.creator IS '创建者'; +COMMENT ON COLUMN system_sms_code.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_code.updater IS '更新者'; +COMMENT ON COLUMN system_sms_code.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_code.deleted IS '是否删除'; +COMMENT ON COLUMN system_sms_code.tenant_id IS '租户编号'; +COMMENT ON TABLE system_sms_code IS '手机验证码'; + +DROP SEQUENCE IF EXISTS system_sms_code_seq; +CREATE SEQUENCE system_sms_code_seq + START 1; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_log; +CREATE TABLE system_sms_log +( + id int8 NOT NULL, + channel_id int8 NOT NULL, + channel_code varchar(63) NOT NULL, + template_id int8 NOT NULL, + template_code varchar(63) NOT NULL, + template_type int2 NOT NULL, + template_content varchar(255) NOT NULL, + template_params varchar(255) NOT NULL, + api_template_id varchar(63) NOT NULL, + mobile varchar(11) NOT NULL, + user_id int8 NULL DEFAULT NULL, + user_type int2 NULL DEFAULT NULL, + send_status int2 NOT NULL DEFAULT 0, + send_time timestamp NULL DEFAULT NULL, + api_send_code varchar(63) NULL DEFAULT NULL, + api_send_msg varchar(255) NULL DEFAULT NULL, + api_request_id varchar(255) NULL DEFAULT NULL, + api_serial_no varchar(255) NULL DEFAULT NULL, + receive_status int2 NOT NULL DEFAULT 0, + receive_time timestamp NULL DEFAULT NULL, + api_receive_code varchar(63) NULL DEFAULT NULL, + api_receive_msg varchar(255) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_log + ADD CONSTRAINT pk_system_sms_log PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_log.id IS '编号'; +COMMENT ON COLUMN system_sms_log.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_log.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_log.template_id IS '模板编号'; +COMMENT ON COLUMN system_sms_log.template_code IS '模板编码'; +COMMENT ON COLUMN system_sms_log.template_type IS '短信类型'; +COMMENT ON COLUMN system_sms_log.template_content IS '短信内容'; +COMMENT ON COLUMN system_sms_log.template_params IS '短信参数'; +COMMENT ON COLUMN system_sms_log.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_log.mobile IS '手机号'; +COMMENT ON COLUMN system_sms_log.user_id IS '用户编号'; +COMMENT ON COLUMN system_sms_log.user_type IS '用户类型'; +COMMENT ON COLUMN system_sms_log.send_status IS '发送状态'; +COMMENT ON COLUMN system_sms_log.send_time IS '发送时间'; +COMMENT ON COLUMN system_sms_log.api_send_code IS '短信 API 发送结果的编码'; +COMMENT ON COLUMN system_sms_log.api_send_msg IS '短信 API 发送失败的提示'; +COMMENT ON COLUMN system_sms_log.api_request_id IS '短信 API 发送返回的唯一请求 ID'; +COMMENT ON COLUMN system_sms_log.api_serial_no IS '短信 API 发送返回的序号'; +COMMENT ON COLUMN system_sms_log.receive_status IS '接收状态'; +COMMENT ON COLUMN system_sms_log.receive_time IS '接收时间'; +COMMENT ON COLUMN system_sms_log.api_receive_code IS 'API 接收结果的编码'; +COMMENT ON COLUMN system_sms_log.api_receive_msg IS 'API 接收结果的说明'; +COMMENT ON COLUMN system_sms_log.creator IS '创建者'; +COMMENT ON COLUMN system_sms_log.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_log.updater IS '更新者'; +COMMENT ON COLUMN system_sms_log.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_log.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_log IS '短信日志'; + +DROP SEQUENCE IF EXISTS system_sms_log_seq; +CREATE SEQUENCE system_sms_log_seq + START 1; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_template; +CREATE TABLE system_sms_template +( + id int8 NOT NULL, + type int2 NOT NULL, + status int2 NOT NULL, + code varchar(63) NOT NULL, + name varchar(63) NOT NULL, + content varchar(255) NOT NULL, + params varchar(255) NOT NULL, + remark varchar(255) NULL DEFAULT NULL, + api_template_id varchar(63) NOT NULL, + channel_id int8 NOT NULL, + channel_code varchar(63) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_sms_template + ADD CONSTRAINT pk_system_sms_template PRIMARY KEY (id); + +COMMENT ON COLUMN system_sms_template.id IS '编号'; +COMMENT ON COLUMN system_sms_template.type IS '模板类型'; +COMMENT ON COLUMN system_sms_template.status IS '开启状态'; +COMMENT ON COLUMN system_sms_template.code IS '模板编码'; +COMMENT ON COLUMN system_sms_template.name IS '模板名称'; +COMMENT ON COLUMN system_sms_template.content IS '模板内容'; +COMMENT ON COLUMN system_sms_template.params IS '参数数组'; +COMMENT ON COLUMN system_sms_template.remark IS '备注'; +COMMENT ON COLUMN system_sms_template.api_template_id IS '短信 API 的模板编号'; +COMMENT ON COLUMN system_sms_template.channel_id IS '短信渠道编号'; +COMMENT ON COLUMN system_sms_template.channel_code IS '短信渠道编码'; +COMMENT ON COLUMN system_sms_template.creator IS '创建者'; +COMMENT ON COLUMN system_sms_template.create_time IS '创建时间'; +COMMENT ON COLUMN system_sms_template.updater IS '更新者'; +COMMENT ON COLUMN system_sms_template.update_time IS '更新时间'; +COMMENT ON COLUMN system_sms_template.deleted IS '是否删除'; +COMMENT ON TABLE system_sms_template IS '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', '测试备注', '4383920', 6, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2023-12-02 22:32:47', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', 6, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2022-12-10 21:26:09', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', '哈哈哈哈', 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2023-12-02 22:35:34', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', 6, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2022-12-10 21:25:59', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2023-03-24 23:45:07', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', '0'); +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '["code"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-12-02 22:35:27', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_sms_template_seq; +CREATE SEQUENCE system_sms_template_seq + START 17; + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +DROP TABLE IF EXISTS system_social_client; +CREATE TABLE system_social_client +( + id int8 NOT NULL, + name varchar(255) NOT NULL, + social_type int2 NOT NULL, + user_type int2 NOT NULL, + client_id varchar(255) NOT NULL, + client_secret varchar(255) NOT NULL, + agent_id varchar(255) NULL DEFAULT NULL, + status int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_client + ADD CONSTRAINT pk_system_social_client PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_client.id IS '编号'; +COMMENT ON COLUMN system_social_client.name IS '应用名'; +COMMENT ON COLUMN system_social_client.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_client.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_client.client_id IS '客户端编号'; +COMMENT ON COLUMN system_social_client.client_secret IS '客户端密钥'; +COMMENT ON COLUMN system_social_client.agent_id IS '代理编号'; +COMMENT ON COLUMN system_social_client.status IS '状态'; +COMMENT ON COLUMN system_social_client.creator IS '创建者'; +COMMENT ON COLUMN system_social_client.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_client.updater IS '更新者'; +COMMENT ON COLUMN system_social_client.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_client.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_client.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_client IS '社交客户端表'; + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '钉钉', 20, 2, 'dingvrnreaje3yqvzhxg', 'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, '', '2023-10-18 11:21:18', '1', '2023-12-20 21:28:26', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '钉钉(王土豆)', 20, 2, 'dingtsu9hpepjkbmthhw', 'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, '', '2023-10-18 11:21:18', '', '2023-12-20 21:28:26', '1', 121); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '微信公众号', 31, 1, 'wx5b23ba7a5589ecbb', '2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, '', '2023-10-18 16:07:46', '1', '2023-12-20 21:28:23', '1', 1); +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (43, '微信小程序', 34, 1, 'wx63c280fe3248a3e7', '6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, '', '2023-10-19 13:37:41', '1', '2023-12-20 21:28:25', '1', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_social_client_seq; +CREATE SEQUENCE system_social_client_seq + START 44; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user; +CREATE TABLE system_social_user +( + id int8 NOT NULL, + type int2 NOT NULL, + openid varchar(32) NOT NULL, + token varchar(256) NULL DEFAULT NULL, + raw_token_info varchar(1024) NOT NULL, + nickname varchar(32) NOT NULL, + avatar varchar(255) NULL DEFAULT NULL, + raw_user_info varchar(1024) NOT NULL, + code varchar(256) NOT NULL, + state varchar(256) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_user + ADD CONSTRAINT pk_system_social_user PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user.type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user.openid IS '社交 openid'; +COMMENT ON COLUMN system_social_user.token IS '社交 token'; +COMMENT ON COLUMN system_social_user.raw_token_info IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.nickname IS '用户昵称'; +COMMENT ON COLUMN system_social_user.avatar IS '用户头像'; +COMMENT ON COLUMN system_social_user.raw_user_info IS '原始用户数据,一般是 JSON 格式'; +COMMENT ON COLUMN system_social_user.code IS '最后一次的认证 code'; +COMMENT ON COLUMN system_social_user.state IS '最后一次的认证 state'; +COMMENT ON COLUMN system_social_user.creator IS '创建者'; +COMMENT ON COLUMN system_social_user.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user.updater IS '更新者'; +COMMENT ON COLUMN system_social_user.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user IS '社交用户表'; + +DROP SEQUENCE IF EXISTS system_social_user_seq; +CREATE SEQUENCE system_social_user_seq + START 1; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user_bind; +CREATE TABLE system_social_user_bind +( + id int8 NOT NULL, + user_id int8 NOT NULL, + user_type int2 NOT NULL, + social_type int2 NOT NULL, + social_user_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_social_user_bind + ADD CONSTRAINT pk_system_social_user_bind PRIMARY KEY (id); + +COMMENT ON COLUMN system_social_user_bind.id IS '主键(自增策略)'; +COMMENT ON COLUMN system_social_user_bind.user_id IS '用户编号'; +COMMENT ON COLUMN system_social_user_bind.user_type IS '用户类型'; +COMMENT ON COLUMN system_social_user_bind.social_type IS '社交平台的类型'; +COMMENT ON COLUMN system_social_user_bind.social_user_id IS '社交用户的编号'; +COMMENT ON COLUMN system_social_user_bind.creator IS '创建者'; +COMMENT ON COLUMN system_social_user_bind.create_time IS '创建时间'; +COMMENT ON COLUMN system_social_user_bind.updater IS '更新者'; +COMMENT ON COLUMN system_social_user_bind.update_time IS '更新时间'; +COMMENT ON COLUMN system_social_user_bind.deleted IS '是否删除'; +COMMENT ON COLUMN system_social_user_bind.tenant_id IS '租户编号'; +COMMENT ON TABLE system_social_user_bind IS '社交绑定表'; + +DROP SEQUENCE IF EXISTS system_social_user_bind_seq; +CREATE SEQUENCE system_social_user_bind_seq + START 1; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant; +CREATE TABLE system_tenant +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + contact_user_id int8 NULL DEFAULT NULL, + contact_name varchar(30) NOT NULL, + contact_mobile varchar(500) NULL DEFAULT NULL, + status int2 NOT NULL DEFAULT 0, + website varchar(256) NULL DEFAULT '', + package_id int8 NOT NULL, + expire_time timestamp NOT NULL, + account_count int4 NOT NULL, + creator varchar(64) NOT NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_tenant + ADD CONSTRAINT pk_system_tenant PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant.id IS '租户编号'; +COMMENT ON COLUMN system_tenant.name IS '租户名'; +COMMENT ON COLUMN system_tenant.contact_user_id IS '联系人的用户编号'; +COMMENT ON COLUMN system_tenant.contact_name IS '联系人'; +COMMENT ON COLUMN system_tenant.contact_mobile IS '联系手机'; +COMMENT ON COLUMN system_tenant.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant.website IS '绑定域名'; +COMMENT ON COLUMN system_tenant.package_id IS '租户套餐编号'; +COMMENT ON COLUMN system_tenant.expire_time IS '过期时间'; +COMMENT ON COLUMN system_tenant.account_count IS '账号数量'; +COMMENT ON COLUMN system_tenant.creator IS '创建者'; +COMMENT ON COLUMN system_tenant.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant.updater IS '更新者'; +COMMENT ON COLUMN system_tenant.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant IS '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2023-11-06 11:41:41', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'zsxq.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2023-11-06 11:41:47', '0'); +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'test.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2023-11-06 11:41:53', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_tenant_seq; +CREATE SEQUENCE system_tenant_seq + START 123; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant_package; +CREATE TABLE system_tenant_package +( + id int8 NOT NULL, + name varchar(30) NOT NULL, + status int2 NOT NULL DEFAULT 0, + remark varchar(256) NULL DEFAULT '', + menu_ids varchar(4096) NOT NULL, + creator varchar(64) NOT NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_tenant_package + ADD CONSTRAINT pk_system_tenant_package PRIMARY KEY (id); + +COMMENT ON COLUMN system_tenant_package.id IS '套餐编号'; +COMMENT ON COLUMN system_tenant_package.name IS '套餐名'; +COMMENT ON COLUMN system_tenant_package.status IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN system_tenant_package.remark IS '备注'; +COMMENT ON COLUMN system_tenant_package.menu_ids IS '关联的菜单编号'; +COMMENT ON COLUMN system_tenant_package.creator IS '创建者'; +COMMENT ON COLUMN system_tenant_package.create_time IS '创建时间'; +COMMENT ON COLUMN system_tenant_package.updater IS '更新者'; +COMMENT ON COLUMN system_tenant_package.update_time IS '更新时间'; +COMMENT ON COLUMN system_tenant_package.deleted IS '是否删除'; +COMMENT ON TABLE system_tenant_package IS '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_tenant_package (id, name, status, remark, menu_ids, creator, create_time, updater, update_time, deleted) VALUES (111, '普通套餐', 0, '小功能', '[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1076,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2484,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2024-03-30 17:53:17', '0'); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_tenant_package_seq; +CREATE SEQUENCE system_tenant_package_seq + START 112; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS system_user_post; +CREATE TABLE system_user_post +( + id int8 NOT NULL, + user_id int8 NOT NULL DEFAULT 0, + post_id int8 NOT NULL DEFAULT 0, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_user_post + ADD CONSTRAINT pk_system_user_post PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_post.id IS 'id'; +COMMENT ON COLUMN system_user_post.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_post.post_id IS '岗位ID'; +COMMENT ON COLUMN system_user_post.creator IS '创建者'; +COMMENT ON COLUMN system_user_post.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_post.updater IS '更新者'; +COMMENT ON COLUMN system_user_post.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_post.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_post.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_post IS '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 104, 1, '1', '2022-05-16 19:36:28', '1', '2022-05-16 19:36:28', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (116, 117, 2, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 118, 1, '1', '2022-07-09 17:44:44', '1', '2022-07-09 17:44:44', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (119, 114, 5, '1', '2024-03-24 20:45:51', '1', '2024-03-24 20:45:51', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (123, 115, 1, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (124, 115, 2, '1', '2024-04-04 09:37:14', '1', '2024-04-04 09:37:14', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_user_post_seq; +CREATE SEQUENCE system_user_post_seq + START 125; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS system_user_role; +CREATE TABLE system_user_role +( + id int8 NOT NULL, + user_id int8 NOT NULL, + role_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_user_role + ADD CONSTRAINT pk_system_user_role PRIMARY KEY (id); + +COMMENT ON COLUMN system_user_role.id IS '自增编号'; +COMMENT ON COLUMN system_user_role.user_id IS '用户ID'; +COMMENT ON COLUMN system_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN system_user_role.creator IS '创建者'; +COMMENT ON COLUMN system_user_role.create_time IS '创建时间'; +COMMENT ON COLUMN system_user_role.updater IS '更新者'; +COMMENT ON COLUMN system_user_role.update_time IS '更新时间'; +COMMENT ON COLUMN system_user_role.deleted IS '是否删除'; +COMMENT ON COLUMN system_user_role.tenant_id IS '租户编号'; +COMMENT ON TABLE system_user_role IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', '0', 121); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', '0', 122); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (20, 104, 101, '1', '2022-05-28 15:43:57', '1', '2022-05-28 15:43:57', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (22, 115, 2, '1', '2022-07-21 22:08:30', '1', '2022-07-21 22:08:30', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (35, 112, 1, '1', '2024-03-15 20:00:24', '1', '2024-03-15 20:00:24', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (36, 118, 1, '1', '2024-03-17 09:12:08', '1', '2024-03-17 09:12:08', '0', 1); +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (38, 114, 101, '1', '2024-03-24 22:23:03', '1', '2024-03-24 22:23:03', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_user_role_seq; +CREATE SEQUENCE system_user_role_seq + START 39; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS system_users; +CREATE TABLE system_users +( + id int8 NOT NULL, + username varchar(30) NOT NULL, + password varchar(100) NOT NULL DEFAULT '', + nickname varchar(30) NOT NULL, + remark varchar(500) NULL DEFAULT NULL, + dept_id int8 NULL DEFAULT NULL, + post_ids varchar(255) NULL DEFAULT NULL, + email varchar(50) NULL DEFAULT '', + mobile varchar(11) NULL DEFAULT '', + sex int2 NULL DEFAULT 0, + avatar varchar(512) NULL DEFAULT '', + status int2 NOT NULL DEFAULT 0, + login_ip varchar(50) NULL DEFAULT '', + login_date timestamp NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE system_users + ADD CONSTRAINT pk_system_users PRIMARY KEY (id); + +COMMENT ON COLUMN system_users.id IS '用户ID'; +COMMENT ON COLUMN system_users.username IS '用户账号'; +COMMENT ON COLUMN system_users.password IS '密码'; +COMMENT ON COLUMN system_users.nickname IS '用户昵称'; +COMMENT ON COLUMN system_users.remark IS '备注'; +COMMENT ON COLUMN system_users.dept_id IS '部门ID'; +COMMENT ON COLUMN system_users.post_ids IS '岗位编号数组'; +COMMENT ON COLUMN system_users.email IS '用户邮箱'; +COMMENT ON COLUMN system_users.mobile IS '手机号码'; +COMMENT ON COLUMN system_users.sex IS '用户性别'; +COMMENT ON COLUMN system_users.avatar IS '头像地址'; +COMMENT ON COLUMN system_users.status IS '帐号状态(0正常 1停用)'; +COMMENT ON COLUMN system_users.login_ip IS '最后登录IP'; +COMMENT ON COLUMN system_users.login_date IS '最后登录时间'; +COMMENT ON COLUMN system_users.creator IS '创建者'; +COMMENT ON COLUMN system_users.create_time IS '创建时间'; +COMMENT ON COLUMN system_users.updater IS '更新者'; +COMMENT ON COLUMN system_users.update_time IS '更新时间'; +COMMENT ON COLUMN system_users.deleted IS '是否删除'; +COMMENT ON COLUMN system_users.tenant_id IS '租户编号'; +COMMENT ON TABLE system_users IS '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '18818260277', 2, 'http://test.win.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, '0:0:0:0:0:0:0:1', '2024-04-29 21:50:32', 'admin', '2021-01-05 17:03:47', NULL, '2024-04-29 21:50:32', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '0:0:0:0:0:0:0:1', '2024-03-18 21:09:04', '', '2021-01-13 23:50:35', NULL, '2024-03-18 21:09:04', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, 'test', '$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-26 07:11:35', '', '2021-01-21 02:13:53', NULL, '2024-03-26 07:11:35', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', '0', 118); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', '0', 119); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', '0', 120); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-09-25 22:47:33', '1', '2022-02-22 00:56:14', NULL, '2022-09-25 22:47:33', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, 'test', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '0:0:0:0:0:0:0:1', '2023-12-30 11:42:17', '110', '2022-02-23 13:14:33', NULL, '2023-12-30 11:42:17', '0', 121); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 'newobject', '$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', '新对象', NULL, 100, '[]', '', '15601691235', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-16 23:11:38', '1', '2022-02-23 19:08:03', NULL, '2024-03-16 23:11:38', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', '0', 122); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[5]', '', '15601691236', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-24 22:21:05', '1', '2022-03-19 21:50:58', NULL, '2024-03-24 22:21:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 'aotemane', '$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', '阿呆', '11222', 102, '[1,2]', '7648@qq.com', '15601691229', 2, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2024-04-04 09:37:14', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (118, 'goudan', '$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', '狗蛋', NULL, 103, '[1]', '', '15601691239', 1, '', 0, '0:0:0:0:0:0:0:1', '2024-03-17 09:10:27', '1', '2022-07-09 17:44:43', '1', '2024-04-04 09:48:05', '0', 1); +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (131, 'hh', '$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', '呵呵', NULL, 100, '[]', '777@qq.com', '15601882312', 1, '', 0, '', NULL, '1', '2024-04-27 08:45:56', '1', '2024-04-27 08:45:56', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS system_users_seq; +CREATE SEQUENCE system_users_seq + START 132; + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +DROP TABLE IF EXISTS win_demo01_contact; +CREATE TABLE win_demo01_contact +( + id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + sex int2 NOT NULL, + birthday timestamp NOT NULL, + description varchar(255) NOT NULL, + avatar varchar(512) NULL DEFAULT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo01_contact + ADD CONSTRAINT pk_win_demo01_contact PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo01_contact.id IS '编号'; +COMMENT ON COLUMN win_demo01_contact.name IS '名字'; +COMMENT ON COLUMN win_demo01_contact.sex IS '性别'; +COMMENT ON COLUMN win_demo01_contact.birthday IS '出生年'; +COMMENT ON COLUMN win_demo01_contact.description IS '简介'; +COMMENT ON COLUMN win_demo01_contact.avatar IS '头像'; +COMMENT ON COLUMN win_demo01_contact.creator IS '创建者'; +COMMENT ON COLUMN win_demo01_contact.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo01_contact.updater IS '更新者'; +COMMENT ON COLUMN win_demo01_contact.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo01_contact.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo01_contact.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo01_contact IS '示例联系人表'; + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo01_contact (id, name, sex, birthday, description, avatar, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 2, '2023-11-07 00:00:00', '

天蚕土豆!呀

', 'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', '1', '2023-11-15 23:34:30', '1', '2023-11-15 23:47:39', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo01_contact_seq; +CREATE SEQUENCE win_demo01_contact_seq + START 2; + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +DROP TABLE IF EXISTS win_demo02_category; +CREATE TABLE win_demo02_category +( + id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + parent_id int8 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo02_category + ADD CONSTRAINT pk_win_demo02_category PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo02_category.id IS '编号'; +COMMENT ON COLUMN win_demo02_category.name IS '名字'; +COMMENT ON COLUMN win_demo02_category.parent_id IS '父级编号'; +COMMENT ON COLUMN win_demo02_category.creator IS '创建者'; +COMMENT ON COLUMN win_demo02_category.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo02_category.updater IS '更新者'; +COMMENT ON COLUMN win_demo02_category.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo02_category.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo02_category.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo02_category IS '示例分类表'; + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, '土豆', 0, '1', '2023-11-15 23:34:30', '1', '2023-11-16 20:24:23', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '番茄', 0, '1', '2023-11-16 20:24:00', '1', '2023-11-16 20:24:15', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, '怪怪', 0, '1', '2023-11-16 20:24:32', '1', '2023-11-16 20:24:32', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, '小番茄', 2, '1', '2023-11-16 20:24:39', '1', '2023-11-16 20:24:39', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大番茄', 2, '1', '2023-11-16 20:24:46', '1', '2023-11-16 20:24:46', '0', 1); +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, '11', 3, '1', '2023-11-24 19:29:34', '1', '2023-11-24 19:29:34', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo02_category_seq; +CREATE SEQUENCE win_demo02_category_seq + START 7; + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_course; +CREATE TABLE win_demo03_course +( + id int8 NOT NULL, + student_id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + score int2 NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_course + ADD CONSTRAINT pk_win_demo03_course PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_course.id IS '编号'; +COMMENT ON COLUMN win_demo03_course.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_course.name IS '名字'; +COMMENT ON COLUMN win_demo03_course.score IS '分数'; +COMMENT ON COLUMN win_demo03_course.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_course.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_course.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_course.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_course.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_course.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_course IS '学生课程表'; + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, '语文', 66, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 2, '数学', 22, '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:44:40', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 15:47:09', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 5, '体育', 23, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (11, 5, '计算机', 11, '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (12, 2, '电脑', 33, '1', '2023-11-17 00:20:42', '1', '2023-11-16 16:20:45', '1', 1); +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (13, 9, '滑雪', 12, '1', '2023-11-17 13:13:20', '1', '2023-11-17 13:13:20', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_course_seq; +CREATE SEQUENCE win_demo03_course_seq + START 14; + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_grade; +CREATE TABLE win_demo03_grade +( + id int8 NOT NULL, + student_id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + teacher varchar(255) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_grade + ADD CONSTRAINT pk_win_demo03_grade PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_grade.id IS '编号'; +COMMENT ON COLUMN win_demo03_grade.student_id IS '学生编号'; +COMMENT ON COLUMN win_demo03_grade.name IS '名字'; +COMMENT ON COLUMN win_demo03_grade.teacher IS '班主任'; +COMMENT ON COLUMN win_demo03_grade.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_grade.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_grade.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_grade.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_grade.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_grade.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_grade IS '学生班级表'; + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 2, '三年 2 班', '周杰伦', '1', '2023-11-16 23:21:49', '1', '2023-11-16 23:21:49', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, '华为', '遥遥领先', '1', '2023-11-16 23:22:46', '1', '2023-11-16 23:47:10', '0', 1); +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 9, '小图', '小娃111', '1', '2023-11-17 13:10:23', '1', '2023-11-17 13:10:23', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_grade_seq; +CREATE SEQUENCE win_demo03_grade_seq + START 10; + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_student; +CREATE TABLE win_demo03_student +( + id int8 NOT NULL, + name varchar(100) NOT NULL DEFAULT '', + sex int2 NOT NULL, + birthday timestamp NOT NULL, + description varchar(255) NOT NULL, + creator varchar(64) NULL DEFAULT '', + create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updater varchar(64) NULL DEFAULT '', + update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted int2 NOT NULL DEFAULT 0, + tenant_id int8 NOT NULL DEFAULT 0 +); + +ALTER TABLE win_demo03_student + ADD CONSTRAINT pk_win_demo03_student PRIMARY KEY (id); + +COMMENT ON COLUMN win_demo03_student.id IS '编号'; +COMMENT ON COLUMN win_demo03_student.name IS '名字'; +COMMENT ON COLUMN win_demo03_student.sex IS '性别'; +COMMENT ON COLUMN win_demo03_student.birthday IS '出生日期'; +COMMENT ON COLUMN win_demo03_student.description IS '简介'; +COMMENT ON COLUMN win_demo03_student.creator IS '创建者'; +COMMENT ON COLUMN win_demo03_student.create_time IS '创建时间'; +COMMENT ON COLUMN win_demo03_student.updater IS '更新者'; +COMMENT ON COLUMN win_demo03_student.update_time IS '更新时间'; +COMMENT ON COLUMN win_demo03_student.deleted IS '是否删除'; +COMMENT ON COLUMN win_demo03_student.tenant_id IS '租户编号'; +COMMENT ON TABLE win_demo03_student IS '学生表'; + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +-- @formatter:off +BEGIN; +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, '小白', 1, '2023-11-16 00:00:00', '

厉害

', '1', '2023-11-16 23:21:49', '1', '2023-11-17 16:49:06', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, '大黑', 2, '2023-11-13 00:00:00', '

你在教我做事?

', '1', '2023-11-16 23:22:46', '1', '2023-11-17 16:49:07', '0', 1); +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, '小花', 1, '2023-11-07 00:00:00', '

哈哈哈

', '1', '2023-11-17 00:04:47', '1', '2023-11-17 16:49:08', '0', 1); +COMMIT; +-- @formatter:on + +DROP SEQUENCE IF EXISTS win_demo03_student_seq; +CREATE SEQUENCE win_demo03_student_seq + START 10; + diff --git a/sql/sqlserver/quartz.sql b/sql/sqlserver/quartz.sql new file mode 100644 index 0000000..7fd2417 --- /dev/null +++ b/sql/sqlserver/quartz.sql @@ -0,0 +1,533 @@ +/* + 注意:仅仅需要 Quartz 定时任务的场景,可选!!! + + Date: 30/04/2024 09:54:18 +*/ + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS] + GO + +CREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [BLOB_DATA] varbinary(max) NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_BLOB_TRIGGERS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_CALENDARS] + GO + +CREATE TABLE [dbo].[QRTZ_CALENDARS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CALENDAR_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CALENDAR] varbinary(max) NOT NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_CALENDARS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS] + GO + +CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CRON_EXPRESSION] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TIME_ZONE_ID] varchar(80) COLLATE SQL_Latin1_General_CP1_CI_AS NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS] + GO + +CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [ENTRY_ID] varchar(95) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [INSTANCE_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [FIRED_TIME] bigint NOT NULL, + [SCHED_TIME] bigint NOT NULL, + [PRIORITY] int NOT NULL, + [STATE] varchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [IS_NONCONCURRENT] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [REQUESTS_RECOVERY] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_JOB_DETAILS] + GO + +CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [DESCRIPTION] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [JOB_CLASS_NAME] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_DURABLE] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_NONCONCURRENT] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_UPDATE_DATA] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [REQUESTS_RECOVERY] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_DATA] varbinary(max) NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +BEGIN TRANSACTION +GO + +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_LOCKS] + GO + +CREATE TABLE [dbo].[QRTZ_LOCKS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [LOCK_NAME] varchar(40) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_LOCKS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] + GO + +CREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE] + GO + +CREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [INSTANCE_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [LAST_CHECKIN_TIME] bigint NOT NULL, + [CHECKIN_INTERVAL] bigint NOT NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] + GO + +CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [REPEAT_COUNT] bigint NOT NULL, + [REPEAT_INTERVAL] bigint NOT NULL, + [TIMES_TRIGGERED] bigint NOT NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] + GO + +CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [STR_PROP_1] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [STR_PROP_2] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [STR_PROP_3] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [INT_PROP_1] int NULL, + [INT_PROP_2] int NULL, + [LONG_PROP_1] bigint NULL, + [LONG_PROP_2] bigint NULL, + [DEC_PROP_1] numeric(13,4) NULL, + [DEC_PROP_2] numeric(13,4) NULL, + [BOOL_PROP_1] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BOOL_PROP_2] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND type IN ('U')) +DROP TABLE [dbo].[QRTZ_TRIGGERS] + GO + +CREATE TABLE [dbo].[QRTZ_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [DESCRIPTION] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [NEXT_FIRE_TIME] bigint NULL, + [PREV_FIRE_TIME] bigint NULL, + [PRIORITY] int NULL, + [TRIGGER_STATE] varchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_TYPE] varchar(8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [START_TIME] bigint NOT NULL, + [END_TIME] bigint NULL, + [CALENDAR_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MISFIRE_INSTR] smallint NULL, + [JOB_DATA] varbinary(max) NULL + ) + GO + +ALTER TABLE [dbo].[QRTZ_TRIGGERS] SET (LOCK_ESCALATION = TABLE) + GO + + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CALENDARS] ADD CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [CALENDAR_NAME]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] +ON [dbo].[QRTZ_CRON_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [ENTRY_ID]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] ADD CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_LOCKS] ADD CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [LOCK_NAME]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ADD CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_GROUP]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] ADD CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY CLUSTERED ([SCHED_NAME], [INSTANCE_NAME]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] +ON [dbo].[QRTZ_SIMPLE_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] +ON [dbo].[QRTZ_SIMPROP_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] +ON [dbo].[QRTZ_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] + GO + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_BLOB_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_BLOB_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION + GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION + GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION + GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION + GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) REFERENCES [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) ON DELETE NO ACTION ON UPDATE NO ACTION + GO \ No newline at end of file diff --git a/sql/sqlserver/ruoyi-vue-pro.sql b/sql/sqlserver/ruoyi-vue-pro.sql new file mode 100644 index 0000000..f2049e6 --- /dev/null +++ b/sql/sqlserver/ruoyi-vue-pro.sql @@ -0,0 +1,11310 @@ +/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : Microsoft SQL Server + + Date: 2024-05-08 00:22:09 + Date: 2024-05-10 22:07:48 +*/ + + +-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +DROP TABLE IF EXISTS dual +GO +CREATE TABLE dual +( + id int +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据库连接的表', + 'SCHEMA', N'dbo', + 'TABLE', N'dual' +GO + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +-- @formatter:off +INSERT INTO dual VALUES (1) +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_access_log +GO +CREATE TABLE infra_api_access_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + trace_id nvarchar(64) DEFAULT '' NOT NULL, + user_id bigint DEFAULT 0 NOT NULL, + user_type tinyint DEFAULT 0 NOT NULL, + application_name nvarchar(50) NOT NULL, + request_method nvarchar(16) DEFAULT '' NOT NULL, + request_url nvarchar(255) DEFAULT '' NOT NULL, + request_params nvarchar(max) NULL, + response_body nvarchar(max) NULL, + user_ip nvarchar(50) NOT NULL, + user_agent nvarchar(512) NOT NULL, + operate_module nvarchar(50) DEFAULT NULL NULL, + operate_name nvarchar(50) DEFAULT NULL NULL, + operate_type tinyint DEFAULT 0 NULL, + begin_time datetime2 NOT NULL, + end_time datetime2 NOT NULL, + duration int NOT NULL, + result_code int DEFAULT 0 NOT NULL, + result_msg nvarchar(512) DEFAULT '' NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +CREATE INDEX idx_infra_api_access_log_01 ON infra_api_access_log (create_time) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'日志主键', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'链路追踪编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'应用名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'application_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求方法名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'request_method' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求地址', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求参数', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'request_params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'响应结果', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'response_body' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户 IP', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'浏览器 UA', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作模块', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'operate_module' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'operate_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作分类', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'operate_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'开始请求时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'begin_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'结束请求时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'执行时长', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'duration' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'结果码', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'result_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'结果提示', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'result_msg' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'API 访问日志表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_access_log' +GO + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_api_error_log +GO +CREATE TABLE infra_api_error_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + trace_id nvarchar(64) NOT NULL, + user_id int DEFAULT 0 NOT NULL, + user_type tinyint DEFAULT 0 NOT NULL, + application_name nvarchar(50) NOT NULL, + request_method nvarchar(16) NOT NULL, + request_url nvarchar(255) NOT NULL, + request_params nvarchar(4000) NOT NULL, + user_ip nvarchar(50) NOT NULL, + user_agent nvarchar(512) NOT NULL, + exception_time datetime2 NOT NULL, + exception_name nvarchar(128) DEFAULT '' NOT NULL, + exception_message nvarchar(max) NOT NULL, + exception_root_cause_message nvarchar(max) NOT NULL, + exception_stack_trace nvarchar(max) NOT NULL, + exception_class_name nvarchar(512) NOT NULL, + exception_file_name nvarchar(512) NOT NULL, + exception_method_name nvarchar(512) NOT NULL, + exception_line_number int NOT NULL, + process_status tinyint NOT NULL, + process_time datetime2 DEFAULT NULL NULL, + process_user_id int DEFAULT 0 NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'应用名 + * + * 目前读取 spring.application.name', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'application_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求方法名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'request_method' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求地址', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求参数', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'request_params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户 IP', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'浏览器 UA', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常发生时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常名 + * + * {@link Throwable#getClass()} 的类全名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_message' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_root_cause_message' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_stack_trace' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_class_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_file_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_method_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'exception_line_number' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理状态', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'process_status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'process_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'process_user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'系统异常日志', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_api_error_log' +GO + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_column +GO +CREATE TABLE infra_codegen_column +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + table_id bigint NOT NULL, + column_name nvarchar(200) NOT NULL, + data_type nvarchar(100) NOT NULL, + column_comment nvarchar(500) NOT NULL, + nullable varchar(1) NOT NULL, + primary_key varchar(1) NOT NULL, + ordinal_position int NOT NULL, + java_type nvarchar(32) NOT NULL, + java_field nvarchar(64) NOT NULL, + dict_type nvarchar(200) DEFAULT '' NULL, + example nvarchar(64) DEFAULT NULL NULL, + create_operation varchar(1) NOT NULL, + update_operation varchar(1) NOT NULL, + list_operation varchar(1) NOT NULL, + list_operation_condition nvarchar(32) DEFAULT '=' NOT NULL, + list_operation_result varchar(1) NOT NULL, + html_type nvarchar(32) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'表编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'table_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字段名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'column_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字段类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'data_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字段描述', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'column_comment' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否允许为空', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'nullable' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否主键', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'primary_key' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'排序', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'ordinal_position' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'Java 属性类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'java_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'Java 属性名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'java_field' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'dict_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据示例', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'example' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否为 Create 创建操作的字段', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'create_operation' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否为 Update 更新操作的字段', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'update_operation' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否为 List 查询操作的字段', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'list_operation' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'List 查询操作的条件类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'list_operation_condition' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否为 List 查询操作的返回字段', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'list_operation_result' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'显示类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'html_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'代码生成表字段定义', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_column' +GO + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS infra_codegen_table +GO +CREATE TABLE infra_codegen_table +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + data_source_config_id bigint NOT NULL, + scene tinyint DEFAULT 1 NOT NULL, + table_name nvarchar(200) DEFAULT '' NOT NULL, + table_comment nvarchar(500) DEFAULT '' NOT NULL, + remark nvarchar(500) DEFAULT NULL NULL, + module_name nvarchar(30) NOT NULL, + business_name nvarchar(30) NOT NULL, + class_name nvarchar(100) DEFAULT '' NOT NULL, + class_comment nvarchar(50) NOT NULL, + author nvarchar(50) NOT NULL, + template_type tinyint DEFAULT 1 NOT NULL, + front_type tinyint NOT NULL, + parent_menu_id bigint DEFAULT NULL NULL, + master_table_id bigint DEFAULT NULL NULL, + sub_join_column_id bigint DEFAULT NULL NULL, + sub_join_many varchar(1) DEFAULT NULL NULL, + tree_parent_column_id bigint DEFAULT NULL NULL, + tree_name_column_id bigint DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据源配置的编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'data_source_config_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'生成场景', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'scene' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'表名称', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'table_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'表描述', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'table_comment' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模块名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'module_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'业务名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'business_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'类名称', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'class_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'类描述', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'class_comment' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'作者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'author' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'template_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'前端类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'front_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'父菜单编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'parent_menu_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主表的编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'master_table_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'子表关联主表的字段编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'sub_join_column_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主表与子表是否一对多', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'sub_join_many' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'树表的父字段编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'tree_parent_column_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'树表的名字字段编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'tree_name_column_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'代码生成表定义', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_codegen_table' +GO + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_config +GO +CREATE TABLE infra_config +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + category nvarchar(50) NOT NULL, + type tinyint NOT NULL, + name nvarchar(100) DEFAULT '' NOT NULL, + config_key nvarchar(100) DEFAULT '' NOT NULL, + value nvarchar(500) DEFAULT '' NOT NULL, + visible varchar(1) NOT NULL, + remark nvarchar(500) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数主键', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数分组', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'category' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数名称', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数键名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'config_key' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数键值', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'value' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否可见', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'visible' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数配置表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_config' +GO + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT infra_config ON +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (2, N'biz', 1, N'用户管理-账号初始密码', N'sys.user.init-password', N'123456', N'0', N'初始化密码 123456', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-03 17:22:28', N'0') +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (7, N'url', 2, N'MySQL 监控的地址', N'url.druid', N'', N'1', N'', N'1', N'2023-04-07 13:41:16', N'1', N'2023-04-07 14:33:38', N'0') +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (8, N'url', 2, N'SkyWalking 监控的地址', N'url.skywalking', N'', N'1', N'', N'1', N'2023-04-07 13:41:16', N'1', N'2023-04-07 14:57:03', N'0') +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (9, N'url', 2, N'Spring Boot Admin 监控的地址', N'url.spring-boot-admin', N'', N'1', N'', N'1', N'2023-04-07 13:41:16', N'1', N'2023-04-07 14:52:07', N'0') +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (10, N'url', 2, N'Swagger 接口文档的地址', N'url.swagger', N'', N'1', N'', N'1', N'2023-04-07 13:41:16', N'1', N'2023-04-07 14:59:00', N'0') +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (11, N'ui', 2, N'腾讯地图 key', N'tencent.lbs.key', N'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', N'1', N'腾讯地图 key', N'1', N'2023-06-03 19:16:27', N'1', N'2023-06-03 19:16:27', N'0') +GO +INSERT INTO infra_config (id, category, type, name, config_key, value, visible, remark, creator, create_time, updater, update_time, deleted) VALUES (12, N'test2', 2, N'test3', N'test4', N'test5', N'1', N'test6', N'1', N'2023-12-03 09:55:16', N'1', N'2023-12-03 09:55:27', N'0') +GO +SET IDENTITY_INSERT infra_config OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_data_source_config +GO +CREATE TABLE infra_data_source_config +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(100) DEFAULT '' NOT NULL, + url nvarchar(1024) NOT NULL, + username nvarchar(255) NOT NULL, + password nvarchar(255) DEFAULT '' NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主键编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数名称', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据源连接', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'url' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'密码', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据源配置表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_data_source_config' +GO + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS infra_file +GO +CREATE TABLE infra_file +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + config_id bigint DEFAULT NULL NULL, + name nvarchar(256) DEFAULT NULL NULL, + path nvarchar(512) NOT NULL, + url nvarchar(1024) NOT NULL, + type nvarchar(128) DEFAULT NULL NULL, + size int NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'配置编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'config_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件路径', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'path' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件 URL', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'url' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件类型', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件大小', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'size' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file' +GO + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_config +GO +CREATE TABLE infra_file_config +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(63) NOT NULL, + storage tinyint NOT NULL, + remark nvarchar(255) DEFAULT NULL NULL, + master varchar(1) NOT NULL, + config nvarchar(4000) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'配置名', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'存储器', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'storage' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否为主配置', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'master' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'存储配置', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'config' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件配置表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_config' +GO + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT infra_file_config ON +GO +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (4, N'数据库', 1, N'我是数据库', N'0', N'{"@class":"com.win.module.infra.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', N'1', N'2022-03-15 23:56:24', N'1', N'2024-02-28 22:54:07', N'0') +GO +INSERT INTO infra_file_config (id, name, storage, remark, master, config, creator, create_time, updater, update_time, deleted) VALUES (22, N'七牛存储器', 20, N'', N'1', N'{"@class":"com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3.cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS","accessSecret":"wd0tbVBYlp0S-ihA8Qg2hPLncoP83wyrIq24OZuY"}', N'1', N'2024-01-13 22:11:12', N'1', N'2024-04-03 19:38:34', N'0') +GO +SET IDENTITY_INSERT infra_file_config OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS infra_file_content +GO +CREATE TABLE infra_file_content +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + config_id bigint NOT NULL, + path nvarchar(512) NOT NULL, + content varbinary(max) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'配置编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'config_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件路径', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'path' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件内容', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'文件表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_file_content' +GO + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS infra_job +GO +CREATE TABLE infra_job +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(32) NOT NULL, + status tinyint NOT NULL, + handler_name nvarchar(64) NOT NULL, + handler_param nvarchar(255) DEFAULT NULL NULL, + cron_expression nvarchar(32) NOT NULL, + retry_count int DEFAULT 0 NOT NULL, + retry_interval int DEFAULT 0 NOT NULL, + monitor_timeout int DEFAULT 0 NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'任务编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'任务名称', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'任务状态', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理器的名字', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'handler_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理器的参数', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'handler_param' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'CRON 表达式', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'cron_expression' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'重试次数', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'retry_count' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'重试间隔', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'retry_interval' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'监控超时时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'monitor_timeout' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'定时任务表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job' +GO + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT infra_job ON +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (5, N'支付通知 Job', 2, N'payNotifyJob', NULL, N'* * * * * ?', 0, 0, 0, N'1', N'2021-10-27 08:34:42', N'1', N'2023-07-09 20:51:41', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (17, N'支付订单同步 Job', 2, N'payOrderSyncJob', NULL, N'0 0/1 * * * ?', 0, 0, 0, N'1', N'2023-07-22 14:36:26', N'1', N'2023-07-22 15:39:08', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (18, N'支付订单过期 Job', 2, N'payOrderExpireJob', NULL, N'0 0/1 * * * ?', 0, 0, 0, N'1', N'2023-07-22 15:36:23', N'1', N'2023-07-22 15:39:54', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (19, N'退款订单的同步 Job', 2, N'payRefundSyncJob', NULL, N'0 0/1 * * * ?', 0, 0, 0, N'1', N'2023-07-23 21:03:44', N'1', N'2023-07-23 21:09:00', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (21, N'交易订单的自动过期 Job', 2, N'tradeOrderAutoCancelJob', N'', N'0 * * * * ?', 3, 0, 0, N'1', N'2023-09-25 23:43:26', N'1', N'2023-09-26 19:23:30', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (22, N'交易订单的自动收货 Job', 2, N'tradeOrderAutoReceiveJob', N'', N'0 * * * * ?', 3, 0, 0, N'1', N'2023-09-26 19:23:53', N'1', N'2023-09-26 23:38:08', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (23, N'交易订单的自动评论 Job', 2, N'tradeOrderAutoCommentJob', N'', N'0 * * * * ?', 3, 0, 0, N'1', N'2023-09-26 23:38:29', N'1', N'2023-09-27 11:03:10', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (24, N'佣金解冻 Job', 2, N'brokerageRecordUnfreezeJob', N'', N'0 * * * * ?', 3, 0, 0, N'1', N'2023-09-28 22:01:46', N'1', N'2023-09-28 22:01:56', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (25, N'访问日志清理 Job', 2, N'accessLogCleanJob', N'', N'0 0 0 * * ?', 3, 0, 0, N'1', N'2023-10-03 10:59:41', N'1', N'2023-10-03 11:01:10', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (26, N'错误日志清理 Job', 2, N'errorLogCleanJob', N'', N'0 0 0 * * ?', 3, 0, 0, N'1', N'2023-10-03 11:00:43', N'1', N'2023-10-03 11:01:12', N'0') +GO +INSERT INTO infra_job (id, name, status, handler_name, handler_param, cron_expression, retry_count, retry_interval, monitor_timeout, creator, create_time, updater, update_time, deleted) VALUES (27, N'任务日志清理 Job', 2, N'jobLogCleanJob', N'', N'0 0 0 * * ?', 3, 0, 0, N'1', N'2023-10-03 11:01:33', N'1', N'2023-10-03 11:01:42', N'0') +GO +SET IDENTITY_INSERT infra_job OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS infra_job_log +GO +CREATE TABLE infra_job_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + job_id bigint NOT NULL, + handler_name nvarchar(64) NOT NULL, + handler_param nvarchar(255) DEFAULT NULL NULL, + execute_index tinyint DEFAULT 1 NOT NULL, + begin_time datetime2 NOT NULL, + end_time datetime2 DEFAULT NULL NULL, + duration int DEFAULT NULL NULL, + status tinyint NOT NULL, + result nvarchar(4000) DEFAULT '' NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'日志编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'任务编号', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'job_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理器的名字', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'handler_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'处理器的参数', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'handler_param' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'第几次执行', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'execute_index' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'开始执行时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'begin_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'结束执行时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'执行时长', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'duration' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'任务状态', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'结果数据', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'定时任务日志表', + 'SCHEMA', N'dbo', + 'TABLE', N'infra_job_log' +GO + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS system_dept +GO +CREATE TABLE system_dept +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(30) DEFAULT '' NOT NULL, + parent_id bigint DEFAULT 0 NOT NULL, + sort int DEFAULT 0 NOT NULL, + leader_user_id bigint DEFAULT NULL NULL, + phone nvarchar(11) DEFAULT NULL NULL, + email nvarchar(50) DEFAULT NULL NULL, + status tinyint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'部门id', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'部门名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'父部门id', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'显示顺序', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'负责人', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'leader_user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'联系电话', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'phone' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮箱', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'email' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'部门状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'部门表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dept' +GO + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_dept ON +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, N'芋道源码', 0, 0, 1, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'1', N'2023-11-14 23:30:36', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, N'深圳总公司', 100, 1, 104, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'1', N'2023-12-02 09:53:35', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (102, N'长沙分公司', 100, 2, NULL, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'', N'2021-12-15 05:01:40', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, N'研发部门', 101, 1, 104, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'1', N'2024-03-24 20:56:04', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, N'市场部门', 101, 2, NULL, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'', N'2021-12-15 05:01:38', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (105, N'测试部门', 101, 3, NULL, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'1', N'2022-05-16 20:25:15', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (106, N'财务部门', 101, 4, 103, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'103', N'2022-01-15 21:32:22', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, N'运维部门', 101, 5, 1, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'1', N'2023-12-02 09:28:22', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, N'市场部门', 102, 1, NULL, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'1', N'2022-02-16 08:35:45', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, N'财务部门', 102, 2, NULL, N'15888888888', N'ry@qq.com', 0, N'admin', N'2021-01-05 17:03:47', N'', N'2021-12-15 05:01:29', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, N'新部门', 0, 1, NULL, NULL, NULL, 0, N'110', N'2022-02-23 20:46:30', N'110', N'2022-02-23 20:46:30', N'0', 121) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, N'顶级部门', 0, 1, NULL, NULL, NULL, 0, N'113', N'2022-03-07 21:44:50', N'113', N'2022-03-07 21:44:50', N'0', 122) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, N'产品部门', 101, 100, 1, NULL, NULL, 1, N'1', N'2023-12-02 09:45:13', N'1', N'2023-12-02 09:45:31', N'0', 1) +GO +INSERT INTO system_dept (id, name, parent_id, sort, leader_user_id, phone, email, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, N'支持部门', 102, 3, 104, NULL, NULL, 1, N'1', N'2023-12-02 09:47:38', N'1', N'2023-12-02 09:47:38', N'0', 1) +GO +SET IDENTITY_INSERT system_dept OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_data +GO +CREATE TABLE system_dict_data +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + sort int DEFAULT 0 NOT NULL, + label nvarchar(100) DEFAULT '' NOT NULL, + value nvarchar(100) DEFAULT '' NOT NULL, + dict_type nvarchar(100) DEFAULT '' NOT NULL, + status tinyint DEFAULT 0 NOT NULL, + color_type nvarchar(100) DEFAULT '' NULL, + css_class nvarchar(100) DEFAULT '' NULL, + remark nvarchar(500) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典排序', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典标签', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'label' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典键值', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'value' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'dict_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'颜色类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'color_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'css 样式', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'css_class' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典数据表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_data' +GO + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_dict_data ON +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1, 1, N'男', N'1', N'system_user_sex', 0, N'default', N'A', N'性别男', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-03-29 00:14:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2, 2, N'女', N'2', N'system_user_sex', 0, N'success', N'', N'性别女', N'admin', N'2021-01-05 17:03:48', N'1', N'2023-11-15 23:30:37', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (8, 1, N'正常', N'1', N'infra_job_status', 0, N'success', N'', N'正常状态', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 19:33:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (9, 2, N'暂停', N'2', N'infra_job_status', 0, N'danger', N'', N'停用状态', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 19:33:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (12, 1, N'系统内置', N'1', N'infra_config_type', 0, N'danger', N'', N'参数类型 - 系统内置', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 19:06:02', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (13, 2, N'自定义', N'2', N'infra_config_type', 0, N'primary', N'', N'参数类型 - 自定义', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 19:06:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (14, 1, N'通知', N'1', N'system_notice_type', 0, N'success', N'', N'通知', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 13:05:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (15, 2, N'公告', N'2', N'system_notice_type', 0, N'info', N'', N'公告', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 13:06:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (16, 0, N'其它', N'0', N'infra_operate_type', 0, N'default', N'', N'其它操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (17, 1, N'查询', N'1', N'infra_operate_type', 0, N'info', N'', N'查询操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (18, 2, N'新增', N'2', N'infra_operate_type', 0, N'primary', N'', N'新增操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (19, 3, N'修改', N'3', N'infra_operate_type', 0, N'warning', N'', N'修改操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (20, 4, N'删除', N'4', N'infra_operate_type', 0, N'danger', N'', N'删除操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:23', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (22, 5, N'导出', N'5', N'infra_operate_type', 0, N'default', N'', N'导出操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (23, 6, N'导入', N'6', N'infra_operate_type', 0, N'default', N'', N'导入操作', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:25', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (27, 1, N'开启', N'0', N'common_status', 0, N'primary', N'', N'开启状态', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 08:00:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (28, 2, N'关闭', N'1', N'common_status', 0, N'info', N'', N'关闭状态', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 08:00:44', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (29, 1, N'目录', N'1', N'system_menu_type', 0, N'', N'', N'目录', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:43:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (30, 2, N'菜单', N'2', N'system_menu_type', 0, N'', N'', N'菜单', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:43:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (31, 3, N'按钮', N'3', N'system_menu_type', 0, N'', N'', N'按钮', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:43:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (32, 1, N'内置', N'1', N'system_role_type', 0, N'danger', N'', N'内置角色', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 13:02:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (33, 2, N'自定义', N'2', N'system_role_type', 0, N'primary', N'', N'自定义角色', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-02-16 13:02:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (34, 1, N'全部数据权限', N'1', N'system_data_scope', 0, N'', N'', N'全部数据权限', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:47:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (35, 2, N'指定部门数据权限', N'2', N'system_data_scope', 0, N'', N'', N'指定部门数据权限', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:47:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (36, 3, N'本部门数据权限', N'3', N'system_data_scope', 0, N'', N'', N'本部门数据权限', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:47:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (37, 4, N'本部门及以下数据权限', N'4', N'system_data_scope', 0, N'', N'', N'本部门及以下数据权限', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:47:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (38, 5, N'仅本人数据权限', N'5', N'system_data_scope', 0, N'', N'', N'仅本人数据权限', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:47:23', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (39, 0, N'成功', N'0', N'system_login_result', 0, N'success', N'', N'登陆结果 - 成功', N'', N'2021-01-18 06:17:36', N'1', N'2022-02-16 13:23:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (40, 10, N'账号或密码不正确', N'10', N'system_login_result', 0, N'primary', N'', N'登陆结果 - 账号或密码不正确', N'', N'2021-01-18 06:17:54', N'1', N'2022-02-16 13:24:27', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (41, 20, N'用户被禁用', N'20', N'system_login_result', 0, N'warning', N'', N'登陆结果 - 用户被禁用', N'', N'2021-01-18 06:17:54', N'1', N'2022-02-16 13:23:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (42, 30, N'验证码不存在', N'30', N'system_login_result', 0, N'info', N'', N'登陆结果 - 验证码不存在', N'', N'2021-01-18 06:17:54', N'1', N'2022-02-16 13:24:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (43, 31, N'验证码不正确', N'31', N'system_login_result', 0, N'info', N'', N'登陆结果 - 验证码不正确', N'', N'2021-01-18 06:17:54', N'1', N'2022-02-16 13:24:11', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (44, 100, N'未知异常', N'100', N'system_login_result', 0, N'danger', N'', N'登陆结果 - 未知异常', N'', N'2021-01-18 06:17:54', N'1', N'2022-02-16 13:24:23', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (45, 1, N'是', N'true', N'infra_boolean_string', 0, N'danger', N'', N'Boolean 是否类型 - 是', N'', N'2021-01-19 03:20:55', N'1', N'2022-03-15 23:01:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (46, 1, N'否', N'false', N'infra_boolean_string', 0, N'info', N'', N'Boolean 是否类型 - 否', N'', N'2021-01-19 03:20:55', N'1', N'2022-03-15 23:09:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (50, 1, N'单表(增删改查)', N'1', N'infra_codegen_template_type', 0, N'', N'', NULL, N'', N'2021-02-05 07:09:06', N'', N'2022-03-10 16:33:15', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (51, 2, N'树表(增删改查)', N'2', N'infra_codegen_template_type', 0, N'', N'', NULL, N'', N'2021-02-05 07:14:46', N'', N'2022-03-10 16:33:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (53, 0, N'初始化中', N'0', N'infra_job_status', 0, N'primary', N'', NULL, N'', N'2021-02-07 07:46:49', N'1', N'2022-02-16 19:33:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (57, 0, N'运行中', N'0', N'infra_job_log_status', 0, N'primary', N'', N'RUNNING', N'', N'2021-02-08 10:04:24', N'1', N'2022-02-16 19:07:48', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (58, 1, N'成功', N'1', N'infra_job_log_status', 0, N'success', N'', NULL, N'', N'2021-02-08 10:06:57', N'1', N'2022-02-16 19:07:52', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (59, 2, N'失败', N'2', N'infra_job_log_status', 0, N'warning', N'', N'失败', N'', N'2021-02-08 10:07:38', N'1', N'2022-02-16 19:07:56', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (60, 1, N'会员', N'1', N'user_type', 0, N'primary', N'', NULL, N'', N'2021-02-26 00:16:27', N'1', N'2022-02-16 10:22:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (61, 2, N'管理员', N'2', N'user_type', 0, N'success', N'', NULL, N'', N'2021-02-26 00:16:34', N'1', N'2022-02-16 10:22:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (62, 0, N'未处理', N'0', N'infra_api_error_log_process_status', 0, N'primary', N'', NULL, N'', N'2021-02-26 07:07:19', N'1', N'2022-02-16 20:14:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (63, 1, N'已处理', N'1', N'infra_api_error_log_process_status', 0, N'success', N'', NULL, N'', N'2021-02-26 07:07:26', N'1', N'2022-02-16 20:14:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (64, 2, N'已忽略', N'2', N'infra_api_error_log_process_status', 0, N'danger', N'', NULL, N'', N'2021-02-26 07:07:34', N'1', N'2022-02-16 20:14:14', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (66, 2, N'阿里云', N'ALIYUN', N'system_sms_channel_code', 0, N'primary', N'', NULL, N'1', N'2021-04-05 01:05:26', N'1', N'2022-02-16 10:09:52', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (67, 1, N'验证码', N'1', N'system_sms_template_type', 0, N'warning', N'', NULL, N'1', N'2021-04-05 21:50:57', N'1', N'2022-02-16 12:48:30', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (68, 2, N'通知', N'2', N'system_sms_template_type', 0, N'primary', N'', NULL, N'1', N'2021-04-05 21:51:08', N'1', N'2022-02-16 12:48:27', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (69, 0, N'营销', N'3', N'system_sms_template_type', 0, N'danger', N'', NULL, N'1', N'2021-04-05 21:51:15', N'1', N'2022-02-16 12:48:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (70, 0, N'初始化', N'0', N'system_sms_send_status', 0, N'primary', N'', NULL, N'1', N'2021-04-11 20:18:33', N'1', N'2022-02-16 10:26:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (71, 1, N'发送成功', N'10', N'system_sms_send_status', 0, N'success', N'', NULL, N'1', N'2021-04-11 20:18:43', N'1', N'2022-02-16 10:25:56', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (72, 2, N'发送失败', N'20', N'system_sms_send_status', 0, N'danger', N'', NULL, N'1', N'2021-04-11 20:18:49', N'1', N'2022-02-16 10:26:03', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (73, 3, N'不发送', N'30', N'system_sms_send_status', 0, N'info', N'', NULL, N'1', N'2021-04-11 20:19:44', N'1', N'2022-02-16 10:26:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (74, 0, N'等待结果', N'0', N'system_sms_receive_status', 0, N'primary', N'', NULL, N'1', N'2021-04-11 20:27:43', N'1', N'2022-02-16 10:28:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (75, 1, N'接收成功', N'10', N'system_sms_receive_status', 0, N'success', N'', NULL, N'1', N'2021-04-11 20:29:25', N'1', N'2022-02-16 10:28:28', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (76, 2, N'接收失败', N'20', N'system_sms_receive_status', 0, N'danger', N'', NULL, N'1', N'2021-04-11 20:29:31', N'1', N'2022-02-16 10:28:32', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (77, 0, N'调试(钉钉)', N'DEBUG_DING_TALK', N'system_sms_channel_code', 0, N'info', N'', NULL, N'1', N'2021-04-13 00:20:37', N'1', N'2022-02-16 10:10:00', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (80, 100, N'账号登录', N'100', N'system_login_type', 0, N'primary', N'', N'账号登录', N'1', N'2021-10-06 00:52:02', N'1', N'2022-02-16 13:11:34', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (81, 101, N'社交登录', N'101', N'system_login_type', 0, N'info', N'', N'社交登录', N'1', N'2021-10-06 00:52:17', N'1', N'2022-02-16 13:11:40', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (83, 200, N'主动登出', N'200', N'system_login_type', 0, N'primary', N'', N'主动登出', N'1', N'2021-10-06 00:52:58', N'1', N'2022-02-16 13:11:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (85, 202, N'强制登出', N'202', N'system_login_type', 0, N'danger', N'', N'强制退出', N'1', N'2021-10-06 00:53:41', N'1', N'2022-02-16 13:11:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (86, 0, N'病假', N'1', N'bpm_oa_leave_type', 0, N'primary', N'', NULL, N'1', N'2021-09-21 22:35:28', N'1', N'2022-02-16 10:00:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (87, 1, N'事假', N'2', N'bpm_oa_leave_type', 0, N'info', N'', NULL, N'1', N'2021-09-21 22:36:11', N'1', N'2022-02-16 10:00:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (88, 2, N'婚假', N'3', N'bpm_oa_leave_type', 0, N'warning', N'', NULL, N'1', N'2021-09-21 22:36:38', N'1', N'2022-02-16 10:00:53', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (113, 1, N'微信公众号支付', N'wx_pub', N'pay_channel_code', 0, N'success', N'', N'微信公众号支付', N'1', N'2021-12-03 10:40:24', N'1', N'2023-07-19 20:08:47', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (114, 2, N'微信小程序支付', N'wx_lite', N'pay_channel_code', 0, N'success', N'', N'微信小程序支付', N'1', N'2021-12-03 10:41:06', N'1', N'2023-07-19 20:08:50', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (115, 3, N'微信 App 支付', N'wx_app', N'pay_channel_code', 0, N'success', N'', N'微信 App 支付', N'1', N'2021-12-03 10:41:20', N'1', N'2023-07-19 20:08:56', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (116, 10, N'支付宝 PC 网站支付', N'alipay_pc', N'pay_channel_code', 0, N'primary', N'', N'支付宝 PC 网站支付', N'1', N'2021-12-03 10:42:09', N'1', N'2023-07-19 20:09:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (117, 11, N'支付宝 Wap 网站支付', N'alipay_wap', N'pay_channel_code', 0, N'primary', N'', N'支付宝 Wap 网站支付', N'1', N'2021-12-03 10:42:26', N'1', N'2023-07-19 20:09:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (118, 12, N'支付宝 App 支付', N'alipay_app', N'pay_channel_code', 0, N'primary', N'', N'支付宝 App 支付', N'1', N'2021-12-03 10:42:55', N'1', N'2023-07-19 20:09:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (119, 14, N'支付宝扫码支付', N'alipay_qr', N'pay_channel_code', 0, N'primary', N'', N'支付宝扫码支付', N'1', N'2021-12-03 10:43:10', N'1', N'2023-07-19 20:09:28', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (120, 10, N'通知成功', N'10', N'pay_notify_status', 0, N'success', N'', N'通知成功', N'1', N'2021-12-03 11:02:41', N'1', N'2023-07-19 10:08:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (121, 20, N'通知失败', N'20', N'pay_notify_status', 0, N'danger', N'', N'通知失败', N'1', N'2021-12-03 11:02:59', N'1', N'2023-07-19 10:08:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (122, 0, N'等待通知', N'0', N'pay_notify_status', 0, N'info', N'', N'未通知', N'1', N'2021-12-03 11:03:10', N'1', N'2023-07-19 10:08:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (123, 10, N'支付成功', N'10', N'pay_order_status', 0, N'success', N'', N'支付成功', N'1', N'2021-12-03 11:18:29', N'1', N'2023-07-19 18:04:28', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (124, 30, N'支付关闭', N'30', N'pay_order_status', 0, N'info', N'', N'支付关闭', N'1', N'2021-12-03 11:18:42', N'1', N'2023-07-19 18:05:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (125, 0, N'等待支付', N'0', N'pay_order_status', 0, N'info', N'', N'未支付', N'1', N'2021-12-03 11:18:18', N'1', N'2023-07-19 18:04:15', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (600, 5, N'首页', N'1', N'promotion_banner_position', 0, N'warning', N'', N'', N'1', N'2023-10-11 07:45:24', N'1', N'2023-10-11 07:45:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (601, 4, N'秒杀活动页', N'2', N'promotion_banner_position', 0, N'warning', N'', N'', N'1', N'2023-10-11 07:45:24', N'1', N'2023-10-11 07:45:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (602, 3, N'砍价活动页', N'3', N'promotion_banner_position', 0, N'warning', N'', N'', N'1', N'2023-10-11 07:45:24', N'1', N'2023-10-11 07:45:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (603, 2, N'限时折扣页', N'4', N'promotion_banner_position', 0, N'warning', N'', N'', N'1', N'2023-10-11 07:45:24', N'1', N'2023-10-11 07:45:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (604, 1, N'满减送页', N'5', N'promotion_banner_position', 0, N'warning', N'', N'', N'1', N'2023-10-11 07:45:24', N'1', N'2023-10-11 07:45:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1118, 0, N'等待退款', N'0', N'pay_refund_status', 0, N'info', N'', N'等待退款', N'1', N'2021-12-10 16:44:59', N'1', N'2023-07-19 10:14:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1119, 20, N'退款失败', N'20', N'pay_refund_status', 0, N'danger', N'', N'退款失败', N'1', N'2021-12-10 16:45:10', N'1', N'2023-07-19 10:15:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1124, 10, N'退款成功', N'10', N'pay_refund_status', 0, N'success', N'', N'退款成功', N'1', N'2021-12-10 16:46:26', N'1', N'2023-07-19 10:15:00', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1127, 1, N'审批中', N'1', N'bpm_process_instance_status', 0, N'default', N'', N'流程实例的状态 - 进行中', N'1', N'2022-01-07 23:47:22', N'1', N'2024-03-16 16:11:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1128, 2, N'审批通过', N'2', N'bpm_process_instance_status', 0, N'success', N'', N'流程实例的状态 - 已完成', N'1', N'2022-01-07 23:47:49', N'1', N'2024-03-16 16:11:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1129, 1, N'审批中', N'1', N'bpm_task_status', 0, N'primary', N'', N'流程实例的结果 - 处理中', N'1', N'2022-01-07 23:48:32', N'1', N'2024-03-08 22:41:37', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1130, 2, N'审批通过', N'2', N'bpm_task_status', 0, N'success', N'', N'流程实例的结果 - 通过', N'1', N'2022-01-07 23:48:45', N'1', N'2024-03-08 22:41:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1131, 3, N'审批不通过', N'3', N'bpm_task_status', 0, N'danger', N'', N'流程实例的结果 - 不通过', N'1', N'2022-01-07 23:48:55', N'1', N'2024-03-08 22:41:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1132, 4, N'已取消', N'4', N'bpm_task_status', 0, N'info', N'', N'流程实例的结果 - 撤销', N'1', N'2022-01-07 23:49:06', N'1', N'2024-03-08 22:41:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1133, 10, N'流程表单', N'10', N'bpm_model_form_type', 0, N'', N'', N'流程的表单类型 - 流程表单', N'103', N'2022-01-11 23:51:30', N'103', N'2022-01-11 23:51:30', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1134, 20, N'业务表单', N'20', N'bpm_model_form_type', 0, N'', N'', N'流程的表单类型 - 业务表单', N'103', N'2022-01-11 23:51:47', N'103', N'2022-01-11 23:51:47', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1135, 10, N'角色', N'10', N'bpm_task_candidate_strategy', 0, N'info', N'', N'任务分配规则的类型 - 角色', N'103', N'2022-01-12 23:21:22', N'1', N'2024-03-06 02:53:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1136, 20, N'部门的成员', N'20', N'bpm_task_candidate_strategy', 0, N'primary', N'', N'任务分配规则的类型 - 部门的成员', N'103', N'2022-01-12 23:21:47', N'1', N'2024-03-06 02:53:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1137, 21, N'部门的负责人', N'21', N'bpm_task_candidate_strategy', 0, N'primary', N'', N'任务分配规则的类型 - 部门的负责人', N'103', N'2022-01-12 23:33:36', N'1', N'2024-03-06 02:53:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1138, 30, N'用户', N'30', N'bpm_task_candidate_strategy', 0, N'info', N'', N'任务分配规则的类型 - 用户', N'103', N'2022-01-12 23:34:02', N'1', N'2024-03-06 02:53:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1139, 40, N'用户组', N'40', N'bpm_task_candidate_strategy', 0, N'warning', N'', N'任务分配规则的类型 - 用户组', N'103', N'2022-01-12 23:34:21', N'1', N'2024-03-06 02:53:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1140, 60, N'流程表达式', N'60', N'bpm_task_candidate_strategy', 0, N'danger', N'', N'任务分配规则的类型 - 流程表达式', N'103', N'2022-01-12 23:34:43', N'1', N'2024-03-06 02:53:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1141, 22, N'岗位', N'22', N'bpm_task_candidate_strategy', 0, N'success', N'', N'任务分配规则的类型 - 岗位', N'103', N'2022-01-14 18:41:55', N'1', N'2024-03-06 02:53:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1145, 1, N'管理后台', N'1', N'infra_codegen_scene', 0, N'', N'', N'代码生成的场景枚举 - 管理后台', N'1', N'2022-02-02 13:15:06', N'1', N'2022-03-10 16:32:59', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1146, 2, N'用户 APP', N'2', N'infra_codegen_scene', 0, N'', N'', N'代码生成的场景枚举 - 用户 APP', N'1', N'2022-02-02 13:15:19', N'1', N'2022-03-10 16:33:03', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1150, 1, N'数据库', N'1', N'infra_file_storage', 0, N'default', N'', NULL, N'1', N'2022-03-15 00:25:28', N'1', N'2022-03-15 00:25:28', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1151, 10, N'本地磁盘', N'10', N'infra_file_storage', 0, N'default', N'', NULL, N'1', N'2022-03-15 00:25:41', N'1', N'2022-03-15 00:25:56', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1152, 11, N'FTP 服务器', N'11', N'infra_file_storage', 0, N'default', N'', NULL, N'1', N'2022-03-15 00:26:06', N'1', N'2022-03-15 00:26:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1153, 12, N'SFTP 服务器', N'12', N'infra_file_storage', 0, N'default', N'', NULL, N'1', N'2022-03-15 00:26:22', N'1', N'2022-03-15 00:26:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1154, 20, N'S3 对象存储', N'20', N'infra_file_storage', 0, N'default', N'', NULL, N'1', N'2022-03-15 00:26:31', N'1', N'2022-03-15 00:26:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1155, 103, N'短信登录', N'103', N'system_login_type', 0, N'default', N'', NULL, N'1', N'2022-05-09 23:57:58', N'1', N'2022-05-09 23:58:09', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1156, 1, N'password', N'password', N'system_oauth2_grant_type', 0, N'default', N'', N'密码模式', N'1', N'2022-05-12 00:22:05', N'1', N'2022-05-11 16:26:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1157, 2, N'authorization_code', N'authorization_code', N'system_oauth2_grant_type', 0, N'primary', N'', N'授权码模式', N'1', N'2022-05-12 00:22:59', N'1', N'2022-05-11 16:26:02', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1158, 3, N'implicit', N'implicit', N'system_oauth2_grant_type', 0, N'success', N'', N'简化模式', N'1', N'2022-05-12 00:23:40', N'1', N'2022-05-11 16:26:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1159, 4, N'client_credentials', N'client_credentials', N'system_oauth2_grant_type', 0, N'default', N'', N'客户端模式', N'1', N'2022-05-12 00:23:51', N'1', N'2022-05-11 16:26:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1160, 5, N'refresh_token', N'refresh_token', N'system_oauth2_grant_type', 0, N'info', N'', N'刷新模式', N'1', N'2022-05-12 00:24:02', N'1', N'2022-05-11 16:26:11', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1162, 1, N'销售中', N'1', N'product_spu_status', 0, N'success', N'', N'商品 SPU 状态 - 销售中', N'1', N'2022-10-24 21:19:47', N'1', N'2022-10-24 21:20:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1163, 0, N'仓库中', N'0', N'product_spu_status', 0, N'info', N'', N'商品 SPU 状态 - 仓库中', N'1', N'2022-10-24 21:20:54', N'1', N'2022-10-24 21:21:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1164, 0, N'回收站', N'-1', N'product_spu_status', 0, N'default', N'', N'商品 SPU 状态 - 回收站', N'1', N'2022-10-24 21:21:11', N'1', N'2022-10-24 21:21:11', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1165, 1, N'满减', N'1', N'promotion_discount_type', 0, N'success', N'', N'优惠类型 - 满减', N'1', N'2022-11-01 12:46:41', N'1', N'2022-11-01 12:50:11', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1166, 2, N'折扣', N'2', N'promotion_discount_type', 0, N'primary', N'', N'优惠类型 - 折扣', N'1', N'2022-11-01 12:46:51', N'1', N'2022-11-01 12:50:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1167, 1, N'固定日期', N'1', N'promotion_coupon_template_validity_type', 0, N'default', N'', N'优惠劵模板的有限期类型 - 固定日期', N'1', N'2022-11-02 00:07:34', N'1', N'2022-11-04 00:07:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1168, 2, N'领取之后', N'2', N'promotion_coupon_template_validity_type', 0, N'default', N'', N'优惠劵模板的有限期类型 - 领取之后', N'1', N'2022-11-02 00:07:54', N'1', N'2022-11-04 00:07:52', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1169, 1, N'通用劵', N'1', N'promotion_product_scope', 0, N'default', N'', N'营销的商品范围 - 全部商品参与', N'1', N'2022-11-02 00:28:22', N'1', N'2023-09-28 00:27:42', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1170, 2, N'商品劵', N'2', N'promotion_product_scope', 0, N'default', N'', N'营销的商品范围 - 指定商品参与', N'1', N'2022-11-02 00:28:34', N'1', N'2023-09-28 00:27:44', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1171, 1, N'未使用', N'1', N'promotion_coupon_status', 0, N'primary', N'', N'优惠劵的状态 - 已领取', N'1', N'2022-11-04 00:15:08', N'1', N'2023-10-03 12:54:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1172, 2, N'已使用', N'2', N'promotion_coupon_status', 0, N'success', N'', N'优惠劵的状态 - 已使用', N'1', N'2022-11-04 00:15:21', N'1', N'2022-11-04 19:16:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1173, 3, N'已过期', N'3', N'promotion_coupon_status', 0, N'info', N'', N'优惠劵的状态 - 已过期', N'1', N'2022-11-04 00:15:43', N'1', N'2022-11-04 19:16:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1174, 1, N'直接领取', N'1', N'promotion_coupon_take_type', 0, N'primary', N'', N'优惠劵的领取方式 - 直接领取', N'1', N'2022-11-04 19:13:00', N'1', N'2022-11-04 19:13:25', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1175, 2, N'指定发放', N'2', N'promotion_coupon_take_type', 0, N'success', N'', N'优惠劵的领取方式 - 指定发放', N'1', N'2022-11-04 19:13:13', N'1', N'2022-11-04 19:14:48', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1176, 10, N'未开始', N'10', N'promotion_activity_status', 0, N'primary', N'', N'促销活动的状态枚举 - 未开始', N'1', N'2022-11-04 22:54:49', N'1', N'2022-11-04 22:55:53', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1177, 20, N'进行中', N'20', N'promotion_activity_status', 0, N'success', N'', N'促销活动的状态枚举 - 进行中', N'1', N'2022-11-04 22:55:06', N'1', N'2022-11-04 22:55:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1178, 30, N'已结束', N'30', N'promotion_activity_status', 0, N'info', N'', N'促销活动的状态枚举 - 已结束', N'1', N'2022-11-04 22:55:41', N'1', N'2022-11-04 22:55:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1179, 40, N'已关闭', N'40', N'promotion_activity_status', 0, N'warning', N'', N'促销活动的状态枚举 - 已关闭', N'1', N'2022-11-04 22:56:10', N'1', N'2022-11-04 22:56:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1180, 10, N'满 N 元', N'10', N'promotion_condition_type', 0, N'primary', N'', N'营销的条件类型 - 满 N 元', N'1', N'2022-11-04 22:59:45', N'1', N'2022-11-04 22:59:45', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1181, 20, N'满 N 件', N'20', N'promotion_condition_type', 0, N'success', N'', N'营销的条件类型 - 满 N 件', N'1', N'2022-11-04 23:00:02', N'1', N'2022-11-04 23:00:02', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1182, 10, N'申请售后', N'10', N'trade_after_sale_status', 0, N'primary', N'', N'交易售后状态 - 申请售后', N'1', N'2022-11-19 20:53:33', N'1', N'2022-11-19 20:54:42', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1183, 20, N'商品待退货', N'20', N'trade_after_sale_status', 0, N'primary', N'', N'交易售后状态 - 商品待退货', N'1', N'2022-11-19 20:54:36', N'1', N'2022-11-19 20:58:58', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1184, 30, N'商家待收货', N'30', N'trade_after_sale_status', 0, N'primary', N'', N'交易售后状态 - 商家待收货', N'1', N'2022-11-19 20:56:56', N'1', N'2022-11-19 20:59:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1185, 40, N'等待退款', N'40', N'trade_after_sale_status', 0, N'primary', N'', N'交易售后状态 - 等待退款', N'1', N'2022-11-19 20:59:54', N'1', N'2022-11-19 21:00:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1186, 50, N'退款成功', N'50', N'trade_after_sale_status', 0, N'default', N'', N'交易售后状态 - 退款成功', N'1', N'2022-11-19 21:00:33', N'1', N'2022-11-19 21:00:33', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1187, 61, N'买家取消', N'61', N'trade_after_sale_status', 0, N'info', N'', N'交易售后状态 - 买家取消', N'1', N'2022-11-19 21:01:29', N'1', N'2022-11-19 21:01:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1188, 62, N'商家拒绝', N'62', N'trade_after_sale_status', 0, N'info', N'', N'交易售后状态 - 商家拒绝', N'1', N'2022-11-19 21:02:17', N'1', N'2022-11-19 21:02:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1189, 63, N'商家拒收货', N'63', N'trade_after_sale_status', 0, N'info', N'', N'交易售后状态 - 商家拒收货', N'1', N'2022-11-19 21:02:37', N'1', N'2022-11-19 21:03:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1190, 10, N'售中退款', N'10', N'trade_after_sale_type', 0, N'success', N'', N'交易售后的类型 - 售中退款', N'1', N'2022-11-19 21:05:05', N'1', N'2022-11-19 21:38:23', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1191, 20, N'售后退款', N'20', N'trade_after_sale_type', 0, N'primary', N'', N'交易售后的类型 - 售后退款', N'1', N'2022-11-19 21:05:32', N'1', N'2022-11-19 21:38:32', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1192, 10, N'仅退款', N'10', N'trade_after_sale_way', 0, N'primary', N'', N'交易售后的方式 - 仅退款', N'1', N'2022-11-19 21:39:19', N'1', N'2022-11-19 21:39:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1193, 20, N'退货退款', N'20', N'trade_after_sale_way', 0, N'success', N'', N'交易售后的方式 - 退货退款', N'1', N'2022-11-19 21:39:38', N'1', N'2022-11-19 21:39:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1194, 10, N'微信小程序', N'10', N'terminal', 0, N'default', N'', N'终端 - 微信小程序', N'1', N'2022-12-10 10:51:11', N'1', N'2022-12-10 10:51:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1195, 20, N'H5 网页', N'20', N'terminal', 0, N'default', N'', N'终端 - H5 网页', N'1', N'2022-12-10 10:51:30', N'1', N'2022-12-10 10:51:59', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1196, 11, N'微信公众号', N'11', N'terminal', 0, N'default', N'', N'终端 - 微信公众号', N'1', N'2022-12-10 10:54:16', N'1', N'2022-12-10 10:52:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1197, 31, N'苹果 App', N'31', N'terminal', 0, N'default', N'', N'终端 - 苹果 App', N'1', N'2022-12-10 10:54:42', N'1', N'2022-12-10 10:52:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1198, 32, N'安卓 App', N'32', N'terminal', 0, N'default', N'', N'终端 - 安卓 App', N'1', N'2022-12-10 10:55:02', N'1', N'2022-12-10 10:59:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1199, 0, N'普通订单', N'0', N'trade_order_type', 0, N'default', N'', N'交易订单的类型 - 普通订单', N'1', N'2022-12-10 16:34:14', N'1', N'2022-12-10 16:34:14', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1200, 1, N'秒杀订单', N'1', N'trade_order_type', 0, N'default', N'', N'交易订单的类型 - 秒杀订单', N'1', N'2022-12-10 16:34:26', N'1', N'2022-12-10 16:34:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1201, 2, N'拼团订单', N'2', N'trade_order_type', 0, N'default', N'', N'交易订单的类型 - 拼团订单', N'1', N'2022-12-10 16:34:36', N'1', N'2022-12-10 16:34:36', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1202, 3, N'砍价订单', N'3', N'trade_order_type', 0, N'default', N'', N'交易订单的类型 - 砍价订单', N'1', N'2022-12-10 16:34:48', N'1', N'2022-12-10 16:34:48', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1203, 0, N'待支付', N'0', N'trade_order_status', 0, N'default', N'', N'交易订单状态 - 待支付', N'1', N'2022-12-10 16:49:29', N'1', N'2022-12-10 16:49:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1204, 10, N'待发货', N'10', N'trade_order_status', 0, N'primary', N'', N'交易订单状态 - 待发货', N'1', N'2022-12-10 16:49:53', N'1', N'2022-12-10 16:51:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1205, 20, N'已发货', N'20', N'trade_order_status', 0, N'primary', N'', N'交易订单状态 - 已发货', N'1', N'2022-12-10 16:50:13', N'1', N'2022-12-10 16:51:31', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1206, 30, N'已完成', N'30', N'trade_order_status', 0, N'success', N'', N'交易订单状态 - 已完成', N'1', N'2022-12-10 16:50:30', N'1', N'2022-12-10 16:51:06', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1207, 40, N'已取消', N'40', N'trade_order_status', 0, N'danger', N'', N'交易订单状态 - 已取消', N'1', N'2022-12-10 16:50:50', N'1', N'2022-12-10 16:51:00', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1208, 0, N'未售后', N'0', N'trade_order_item_after_sale_status', 0, N'info', N'', N'交易订单项的售后状态 - 未售后', N'1', N'2022-12-10 20:58:42', N'1', N'2022-12-10 20:59:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1209, 1, N'售后中', N'1', N'trade_order_item_after_sale_status', 0, N'primary', N'', N'交易订单项的售后状态 - 售后中', N'1', N'2022-12-10 20:59:21', N'1', N'2022-12-10 20:59:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1210, 2, N'已退款', N'2', N'trade_order_item_after_sale_status', 0, N'success', N'', N'交易订单项的售后状态 - 已退款', N'1', N'2022-12-10 20:59:46', N'1', N'2022-12-10 20:59:46', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1211, 1, N'完全匹配', N'1', N'mp_auto_reply_request_match', 0, N'primary', N'', N'公众号自动回复的请求关键字匹配模式 - 完全匹配', N'1', N'2023-01-16 23:30:39', N'1', N'2023-01-16 23:31:00', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1212, 2, N'半匹配', N'2', N'mp_auto_reply_request_match', 0, N'success', N'', N'公众号自动回复的请求关键字匹配模式 - 半匹配', N'1', N'2023-01-16 23:30:55', N'1', N'2023-01-16 23:31:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1213, 1, N'文本', N'text', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 文本', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 22:17:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1214, 2, N'图片', N'image', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 图片', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:19:47', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1215, 3, N'语音', N'voice', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 语音', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:20:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1216, 4, N'视频', N'video', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 视频', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:21:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1217, 5, N'小视频', N'shortvideo', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 小视频', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:19:59', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1218, 6, N'图文', N'news', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 图文', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:22:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1219, 7, N'音乐', N'music', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 音乐', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:22:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1220, 8, N'地理位置', N'location', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 地理位置', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:23:51', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1221, 9, N'链接', N'link', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 链接', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:24:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1222, 10, N'事件', N'event', N'mp_message_type', 0, N'default', N'', N'公众号的消息类型 - 事件', N'1', N'2023-01-17 22:17:32', N'1', N'2023-01-17 14:24:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1223, 0, N'初始化', N'0', N'system_mail_send_status', 0, N'primary', N'', N'邮件发送状态 - 初始化\n', N'1', N'2023-01-26 09:53:49', N'1', N'2023-01-26 16:36:14', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1224, 10, N'发送成功', N'10', N'system_mail_send_status', 0, N'success', N'', N'邮件发送状态 - 发送成功', N'1', N'2023-01-26 09:54:28', N'1', N'2023-01-26 16:36:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1225, 20, N'发送失败', N'20', N'system_mail_send_status', 0, N'danger', N'', N'邮件发送状态 - 发送失败', N'1', N'2023-01-26 09:54:50', N'1', N'2023-01-26 16:36:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1226, 30, N'不发送', N'30', N'system_mail_send_status', 0, N'info', N'', N'邮件发送状态 - 不发送', N'1', N'2023-01-26 09:55:06', N'1', N'2023-01-26 16:36:36', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1227, 1, N'通知公告', N'1', N'system_notify_template_type', 0, N'primary', N'', N'站内信模版的类型 - 通知公告', N'1', N'2023-01-28 10:35:59', N'1', N'2023-01-28 10:35:59', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1228, 2, N'系统消息', N'2', N'system_notify_template_type', 0, N'success', N'', N'站内信模版的类型 - 系统消息', N'1', N'2023-01-28 10:36:20', N'1', N'2023-01-28 10:36:25', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1230, 13, N'支付宝条码支付', N'alipay_bar', N'pay_channel_code', 0, N'primary', N'', N'支付宝条码支付', N'1', N'2023-02-18 23:32:24', N'1', N'2023-07-19 20:09:23', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1231, 10, N'Vue2 Element UI 标准模版', N'10', N'infra_codegen_front_type', 0, N'', N'', N'', N'1', N'2023-04-13 00:03:55', N'1', N'2023-04-13 00:03:55', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1232, 20, N'Vue3 Element Plus 标准模版', N'20', N'infra_codegen_front_type', 0, N'', N'', N'', N'1', N'2023-04-13 00:04:08', N'1', N'2023-04-13 00:04:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1233, 21, N'Vue3 Element Plus Schema 模版', N'21', N'infra_codegen_front_type', 0, N'', N'', N'', N'1', N'2023-04-13 00:04:26', N'1', N'2023-04-13 00:04:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1234, 30, N'Vue3 vben 模版', N'30', N'infra_codegen_front_type', 0, N'', N'', N'', N'1', N'2023-04-13 00:04:26', N'1', N'2023-04-13 00:04:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1244, 0, N'按件', N'1', N'trade_delivery_express_charge_mode', 0, N'', N'', N'', N'1', N'2023-05-21 22:46:40', N'1', N'2023-05-21 22:46:40', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1245, 1, N'按重量', N'2', N'trade_delivery_express_charge_mode', 0, N'', N'', N'', N'1', N'2023-05-21 22:46:58', N'1', N'2023-05-21 22:46:58', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1246, 2, N'按体积', N'3', N'trade_delivery_express_charge_mode', 0, N'', N'', N'', N'1', N'2023-05-21 22:47:18', N'1', N'2023-05-21 22:47:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1335, 11, N'订单积分抵扣', N'11', N'member_point_biz_type', 0, N'', N'', N'', N'1', N'2023-06-10 12:15:27', N'1', N'2023-10-11 07:41:43', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1336, 1, N'签到', N'1', N'member_point_biz_type', 0, N'', N'', N'', N'1', N'2023-06-10 12:15:48', N'1', N'2023-08-20 11:59:53', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1341, 20, N'已退款', N'20', N'pay_order_status', 0, N'danger', N'', N'已退款', N'1', N'2023-07-19 18:05:37', N'1', N'2023-07-19 18:05:37', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1342, 21, N'请求成功,但是结果失败', N'21', N'pay_notify_status', 0, N'warning', N'', N'请求成功,但是结果失败', N'1', N'2023-07-19 18:10:47', N'1', N'2023-07-19 18:11:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1343, 22, N'请求失败', N'22', N'pay_notify_status', 0, N'warning', N'', NULL, N'1', N'2023-07-19 18:11:05', N'1', N'2023-07-19 18:11:27', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1344, 4, N'微信扫码支付', N'wx_native', N'pay_channel_code', 0, N'success', N'', N'微信扫码支付', N'1', N'2023-07-19 20:07:47', N'1', N'2023-07-19 20:09:03', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1345, 5, N'微信条码支付', N'wx_bar', N'pay_channel_code', 0, N'success', N'', N'微信条码支付\n', N'1', N'2023-07-19 20:08:06', N'1', N'2023-07-19 20:09:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1346, 1, N'支付单', N'1', N'pay_notify_type', 0, N'primary', N'', N'支付单', N'1', N'2023-07-20 12:23:17', N'1', N'2023-07-20 12:23:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1347, 2, N'退款单', N'2', N'pay_notify_type', 0, N'danger', N'', NULL, N'1', N'2023-07-20 12:23:26', N'1', N'2023-07-20 12:23:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1348, 20, N'模拟支付', N'mock', N'pay_channel_code', 0, N'default', N'', N'模拟支付', N'1', N'2023-07-29 11:10:51', N'1', N'2023-07-29 03:14:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1349, 12, N'订单积分抵扣(整单取消)', N'12', N'member_point_biz_type', 0, N'', N'', N'', N'1', N'2023-08-20 12:00:03', N'1', N'2023-10-11 07:42:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1350, 0, N'管理员调整', N'0', N'member_experience_biz_type', 0, N'', N'', NULL, N'', N'2023-08-22 12:41:01', N'', N'2023-08-22 12:41:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1351, 1, N'邀新奖励', N'1', N'member_experience_biz_type', 0, N'', N'', NULL, N'', N'2023-08-22 12:41:01', N'', N'2023-08-22 12:41:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1352, 11, N'下单奖励', N'11', N'member_experience_biz_type', 0, N'success', N'', NULL, N'', N'2023-08-22 12:41:01', N'1', N'2023-10-11 07:45:09', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1353, 12, N'下单奖励(整单取消)', N'12', N'member_experience_biz_type', 0, N'warning', N'', NULL, N'', N'2023-08-22 12:41:01', N'1', N'2023-10-11 07:45:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1354, 4, N'签到奖励', N'4', N'member_experience_biz_type', 0, N'', N'', NULL, N'', N'2023-08-22 12:41:01', N'', N'2023-08-22 12:41:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1355, 5, N'抽奖奖励', N'5', N'member_experience_biz_type', 0, N'', N'', NULL, N'', N'2023-08-22 12:41:01', N'', N'2023-08-22 12:41:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1356, 1, N'快递发货', N'1', N'trade_delivery_type', 0, N'', N'', N'', N'1', N'2023-08-23 00:04:55', N'1', N'2023-08-23 00:04:55', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1357, 2, N'用户自提', N'2', N'trade_delivery_type', 0, N'', N'', N'', N'1', N'2023-08-23 00:05:05', N'1', N'2023-08-23 00:05:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1358, 3, N'品类劵', N'3', N'promotion_product_scope', 0, N'default', N'', N'', N'1', N'2023-09-01 23:43:07', N'1', N'2023-09-28 00:27:47', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1359, 1, N'人人分销', N'1', N'brokerage_enabled_condition', 0, N'', N'', N'所有用户都可以分销', N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1360, 2, N'指定分销', N'2', N'brokerage_enabled_condition', 0, N'', N'', N'仅可后台手动设置推广员', N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1361, 1, N'首次绑定', N'1', N'brokerage_bind_mode', 0, N'', N'', N'只要用户没有推广人,随时都可以绑定推广关系', N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1362, 2, N'注册绑定', N'2', N'brokerage_bind_mode', 0, N'', N'', N'仅新用户注册时才能绑定推广关系', N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1363, 3, N'覆盖绑定', N'3', N'brokerage_bind_mode', 0, N'', N'', N'如果用户已经有推广人,推广人会被变更', N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1364, 1, N'钱包', N'1', N'brokerage_withdraw_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1365, 2, N'银行卡', N'2', N'brokerage_withdraw_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1366, 3, N'微信', N'3', N'brokerage_withdraw_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1367, 4, N'支付宝', N'4', N'brokerage_withdraw_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1368, 1, N'订单返佣', N'1', N'brokerage_record_biz_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1369, 2, N'申请提现', N'2', N'brokerage_record_biz_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1370, 3, N'申请提现驳回', N'3', N'brokerage_record_biz_type', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1371, 0, N'待结算', N'0', N'brokerage_record_status', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1372, 1, N'已结算', N'1', N'brokerage_record_status', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1373, 2, N'已取消', N'2', N'brokerage_record_status', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1374, 0, N'审核中', N'0', N'brokerage_withdraw_status', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1375, 10, N'审核通过', N'10', N'brokerage_withdraw_status', 0, N'success', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1376, 11, N'提现成功', N'11', N'brokerage_withdraw_status', 0, N'success', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1377, 20, N'审核不通过', N'20', N'brokerage_withdraw_status', 0, N'danger', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1378, 21, N'提现失败', N'21', N'brokerage_withdraw_status', 0, N'danger', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1379, 0, N'工商银行', N'0', N'brokerage_bank_name', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1380, 1, N'建设银行', N'1', N'brokerage_bank_name', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1381, 2, N'农业银行', N'2', N'brokerage_bank_name', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1382, 3, N'中国银行', N'3', N'brokerage_bank_name', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1383, 4, N'交通银行', N'4', N'brokerage_bank_name', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1384, 5, N'招商银行', N'5', N'brokerage_bank_name', 0, N'', N'', NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1385, 21, N'钱包', N'wallet', N'pay_channel_code', 0, N'primary', N'', N'', N'1', N'2023-10-01 21:46:19', N'1', N'2023-10-01 21:48:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1386, 1, N'砍价中', N'1', N'promotion_bargain_record_status', 0, N'default', N'', N'', N'1', N'2023-10-05 10:41:26', N'1', N'2023-10-05 10:41:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1387, 2, N'砍价成功', N'2', N'promotion_bargain_record_status', 0, N'success', N'', N'', N'1', N'2023-10-05 10:41:39', N'1', N'2023-10-05 10:41:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1388, 3, N'砍价失败', N'3', N'promotion_bargain_record_status', 0, N'warning', N'', N'', N'1', N'2023-10-05 10:41:57', N'1', N'2023-10-05 10:41:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1389, 1, N'拼团中', N'1', N'promotion_combination_record_status', 0, N'', N'', N'', N'1', N'2023-10-08 07:24:44', N'1', N'2023-10-08 07:24:44', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1390, 2, N'拼团成功', N'2', N'promotion_combination_record_status', 0, N'success', N'', N'', N'1', N'2023-10-08 07:24:56', N'1', N'2023-10-08 07:24:56', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1391, 3, N'拼团失败', N'3', N'promotion_combination_record_status', 0, N'warning', N'', N'', N'1', N'2023-10-08 07:25:11', N'1', N'2023-10-08 07:25:11', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1392, 2, N'管理员修改', N'2', N'member_point_biz_type', 0, N'default', N'', N'', N'1', N'2023-10-11 07:41:34', N'1', N'2023-10-11 07:41:34', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1393, 13, N'订单积分抵扣(单个退款)', N'13', N'member_point_biz_type', 0, N'', N'', N'', N'1', N'2023-10-11 07:42:29', N'1', N'2023-10-11 07:42:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1394, 21, N'订单积分奖励', N'21', N'member_point_biz_type', 0, N'default', N'', N'', N'1', N'2023-10-11 07:42:44', N'1', N'2023-10-11 07:42:44', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1395, 22, N'订单积分奖励(整单取消)', N'22', N'member_point_biz_type', 0, N'default', N'', N'', N'1', N'2023-10-11 07:42:55', N'1', N'2023-10-11 07:43:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1396, 23, N'订单积分奖励(单个退款)', N'23', N'member_point_biz_type', 0, N'default', N'', N'', N'1', N'2023-10-11 07:43:16', N'1', N'2023-10-11 07:43:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1397, 13, N'下单奖励(单个退款)', N'13', N'member_experience_biz_type', 0, N'warning', N'', N'', N'1', N'2023-10-11 07:45:24', N'1', N'2023-10-11 07:45:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1398, 5, N'网上转账', N'5', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:55:24', N'1', N'2023-10-18 21:55:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1399, 6, N'支付宝', N'6', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:55:38', N'1', N'2023-10-18 21:55:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1400, 7, N'微信支付', N'7', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:55:53', N'1', N'2023-10-18 21:55:53', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1401, 8, N'其他', N'8', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:56:06', N'1', N'2023-10-18 21:56:06', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1402, 1, N'IT', N'1', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:02:15', N'1', N'2024-02-18 23:30:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1403, 2, N'金融业', N'2', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:02:29', N'1', N'2024-02-18 23:30:43', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1404, 3, N'房地产', N'3', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:02:41', N'1', N'2024-02-18 23:30:48', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1405, 4, N'商业服务', N'4', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:02:54', N'1', N'2024-02-18 23:30:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1406, 5, N'运输/物流', N'5', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:03:03', N'1', N'2024-02-18 23:31:00', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1407, 6, N'生产', N'6', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:03:13', N'1', N'2024-02-18 23:31:08', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1408, 7, N'政府', N'7', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:03:27', N'1', N'2024-02-18 23:31:13', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1409, 8, N'文化传媒', N'8', N'crm_customer_industry', 0, N'default', N'', N'', N'1', N'2023-10-28 23:03:37', N'1', N'2024-02-18 23:31:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1422, 1, N'A (重点客户)', N'1', N'crm_customer_level', 0, N'primary', N'', N'', N'1', N'2023-10-28 23:07:13', N'1', N'2023-10-28 23:07:13', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1423, 2, N'B (普通客户)', N'2', N'crm_customer_level', 0, N'info', N'', N'', N'1', N'2023-10-28 23:07:35', N'1', N'2023-10-28 23:07:35', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1424, 3, N'C (非优先客户)', N'3', N'crm_customer_level', 0, N'default', N'', N'', N'1', N'2023-10-28 23:07:53', N'1', N'2023-10-28 23:07:53', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1425, 1, N'促销', N'1', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:08:29', N'1', N'2023-10-28 23:08:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1426, 2, N'搜索引擎', N'2', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:08:39', N'1', N'2023-10-28 23:08:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1427, 3, N'广告', N'3', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:08:47', N'1', N'2023-10-28 23:08:47', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1428, 4, N'转介绍', N'4', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:08:58', N'1', N'2023-10-28 23:08:58', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1429, 5, N'线上注册', N'5', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:09:12', N'1', N'2023-10-28 23:09:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1430, 6, N'线上咨询', N'6', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:09:22', N'1', N'2023-10-28 23:09:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1431, 7, N'预约上门', N'7', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:09:39', N'1', N'2023-10-28 23:09:39', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1432, 8, N'陌拜', N'8', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:10:04', N'1', N'2023-10-28 23:10:04', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1433, 9, N'电话咨询', N'9', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:10:18', N'1', N'2023-10-28 23:10:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1434, 10, N'邮件咨询', N'10', N'crm_customer_source', 0, N'default', N'', N'', N'1', N'2023-10-28 23:10:33', N'1', N'2023-10-28 23:10:33', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1435, 10, N'Gitee', N'10', N'system_social_type', 0, N'', N'', N'', N'1', N'2023-11-04 13:04:42', N'1', N'2023-11-04 13:04:42', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1436, 20, N'钉钉', N'20', N'system_social_type', 0, N'', N'', N'', N'1', N'2023-11-04 13:04:54', N'1', N'2023-11-04 13:04:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1437, 30, N'企业微信', N'30', N'system_social_type', 0, N'', N'', N'', N'1', N'2023-11-04 13:05:09', N'1', N'2023-11-04 13:05:09', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1438, 31, N'微信公众平台', N'31', N'system_social_type', 0, N'', N'', N'', N'1', N'2023-11-04 13:05:18', N'1', N'2023-11-04 13:05:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1439, 32, N'微信开放平台', N'32', N'system_social_type', 0, N'', N'', N'', N'1', N'2023-11-04 13:05:30', N'1', N'2023-11-04 13:05:30', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1440, 34, N'微信小程序', N'34', N'system_social_type', 0, N'', N'', N'', N'1', N'2023-11-04 13:05:38', N'1', N'2023-11-04 13:07:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1441, 1, N'上架', N'1', N'crm_product_status', 0, N'success', N'', N'', N'1', N'2023-10-30 21:49:34', N'1', N'2023-10-30 21:49:34', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1442, 0, N'下架', N'0', N'crm_product_status', 0, N'success', N'', N'', N'1', N'2023-10-30 21:49:13', N'1', N'2023-10-30 21:49:13', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1443, 15, N'子表', N'15', N'infra_codegen_template_type', 0, N'default', N'', N'', N'1', N'2023-11-13 23:06:16', N'1', N'2023-11-13 23:06:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1444, 10, N'主表(标准模式)', N'10', N'infra_codegen_template_type', 0, N'default', N'', N'', N'1', N'2023-11-14 12:32:49', N'1', N'2023-11-14 12:32:49', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1445, 11, N'主表(ERP 模式)', N'11', N'infra_codegen_template_type', 0, N'default', N'', N'', N'1', N'2023-11-14 12:33:05', N'1', N'2023-11-14 12:33:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1446, 12, N'主表(内嵌模式)', N'12', N'infra_codegen_template_type', 0, N'', N'', N'', N'1', N'2023-11-14 12:33:31', N'1', N'2023-11-14 12:33:31', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1447, 1, N'负责人', N'1', N'crm_permission_level', 0, N'default', N'', N'', N'1', N'2023-11-30 09:53:12', N'1', N'2023-11-30 09:53:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1448, 2, N'只读', N'2', N'crm_permission_level', 0, N'', N'', N'', N'1', N'2023-11-30 09:53:29', N'1', N'2023-11-30 09:53:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1449, 3, N'读写', N'3', N'crm_permission_level', 0, N'', N'', N'', N'1', N'2023-11-30 09:53:36', N'1', N'2023-11-30 09:53:36', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1450, 0, N'未提交', N'0', N'crm_audit_status', 0, N'', N'', N'', N'1', N'2023-11-30 18:56:59', N'1', N'2023-11-30 18:56:59', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1451, 10, N'审批中', N'10', N'crm_audit_status', 0, N'', N'', N'', N'1', N'2023-11-30 18:57:10', N'1', N'2023-11-30 18:57:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1452, 20, N'审核通过', N'20', N'crm_audit_status', 0, N'', N'', N'', N'1', N'2023-11-30 18:57:24', N'1', N'2023-11-30 18:57:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1453, 30, N'审核不通过', N'30', N'crm_audit_status', 0, N'', N'', N'', N'1', N'2023-11-30 18:57:32', N'1', N'2023-11-30 18:57:32', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1454, 40, N'已取消', N'40', N'crm_audit_status', 0, N'', N'', N'', N'1', N'2023-11-30 18:57:42', N'1', N'2023-11-30 18:57:42', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1456, 1, N'支票', N'1', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:54:29', N'1', N'2023-10-18 21:54:29', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1457, 2, N'现金', N'2', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:54:41', N'1', N'2023-10-18 21:54:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1458, 3, N'邮政汇款', N'3', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:54:53', N'1', N'2023-10-18 21:54:53', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1459, 4, N'电汇', N'4', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:55:07', N'1', N'2023-10-18 21:55:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1460, 5, N'网上转账', N'5', N'crm_receivable_return_type', 0, N'default', N'', N'', N'1', N'2023-10-18 21:55:24', N'1', N'2023-10-18 21:55:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1461, 1, N'个', N'1', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:02:26', N'1', N'2023-12-05 23:02:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1462, 2, N'块', N'2', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:02:34', N'1', N'2023-12-05 23:02:34', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1463, 3, N'只', N'3', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:02:57', N'1', N'2023-12-05 23:02:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1464, 4, N'把', N'4', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:03:05', N'1', N'2023-12-05 23:03:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1465, 5, N'枚', N'5', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:03:14', N'1', N'2023-12-05 23:03:14', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1466, 6, N'瓶', N'6', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:03:20', N'1', N'2023-12-05 23:03:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1467, 7, N'盒', N'7', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:03:30', N'1', N'2023-12-05 23:03:30', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1468, 8, N'台', N'8', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:03:41', N'1', N'2023-12-05 23:03:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1469, 9, N'吨', N'9', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:03:48', N'1', N'2023-12-05 23:03:48', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1470, 10, N'千克', N'10', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:04:03', N'1', N'2023-12-05 23:04:03', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1471, 11, N'米', N'11', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:04:12', N'1', N'2023-12-05 23:04:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1472, 12, N'箱', N'12', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:04:25', N'1', N'2023-12-05 23:04:25', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1473, 13, N'套', N'13', N'crm_product_unit', 0, N'', N'', N'', N'1', N'2023-12-05 23:04:34', N'1', N'2023-12-05 23:04:34', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1474, 1, N'打电话', N'1', N'crm_follow_up_type', 0, N'', N'', N'', N'1', N'2024-01-15 20:48:20', N'1', N'2024-01-15 20:48:20', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1475, 2, N'发短信', N'2', N'crm_follow_up_type', 0, N'', N'', N'', N'1', N'2024-01-15 20:48:31', N'1', N'2024-01-15 20:48:31', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1476, 3, N'上门拜访', N'3', N'crm_follow_up_type', 0, N'', N'', N'', N'1', N'2024-01-15 20:49:07', N'1', N'2024-01-15 20:49:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1477, 4, N'微信沟通', N'4', N'crm_follow_up_type', 0, N'', N'', N'', N'1', N'2024-01-15 20:49:15', N'1', N'2024-01-15 20:49:15', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1478, 4, N'钱包余额', N'4', N'pay_transfer_type', 0, N'info', N'', N'', N'1', N'2023-10-28 16:28:37', N'1', N'2023-10-28 16:28:37', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1479, 3, N'银行卡', N'3', N'pay_transfer_type', 0, N'default', N'', N'', N'1', N'2023-10-28 16:28:21', N'1', N'2023-10-28 16:28:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1480, 2, N'微信余额', N'2', N'pay_transfer_type', 0, N'info', N'', N'', N'1', N'2023-10-28 16:28:07', N'1', N'2023-10-28 16:28:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1481, 1, N'支付宝余额', N'1', N'pay_transfer_type', 0, N'default', N'', N'', N'1', N'2023-10-28 16:27:44', N'1', N'2023-10-28 16:27:44', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1482, 4, N'转账失败', N'30', N'pay_transfer_status', 0, N'warning', N'', N'', N'1', N'2023-10-28 16:24:16', N'1', N'2023-10-28 16:24:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1483, 3, N'转账成功', N'20', N'pay_transfer_status', 0, N'success', N'', N'', N'1', N'2023-10-28 16:23:50', N'1', N'2023-10-28 16:23:50', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1484, 2, N'转账进行中', N'10', N'pay_transfer_status', 0, N'info', N'', N'', N'1', N'2023-10-28 16:23:12', N'1', N'2023-10-28 16:23:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1485, 1, N'等待转账', N'0', N'pay_transfer_status', 0, N'default', N'', N'', N'1', N'2023-10-28 16:21:43', N'1', N'2023-10-28 16:23:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1486, 10, N'其它入库', N'10', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-05 18:07:25', N'1', N'2024-02-05 18:07:43', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1487, 11, N'其它入库(作废)', N'11', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-05 18:08:07', N'1', N'2024-02-05 19:20:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1488, 20, N'其它出库', N'20', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-05 18:08:51', N'1', N'2024-02-05 18:08:51', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1489, 21, N'其它出库(作废)', N'21', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-05 18:09:00', N'1', N'2024-02-05 19:20:10', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1490, 10, N'未审核', N'10', N'erp_audit_status', 0, N'default', N'', N'', N'1', N'2024-02-06 00:00:21', N'1', N'2024-02-06 00:00:21', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1491, 20, N'已审核', N'20', N'erp_audit_status', 0, N'success', N'', N'', N'1', N'2024-02-06 00:00:35', N'1', N'2024-02-06 00:00:35', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1492, 30, N'调拨入库', N'30', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-07 20:34:19', N'1', N'2024-02-07 12:36:31', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1493, 31, N'调拨入库(作废)', N'31', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-07 20:34:29', N'1', N'2024-02-07 20:37:11', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1494, 32, N'调拨出库', N'32', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-07 20:34:38', N'1', N'2024-02-07 12:36:33', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1495, 33, N'调拨出库(作废)', N'33', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-07 20:34:49', N'1', N'2024-02-07 20:37:06', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1496, 40, N'盘盈入库', N'40', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-08 08:53:00', N'1', N'2024-02-08 08:53:09', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1497, 41, N'盘盈入库(作废)', N'41', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-08 08:53:39', N'1', N'2024-02-16 19:40:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1498, 42, N'盘亏出库', N'42', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-08 08:54:16', N'1', N'2024-02-08 08:54:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1499, 43, N'盘亏出库(作废)', N'43', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-08 08:54:31', N'1', N'2024-02-16 19:40:46', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1500, 50, N'销售出库', N'50', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-11 21:47:25', N'1', N'2024-02-11 21:50:40', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1501, 51, N'销售出库(作废)', N'51', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-11 21:47:37', N'1', N'2024-02-11 21:51:12', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1502, 60, N'销售退货入库', N'60', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-12 06:51:05', N'1', N'2024-02-12 06:51:05', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1503, 61, N'销售退货入库(作废)', N'61', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-12 06:51:18', N'1', N'2024-02-12 06:51:18', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1504, 70, N'采购入库', N'70', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-16 13:10:02', N'1', N'2024-02-16 13:10:02', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1505, 71, N'采购入库(作废)', N'71', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-16 13:10:10', N'1', N'2024-02-16 19:40:40', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1506, 80, N'采购退货出库', N'80', N'erp_stock_record_biz_type', 0, N'', N'', N'', N'1', N'2024-02-16 13:10:17', N'1', N'2024-02-16 13:10:17', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1507, 81, N'采购退货出库(作废)', N'81', N'erp_stock_record_biz_type', 0, N'danger', N'', N'', N'1', N'2024-02-16 13:10:26', N'1', N'2024-02-16 19:40:33', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1509, 3, N'审批不通过', N'3', N'bpm_process_instance_status', 0, N'danger', N'', N'', N'1', N'2024-03-16 16:12:06', N'1', N'2024-03-16 16:12:06', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1510, 4, N'已取消', N'4', N'bpm_process_instance_status', 0, N'warning', N'', N'', N'1', N'2024-03-16 16:12:22', N'1', N'2024-03-16 16:12:22', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1511, 5, N'已退回', N'5', N'bpm_task_status', 0, N'warning', N'', N'', N'1', N'2024-03-16 19:10:46', N'1', N'2024-03-08 22:41:40', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1512, 6, N'委派中', N'6', N'bpm_task_status', 0, N'primary', N'', N'', N'1', N'2024-03-17 10:06:22', N'1', N'2024-03-08 22:41:40', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1513, 7, N'审批通过中', N'7', N'bpm_task_status', 0, N'success', N'', N'', N'1', N'2024-03-17 10:06:47', N'1', N'2024-03-08 22:41:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1514, 0, N'待审批', N'0', N'bpm_task_status', 0, N'info', N'', N'', N'1', N'2024-03-17 10:07:11', N'1', N'2024-03-08 22:41:42', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1515, 35, N'发起人自选', N'35', N'bpm_task_candidate_strategy', 0, N'', N'', N'', N'1', N'2024-03-22 19:45:16', N'1', N'2024-03-22 19:45:16', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1516, 1, N'执行监听器', N'execution', N'bpm_process_listener_type', 0, N'primary', N'', N'', N'1', N'2024-03-23 12:54:03', N'1', N'2024-03-23 19:14:19', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1517, 1, N'任务监听器', N'task', N'bpm_process_listener_type', 0, N'success', N'', N'', N'1', N'2024-03-23 12:54:13', N'1', N'2024-03-23 19:14:24', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1526, 1, N'Java 类', N'class', N'bpm_process_listener_value_type', 0, N'primary', N'', N'', N'1', N'2024-03-23 15:08:45', N'1', N'2024-03-23 19:14:32', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1527, 2, N'表达式', N'expression', N'bpm_process_listener_value_type', 0, N'success', N'', N'', N'1', N'2024-03-23 15:09:06', N'1', N'2024-03-23 19:14:38', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1528, 3, N'代理表达式', N'delegateExpression', N'bpm_process_listener_value_type', 0, N'info', N'', N'', N'1', N'2024-03-23 15:11:23', N'1', N'2024-03-23 19:14:41', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1529, 1, N'天', N'1', N'date_interval', 0, N'', N'', N'', N'1', N'2024-03-29 22:50:26', N'1', N'2024-03-29 22:50:26', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1530, 2, N'周', N'2', N'date_interval', 0, N'', N'', N'', N'1', N'2024-03-29 22:50:36', N'1', N'2024-03-29 22:50:36', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1531, 3, N'月', N'3', N'date_interval', 0, N'', N'', N'', N'1', N'2024-03-29 22:50:46', N'1', N'2024-03-29 22:50:54', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1532, 4, N'季度', N'4', N'date_interval', 0, N'', N'', N'', N'1', N'2024-03-29 22:51:01', N'1', N'2024-03-29 22:51:01', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1533, 5, N'年', N'5', N'date_interval', 0, N'', N'', N'', N'1', N'2024-03-29 22:51:07', N'1', N'2024-03-29 22:51:07', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1534, 1, N'赢单', N'1', N'crm_business_end_status_type', 0, N'success', N'', N'', N'1', N'2024-04-13 23:26:57', N'1', N'2024-04-13 23:26:57', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1535, 2, N'输单', N'2', N'crm_business_end_status_type', 0, N'primary', N'', N'', N'1', N'2024-04-13 23:27:31', N'1', N'2024-04-13 23:27:31', N'0') +GO +INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1536, 3, N'无效', N'3', N'crm_business_end_status_type', 0, N'info', N'', N'', N'1', N'2024-04-13 23:27:59', N'1', N'2024-04-13 23:27:59', N'0') +GO +SET IDENTITY_INSERT system_dict_data OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS system_dict_type +GO +CREATE TABLE system_dict_type +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(100) DEFAULT '' NOT NULL, + type nvarchar(100) DEFAULT '' NOT NULL, + status tinyint DEFAULT 0 NOT NULL, + remark nvarchar(500) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + deleted_time datetime2 DEFAULT NULL NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典主键', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'删除时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'deleted_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'字典类型表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type' +GO + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_dict_type ON +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (1, N'用户性别', N'system_user_sex', 0, NULL, N'admin', N'2021-01-05 17:03:48', N'1', N'2022-05-16 20:29:32', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (6, N'参数类型', N'infra_config_type', 0, NULL, N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:36:54', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (7, N'通知类型', N'system_notice_type', 0, NULL, N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:35:26', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (9, N'操作类型', N'infra_operate_type', 0, NULL, N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-14 12:44:01', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (10, N'系统状态', N'common_status', 0, NULL, N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-01 16:21:28', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (11, N'Boolean 是否类型', N'infra_boolean_string', 0, N'boolean 转是否', N'', N'2021-01-19 03:20:08', N'', N'2022-02-01 16:37:10', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (104, N'登陆结果', N'system_login_result', 0, N'登陆结果', N'', N'2021-01-18 06:17:11', N'', N'2022-02-01 16:36:00', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (106, N'代码生成模板类型', N'infra_codegen_template_type', 0, NULL, N'', N'2021-02-05 07:08:06', N'1', N'2022-05-16 20:26:50', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (107, N'定时任务状态', N'infra_job_status', 0, NULL, N'', N'2021-02-07 07:44:16', N'', N'2022-02-01 16:51:11', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (108, N'定时任务日志状态', N'infra_job_log_status', 0, NULL, N'', N'2021-02-08 10:03:51', N'', N'2022-02-01 16:50:43', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (109, N'用户类型', N'user_type', 0, NULL, N'', N'2021-02-26 00:15:51', N'', N'2021-02-26 00:15:51', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (110, N'API 异常数据的处理状态', N'infra_api_error_log_process_status', 0, NULL, N'', N'2021-02-26 07:07:01', N'', N'2022-02-01 16:50:53', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (111, N'短信渠道编码', N'system_sms_channel_code', 0, NULL, N'1', N'2021-04-05 01:04:50', N'1', N'2022-02-16 02:09:08', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (112, N'短信模板的类型', N'system_sms_template_type', 0, NULL, N'1', N'2021-04-05 21:50:43', N'1', N'2022-02-01 16:35:06', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (113, N'短信发送状态', N'system_sms_send_status', 0, NULL, N'1', N'2021-04-11 20:18:03', N'1', N'2022-02-01 16:35:09', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (114, N'短信接收状态', N'system_sms_receive_status', 0, NULL, N'1', N'2021-04-11 20:27:14', N'1', N'2022-02-01 16:35:14', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (116, N'登陆日志的类型', N'system_login_type', 0, N'登陆日志的类型', N'1', N'2021-10-06 00:50:46', N'1', N'2022-02-01 16:35:56', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (117, N'OA 请假类型', N'bpm_oa_leave_type', 0, NULL, N'1', N'2021-09-21 22:34:33', N'1', N'2022-01-22 10:41:37', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (130, N'支付渠道编码类型', N'pay_channel_code', 0, N'支付渠道的编码', N'1', N'2021-12-03 10:35:08', N'1', N'2023-07-10 10:11:39', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (131, N'支付回调状态', N'pay_notify_status', 0, N'支付回调状态(包括退款回调)', N'1', N'2021-12-03 10:53:29', N'1', N'2023-07-19 18:09:43', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (132, N'支付订单状态', N'pay_order_status', 0, N'支付订单状态', N'1', N'2021-12-03 11:17:50', N'1', N'2021-12-03 11:17:50', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (134, N'退款订单状态', N'pay_refund_status', 0, N'退款订单状态', N'1', N'2021-12-10 16:42:50', N'1', N'2023-07-19 10:13:17', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (139, N'流程实例的状态', N'bpm_process_instance_status', 0, N'流程实例的状态', N'1', N'2022-01-07 23:46:42', N'1', N'2022-01-07 23:46:42', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (140, N'流程实例的结果', N'bpm_task_status', 0, N'流程实例的结果', N'1', N'2022-01-07 23:48:10', N'1', N'2024-03-08 22:42:03', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (141, N'流程的表单类型', N'bpm_model_form_type', 0, N'流程的表单类型', N'103', N'2022-01-11 23:50:45', N'103', N'2022-01-11 23:50:45', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (142, N'任务分配规则的类型', N'bpm_task_candidate_strategy', 0, N'BPM 任务的候选人的策略', N'103', N'2022-01-12 23:21:04', N'103', N'2024-03-06 02:53:59', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (144, N'代码生成的场景枚举', N'infra_codegen_scene', 0, N'代码生成的场景枚举', N'1', N'2022-02-02 13:14:45', N'1', N'2022-03-10 16:33:46', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (145, N'角色类型', N'system_role_type', 0, N'角色类型', N'1', N'2022-02-16 13:01:46', N'1', N'2022-02-16 13:01:46', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (146, N'文件存储器', N'infra_file_storage', 0, N'文件存储器', N'1', N'2022-03-15 00:24:38', N'1', N'2022-03-15 00:24:38', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (147, N'OAuth 2.0 授权类型', N'system_oauth2_grant_type', 0, N'OAuth 2.0 授权类型(模式)', N'1', N'2022-05-12 00:20:52', N'1', N'2022-05-11 16:25:49', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (149, N'商品 SPU 状态', N'product_spu_status', 0, N'商品 SPU 状态', N'1', N'2022-10-24 21:19:04', N'1', N'2022-10-24 21:19:08', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (150, N'优惠类型', N'promotion_discount_type', 0, N'优惠类型', N'1', N'2022-11-01 12:46:06', N'1', N'2022-11-01 12:46:06', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (151, N'优惠劵模板的有限期类型', N'promotion_coupon_template_validity_type', 0, N'优惠劵模板的有限期类型', N'1', N'2022-11-02 00:06:20', N'1', N'2022-11-04 00:08:26', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (152, N'营销的商品范围', N'promotion_product_scope', 0, N'营销的商品范围', N'1', N'2022-11-02 00:28:01', N'1', N'2022-11-02 00:28:01', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (153, N'优惠劵的状态', N'promotion_coupon_status', 0, N'优惠劵的状态', N'1', N'2022-11-04 00:14:49', N'1', N'2022-11-04 00:14:49', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (154, N'优惠劵的领取方式', N'promotion_coupon_take_type', 0, N'优惠劵的领取方式', N'1', N'2022-11-04 19:12:27', N'1', N'2022-11-04 19:12:27', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (155, N'促销活动的状态', N'promotion_activity_status', 0, N'促销活动的状态', N'1', N'2022-11-04 22:54:23', N'1', N'2022-11-04 22:54:23', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (156, N'营销的条件类型', N'promotion_condition_type', 0, N'营销的条件类型', N'1', N'2022-11-04 22:59:23', N'1', N'2022-11-04 22:59:23', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (157, N'交易售后状态', N'trade_after_sale_status', 0, N'交易售后状态', N'1', N'2022-11-19 20:52:56', N'1', N'2022-11-19 20:52:56', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (158, N'交易售后的类型', N'trade_after_sale_type', 0, N'交易售后的类型', N'1', N'2022-11-19 21:04:09', N'1', N'2022-11-19 21:04:09', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (159, N'交易售后的方式', N'trade_after_sale_way', 0, N'交易售后的方式', N'1', N'2022-11-19 21:39:04', N'1', N'2022-11-19 21:39:04', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (160, N'终端', N'terminal', 0, N'终端', N'1', N'2022-12-10 10:50:50', N'1', N'2022-12-10 10:53:11', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (161, N'交易订单的类型', N'trade_order_type', 0, N'交易订单的类型', N'1', N'2022-12-10 16:33:54', N'1', N'2022-12-10 16:33:54', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (162, N'交易订单的状态', N'trade_order_status', 0, N'交易订单的状态', N'1', N'2022-12-10 16:48:44', N'1', N'2022-12-10 16:48:44', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (163, N'交易订单项的售后状态', N'trade_order_item_after_sale_status', 0, N'交易订单项的售后状态', N'1', N'2022-12-10 20:58:08', N'1', N'2022-12-10 20:58:08', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (164, N'公众号自动回复的请求关键字匹配模式', N'mp_auto_reply_request_match', 0, N'公众号自动回复的请求关键字匹配模式', N'1', N'2023-01-16 23:29:56', N'1', N'2023-01-16 23:29:56', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (165, N'公众号的消息类型', N'mp_message_type', 0, N'公众号的消息类型', N'1', N'2023-01-17 22:17:09', N'1', N'2023-01-17 22:17:09', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (166, N'邮件发送状态', N'system_mail_send_status', 0, N'邮件发送状态', N'1', N'2023-01-26 09:53:13', N'1', N'2023-01-26 09:53:13', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (167, N'站内信模版的类型', N'system_notify_template_type', 0, N'站内信模版的类型', N'1', N'2023-01-28 10:35:10', N'1', N'2023-01-28 10:35:10', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (168, N'代码生成的前端类型', N'infra_codegen_front_type', 0, N'', N'1', N'2023-04-12 23:57:52', N'1', N'2023-04-12 23:57:52', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (170, N'快递计费方式', N'trade_delivery_express_charge_mode', 0, N'用于商城交易模块配送管理', N'1', N'2023-05-21 22:45:03', N'1', N'2023-05-21 22:45:03', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (171, N'积分业务类型', N'member_point_biz_type', 0, N'', N'1', N'2023-06-10 12:15:00', N'1', N'2023-06-28 13:48:20', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (173, N'支付通知类型', N'pay_notify_type', 0, NULL, N'1', N'2023-07-20 12:23:03', N'1', N'2023-07-20 12:23:03', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (174, N'会员经验业务类型', N'member_experience_biz_type', 0, NULL, N'', N'2023-08-22 12:41:01', N'', N'2023-08-22 12:41:01', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (175, N'交易配送类型', N'trade_delivery_type', 0, N'', N'1', N'2023-08-23 00:03:14', N'1', N'2023-08-23 00:03:14', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (176, N'分佣模式', N'brokerage_enabled_condition', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (177, N'分销关系绑定模式', N'brokerage_bind_mode', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (178, N'佣金提现类型', N'brokerage_withdraw_type', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (179, N'佣金记录业务类型', N'brokerage_record_biz_type', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (180, N'佣金记录状态', N'brokerage_record_status', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (181, N'佣金提现状态', N'brokerage_withdraw_status', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (182, N'佣金提现银行', N'brokerage_bank_name', 0, NULL, N'', N'2023-09-28 02:46:05', N'', N'2023-09-28 02:46:05', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (183, N'砍价记录的状态', N'promotion_bargain_record_status', 0, N'', N'1', N'2023-10-05 10:41:08', N'1', N'2023-10-05 10:41:08', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (184, N'拼团记录的状态', N'promotion_combination_record_status', 0, N'', N'1', N'2023-10-08 07:24:25', N'1', N'2023-10-08 07:24:25', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (185, N'回款-回款方式', N'crm_receivable_return_type', 0, N'回款-回款方式', N'1', N'2023-10-18 21:54:10', N'1', N'2023-10-18 21:54:10', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (186, N'CRM 客户行业', N'crm_customer_industry', 0, N'CRM 客户所属行业', N'1', N'2023-10-28 22:57:07', N'1', N'2024-02-18 23:30:22', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (187, N'客户等级', N'crm_customer_level', 0, N'CRM 客户等级', N'1', N'2023-10-28 22:59:12', N'1', N'2023-10-28 15:11:16', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (188, N'客户来源', N'crm_customer_source', 0, N'CRM 客户来源', N'1', N'2023-10-28 23:00:34', N'1', N'2023-10-28 15:11:16', N'0', NULL) +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (600, N'Banner 位置', N'promotion_banner_position', 0, N'', N'1', N'2023-10-08 07:24:25', N'1', N'2023-11-04 13:04:02', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (601, N'社交类型', N'system_social_type', 0, N'', N'1', N'2023-11-04 13:03:54', N'1', N'2023-11-04 13:03:54', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (604, N'产品状态', N'crm_product_status', 0, N'', N'1', N'2023-10-30 21:47:59', N'1', N'2023-10-30 21:48:45', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (605, N'CRM 数据权限的级别', N'crm_permission_level', 0, N'', N'1', N'2023-11-30 09:51:59', N'1', N'2023-11-30 09:51:59', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (606, N'CRM 审批状态', N'crm_audit_status', 0, N'', N'1', N'2023-11-30 18:56:23', N'1', N'2023-11-30 18:56:23', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (607, N'CRM 产品单位', N'crm_product_unit', 0, N'', N'1', N'2023-12-05 23:01:51', N'1', N'2023-12-05 23:01:51', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (608, N'CRM 跟进方式', N'crm_follow_up_type', 0, N'', N'1', N'2024-01-15 20:48:05', N'1', N'2024-01-15 20:48:05', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (609, N'支付转账类型', N'pay_transfer_type', 0, N'', N'1', N'2023-10-28 16:27:18', N'1', N'2023-10-28 16:27:18', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (610, N'转账订单状态', N'pay_transfer_status', 0, N'', N'1', N'2023-10-28 16:18:32', N'1', N'2023-10-28 16:18:32', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (611, N'ERP 库存明细的业务类型', N'erp_stock_record_biz_type', 0, N'ERP 库存明细的业务类型', N'1', N'2024-02-05 18:07:02', N'1', N'2024-02-05 18:07:02', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (612, N'ERP 审批状态', N'erp_audit_status', 0, N'', N'1', N'2024-02-06 00:00:07', N'1', N'2024-02-06 00:00:07', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (613, N'BPM 监听器类型', N'bpm_process_listener_type', 0, N'', N'1', N'2024-03-23 12:52:24', N'1', N'2024-03-09 15:54:28', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (615, N'BPM 监听器值类型', N'bpm_process_listener_value_type', 0, N'', N'1', N'2024-03-23 13:00:31', N'1', N'2024-03-23 13:00:31', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (616, N'时间间隔', N'date_interval', 0, N'', N'1', N'2024-03-29 22:50:09', N'1', N'2024-03-29 22:50:09', N'0', N'1970-01-01 00:00:00') +GO +INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted, deleted_time) VALUES (619, N'CRM 商机结束状态类型', N'crm_business_end_status_type', 0, N'', N'1', N'2024-04-13 23:23:00', N'1', N'2024-04-13 23:23:00', N'0', N'1970-01-01 00:00:00') +GO +SET IDENTITY_INSERT system_dict_type OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS system_login_log +GO +CREATE TABLE system_login_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + log_type bigint NOT NULL, + trace_id nvarchar(64) DEFAULT '' NOT NULL, + user_id bigint DEFAULT 0 NOT NULL, + user_type tinyint DEFAULT 0 NOT NULL, + username nvarchar(50) DEFAULT '' NOT NULL, + result tinyint NOT NULL, + user_ip nvarchar(50) NOT NULL, + user_agent nvarchar(512) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'访问ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'日志类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'log_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'链路追踪编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户账号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'登陆结果', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户 IP', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'浏览器 UA', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'系统访问记录', + 'SCHEMA', N'dbo', + 'TABLE', N'system_login_log' +GO + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_account +GO +CREATE TABLE system_mail_account +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + mail nvarchar(255) NOT NULL, + username nvarchar(255) NOT NULL, + password nvarchar(255) NOT NULL, + host nvarchar(255) NOT NULL, + port int NOT NULL, + ssl_enable varchar(1) DEFAULT '0' NOT NULL, + starttls_enable varchar(1) DEFAULT '0' NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主键', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮箱', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'mail' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'密码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'SMTP 服务器域名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'host' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'SMTP 服务器端口', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'port' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否开启 SSL', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'ssl_enable' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否开启 STARTTLS', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'starttls_enable' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮箱账号表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_account' +GO + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_mail_account ON +GO +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (1, N'7684413@qq.com', N'7684413@qq.com', N'1234576', N'127.0.0.1', 8080, N'0', N'0', N'1', N'2023-01-25 17:39:52', N'1', N'2024-04-24 09:13:56', N'0') +GO +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (2, N'ydym_test@163.com', N'ydym_test@163.com', N'WBZTEINMIFVRYSOE', N'smtp.163.com', 465, N'1', N'0', N'1', N'2023-01-26 01:26:03', N'1', N'2023-04-12 22:39:38', N'0') +GO +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (3, N'76854114@qq.com', N'3335', N'11234', N'yunai1.cn', 466, N'0', N'0', N'1', N'2023-01-27 15:06:38', N'1', N'2023-01-27 07:08:36', N'1') +GO +INSERT INTO system_mail_account (id, mail, username, password, host, port, ssl_enable, starttls_enable, creator, create_time, updater, update_time, deleted) VALUES (4, N'7685413x@qq.com', N'2', N'3', N'4', 5, N'1', N'0', N'1', N'2023-04-12 23:05:06', N'1', N'2023-04-12 15:05:11', N'1') +GO +SET IDENTITY_INSERT system_mail_account OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_log +GO +CREATE TABLE system_mail_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint DEFAULT NULL NULL, + user_type tinyint DEFAULT NULL NULL, + to_mail nvarchar(255) NOT NULL, + account_id bigint NOT NULL, + from_mail nvarchar(255) NOT NULL, + template_id bigint NOT NULL, + template_code nvarchar(63) NOT NULL, + template_nickname nvarchar(255) DEFAULT NULL NULL, + template_title nvarchar(255) NOT NULL, + template_content nvarchar(4000) NOT NULL, + template_params nvarchar(255) NOT NULL, + send_status tinyint DEFAULT 0 NOT NULL, + send_time datetime2 DEFAULT NULL NULL, + send_message_id nvarchar(255) DEFAULT NULL NULL, + send_exception nvarchar(4000) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'接收邮箱地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'to_mail' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮箱账号编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'account_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送邮箱地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'from_mail' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'template_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'template_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版发送人名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'template_nickname' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮件标题', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'template_title' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮件内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'template_content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮件参数', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'template_params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'send_status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'send_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送返回的消息 ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'send_message_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送异常', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'send_exception' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮件日志表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_log' +GO + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS system_mail_template +GO +CREATE TABLE system_mail_template +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(63) NOT NULL, + code nvarchar(63) NOT NULL, + account_id bigint NOT NULL, + nickname nvarchar(255) DEFAULT NULL NULL, + title nvarchar(255) NOT NULL, + content nvarchar(4000) NOT NULL, + params nvarchar(255) NOT NULL, + status tinyint NOT NULL, + remark nvarchar(255) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送的邮箱账号编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'account_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送人名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板标题', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'title' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数数组', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'开启状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'邮件模版表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_mail_template' +GO + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_mail_template ON +GO +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (13, N'后台用户短信登录', N'admin-sms-login', 1, N'奥特曼', N'你猜我猜', N'

您的验证码是{code},名字是{name}

', N'["code","name"]', 0, N'3', N'1', N'2021-10-11 08:10:00', N'1', N'2023-12-02 19:51:14', N'0') +GO +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (14, N'测试模版', N'test_01', 2, N'芋艿', N'一个标题', N'

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', N'["key01","key02"]', 0, NULL, N'1', N'2023-01-26 01:27:40', N'1', N'2023-01-27 10:32:16', N'0') +GO +INSERT INTO system_mail_template (id, name, code, account_id, nickname, title, content, params, status, remark, creator, create_time, updater, update_time, deleted) VALUES (15, N'3', N'2', 2, N'7', N'4', N'

45

', N'[]', 1, N'80', N'1', N'2023-01-27 15:50:35', N'1', N'2023-01-27 16:34:49', N'0') +GO +SET IDENTITY_INSERT system_mail_template OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_menu +GO +CREATE TABLE system_menu +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(50) NOT NULL, + permission nvarchar(100) DEFAULT '' NOT NULL, + type tinyint NOT NULL, + sort int DEFAULT 0 NOT NULL, + parent_id bigint DEFAULT 0 NOT NULL, + path nvarchar(200) DEFAULT '' NULL, + icon nvarchar(100) DEFAULT '#' NULL, + component nvarchar(255) DEFAULT NULL NULL, + component_name nvarchar(255) DEFAULT NULL NULL, + status tinyint DEFAULT 0 NOT NULL, + visible varchar(1) DEFAULT '1' NOT NULL, + keep_alive varchar(1) DEFAULT '1' NOT NULL, + always_show varchar(1) DEFAULT '1' NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'权限标识', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'permission' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'显示顺序', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'父菜单ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'路由地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'path' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单图标', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'icon' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'组件路径', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'component' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'组件名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'component_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否可见', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'visible' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否缓存', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'keep_alive' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否总是显示', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'always_show' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单权限表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_menu' +GO + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_menu ON +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1, N'系统管理', N'', 1, 10, 0, N'/system', N'ep:tools', NULL, NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:04:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2, N'基础设施', N'', 1, 20, 0, N'/infra', N'ep:monitor', NULL, NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-03-01 08:28:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (5, N'OA 示例', N'', 1, 40, 1185, N'oa', N'fa:road', NULL, NULL, 0, N'1', N'1', N'1', N'admin', N'2021-09-20 16:26:19', N'1', N'2024-02-29 12:38:13', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (100, N'用户管理', N'system:user:list', 2, 1, 1, N'user', N'ep:avatar', N'system/user/index', N'SystemUser', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:02:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (101, N'角色管理', N'', 2, 2, 1, N'role', N'ep:user', N'system/role/index', N'SystemRole', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:03:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (102, N'菜单管理', N'', 2, 3, 1, N'menu', N'ep:menu', N'system/menu/index', N'SystemMenu', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:03:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (103, N'部门管理', N'', 2, 4, 1, N'dept', N'fa:address-card', N'system/dept/index', N'SystemDept', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:06:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (104, N'岗位管理', N'', 2, 5, 1, N'post', N'fa:address-book-o', N'system/post/index', N'SystemPost', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:06:39', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (105, N'字典管理', N'', 2, 6, 1, N'dict', N'ep:collection', N'system/dict/index', N'SystemDictType', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:07:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (106, N'配置管理', N'', 2, 8, 2, N'config', N'fa:connectdevelop', N'infra/config/index', N'InfraConfig', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-23 00:02:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (107, N'通知公告', N'', 2, 4, 2739, N'notice', N'ep:takeaway-box', N'system/notice/index', N'SystemNotice', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-22 23:56:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (108, N'审计日志', N'', 1, 9, 1, N'log', N'ep:document-copy', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:08:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (109, N'令牌管理', N'', 2, 2, 1261, N'token', N'fa:key', N'system/oauth2/token/index', N'SystemTokenClient', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:13:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (110, N'定时任务', N'', 2, 7, 2, N'job', N'fa-solid:tasks', N'infra/job/index', N'InfraJob', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 08:57:36', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (111, N'MySQL 监控', N'', 2, 1, 2740, N'druid', N'fa-solid:box', N'infra/druid/index', N'InfraDruid', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-23 00:05:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (112, N'Java 监控', N'', 2, 3, 2740, N'admin-server', N'ep:coffee-cup', N'infra/server/index', N'InfraAdminServer', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-23 00:06:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (113, N'Redis 监控', N'', 2, 2, 2740, N'redis', N'fa:reddit-square', N'infra/redis/index', N'InfraRedis', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-23 00:06:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (114, N'表单构建', N'infra:build:list', 2, 2, 2, N'build', N'fa:wpforms', N'infra/build/index', N'InfraBuild', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 08:51:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (115, N'代码生成', N'infra:codegen:query', 2, 1, 2, N'codegen', N'ep:document-copy', N'infra/codegen/index', N'InfraCodegen', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 08:51:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (116, N'API 接口', N'infra:swagger:list', 2, 3, 2, N'swagger', N'fa:fighter-jet', N'infra/swagger/index', N'InfraSwagger', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-04-23 00:01:24', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (500, N'操作日志', N'', 2, 1, 108, N'operate-log', N'ep:position', N'system/operatelog/index', N'SystemOperateLog', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:09:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (501, N'登录日志', N'', 2, 2, 108, N'login-log', N'ep:promotion', N'system/loginlog/index', N'SystemLoginLog', 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2024-02-29 01:10:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1001, N'用户查询', N'system:user:query', 3, 1, 100, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1002, N'用户新增', N'system:user:create', 3, 2, 100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1003, N'用户修改', N'system:user:update', 3, 3, 100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1004, N'用户删除', N'system:user:delete', 3, 4, 100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1005, N'用户导出', N'system:user:export', 3, 5, 100, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1006, N'用户导入', N'system:user:import', 3, 6, 100, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1007, N'重置密码', N'system:user:update-password', 3, 7, 100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1008, N'角色查询', N'system:role:query', 3, 1, 101, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1009, N'角色新增', N'system:role:create', 3, 2, 101, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1010, N'角色修改', N'system:role:update', 3, 3, 101, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1011, N'角色删除', N'system:role:delete', 3, 4, 101, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1012, N'角色导出', N'system:role:export', 3, 5, 101, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1013, N'菜单查询', N'system:menu:query', 3, 1, 102, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1014, N'菜单新增', N'system:menu:create', 3, 2, 102, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1015, N'菜单修改', N'system:menu:update', 3, 3, 102, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1016, N'菜单删除', N'system:menu:delete', 3, 4, 102, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1017, N'部门查询', N'system:dept:query', 3, 1, 103, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1018, N'部门新增', N'system:dept:create', 3, 2, 103, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1019, N'部门修改', N'system:dept:update', 3, 3, 103, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1020, N'部门删除', N'system:dept:delete', 3, 4, 103, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1021, N'岗位查询', N'system:post:query', 3, 1, 104, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1022, N'岗位新增', N'system:post:create', 3, 2, 104, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1023, N'岗位修改', N'system:post:update', 3, 3, 104, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1024, N'岗位删除', N'system:post:delete', 3, 4, 104, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1025, N'岗位导出', N'system:post:export', 3, 5, 104, N'', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1026, N'字典查询', N'system:dict:query', 3, 1, 105, N'#', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1027, N'字典新增', N'system:dict:create', 3, 2, 105, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1028, N'字典修改', N'system:dict:update', 3, 3, 105, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1029, N'字典删除', N'system:dict:delete', 3, 4, 105, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1030, N'字典导出', N'system:dict:export', 3, 5, 105, N'#', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1031, N'配置查询', N'infra:config:query', 3, 1, 106, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1032, N'配置新增', N'infra:config:create', 3, 2, 106, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1033, N'配置修改', N'infra:config:update', 3, 3, 106, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1034, N'配置删除', N'infra:config:delete', 3, 4, 106, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1035, N'配置导出', N'infra:config:export', 3, 5, 106, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1036, N'公告查询', N'system:notice:query', 3, 1, 107, N'#', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1037, N'公告新增', N'system:notice:create', 3, 2, 107, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1038, N'公告修改', N'system:notice:update', 3, 3, 107, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1039, N'公告删除', N'system:notice:delete', 3, 4, 107, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1040, N'操作查询', N'system:operate-log:query', 3, 1, 500, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1042, N'日志导出', N'system:operate-log:export', 3, 2, 500, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1043, N'登录查询', N'system:login-log:query', 3, 1, 501, N'#', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1045, N'日志导出', N'system:login-log:export', 3, 3, 501, N'#', N'#', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1046, N'令牌列表', N'system:oauth2-token:page', 3, 1, 109, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-05-09 23:54:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1048, N'令牌删除', N'system:oauth2-token:delete', 3, 2, 109, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-05-09 23:54:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1050, N'任务新增', N'infra:job:create', 3, 2, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1051, N'任务修改', N'infra:job:update', 3, 3, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1052, N'任务删除', N'infra:job:delete', 3, 4, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1053, N'状态修改', N'infra:job:update', 3, 5, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1054, N'任务导出', N'infra:job:export', 3, 7, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1056, N'生成修改', N'infra:codegen:update', 3, 2, 115, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1057, N'生成删除', N'infra:codegen:delete', 3, 3, 115, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1058, N'导入代码', N'infra:codegen:create', 3, 2, 115, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1059, N'预览代码', N'infra:codegen:preview', 3, 4, 115, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1060, N'生成代码', N'infra:codegen:download', 3, 5, 115, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'admin', N'2021-01-05 17:03:48', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1063, N'设置角色菜单权限', N'system:permission:assign-role-menu', 3, 6, 101, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-01-06 17:53:44', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1064, N'设置角色数据权限', N'system:permission:assign-role-data-scope', 3, 7, 101, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-01-06 17:56:31', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1065, N'设置用户角色', N'system:permission:assign-user-role', 3, 8, 101, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-01-07 10:23:28', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1066, N'获得 Redis 监控信息', N'infra:redis:get-monitor-info', 3, 1, 113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-01-26 01:02:31', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1067, N'获得 Redis Key 列表', N'infra:redis:get-key-list', 3, 2, 113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-01-26 01:02:52', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1070, N'代码生成案例', N'', 1, 1, 2, N'demo', N'ep:aim', N'infra/testDemo/index', NULL, 0, N'1', N'1', N'1', N'', N'2021-02-06 12:42:49', N'1', N'2023-11-15 23:45:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1075, N'任务触发', N'infra:job:trigger', 3, 8, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-02-07 13:03:10', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1077, N'链路追踪', N'', 2, 4, 2740, N'skywalking', N'fa:eye', N'infra/skywalking/index', N'InfraSkyWalking', 0, N'1', N'1', N'1', N'', N'2021-02-08 20:41:31', N'1', N'2024-04-23 00:07:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1078, N'访问日志', N'', 2, 1, 1083, N'api-access-log', N'ep:place', N'infra/apiAccessLog/index', N'InfraApiAccessLog', 0, N'1', N'1', N'1', N'', N'2021-02-26 01:32:59', N'1', N'2024-02-29 08:54:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1082, N'日志导出', N'infra:api-access-log:export', 3, 2, 1078, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-02-26 01:32:59', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1083, N'API 日志', N'', 2, 4, 2, N'log', N'fa:tasks', NULL, NULL, 0, N'1', N'1', N'1', N'', N'2021-02-26 02:18:24', N'1', N'2024-04-22 23:58:36', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1084, N'错误日志', N'infra:api-error-log:query', 2, 2, 1083, N'api-error-log', N'ep:warning-filled', N'infra/apiErrorLog/index', N'InfraApiErrorLog', 0, N'1', N'1', N'1', N'', N'2021-02-26 07:53:20', N'1', N'2024-02-29 08:55:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1085, N'日志处理', N'infra:api-error-log:update-status', 3, 2, 1084, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-02-26 07:53:20', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1086, N'日志导出', N'infra:api-error-log:export', 3, 3, 1084, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-02-26 07:53:20', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1087, N'任务查询', N'infra:job:query', 3, 1, 110, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2021-03-10 01:26:19', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1088, N'日志查询', N'infra:api-access-log:query', 3, 1, 1078, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2021-03-10 01:28:04', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1089, N'日志查询', N'infra:api-error-log:query', 3, 1, 1084, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2021-03-10 01:29:09', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1090, N'文件列表', N'', 2, 5, 1243, N'file', N'ep:upload-filled', N'infra/file/index', N'InfraFile', 0, N'1', N'1', N'1', N'', N'2021-03-12 20:16:20', N'1', N'2024-02-29 08:53:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1091, N'文件查询', N'infra:file:query', 3, 1, 1090, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-03-12 20:16:20', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1092, N'文件删除', N'infra:file:delete', 3, 4, 1090, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-03-12 20:16:20', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1093, N'短信管理', N'', 1, 1, 2739, N'sms', N'ep:message', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2021-04-05 01:10:16', N'1', N'2024-04-22 23:56:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1094, N'短信渠道', N'', 2, 0, 1093, N'sms-channel', N'fa:stack-exchange', N'system/sms/channel/index', N'SystemSmsChannel', 0, N'1', N'1', N'1', N'', N'2021-04-01 11:07:15', N'1', N'2024-02-29 01:15:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1095, N'短信渠道查询', N'system:sms-channel:query', 3, 1, 1094, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 11:07:15', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1096, N'短信渠道创建', N'system:sms-channel:create', 3, 2, 1094, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 11:07:15', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1097, N'短信渠道更新', N'system:sms-channel:update', 3, 3, 1094, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 11:07:15', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1098, N'短信渠道删除', N'system:sms-channel:delete', 3, 4, 1094, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 11:07:15', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1100, N'短信模板', N'', 2, 1, 1093, N'sms-template', N'ep:connection', N'system/sms/template/index', N'SystemSmsTemplate', 0, N'1', N'1', N'1', N'', N'2021-04-01 17:35:17', N'1', N'2024-02-29 01:16:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1101, N'短信模板查询', N'system:sms-template:query', 3, 1, 1100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 17:35:17', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1102, N'短信模板创建', N'system:sms-template:create', 3, 2, 1100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 17:35:17', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1103, N'短信模板更新', N'system:sms-template:update', 3, 3, 1100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 17:35:17', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1104, N'短信模板删除', N'system:sms-template:delete', 3, 4, 1100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 17:35:17', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1105, N'短信模板导出', N'system:sms-template:export', 3, 5, 1100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-01 17:35:17', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1106, N'发送测试短信', N'system:sms-template:send-sms', 3, 6, 1100, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2021-04-11 00:26:40', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1107, N'短信日志', N'', 2, 2, 1093, N'sms-log', N'fa:edit', N'system/sms/log/index', N'SystemSmsLog', 0, N'1', N'1', N'1', N'', N'2021-04-11 08:37:05', N'1', N'2024-02-29 08:49:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1108, N'短信日志查询', N'system:sms-log:query', 3, 1, 1107, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-11 08:37:05', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1109, N'短信日志导出', N'system:sms-log:export', 3, 5, 1107, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-04-11 08:37:05', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1117, N'支付管理', N'', 1, 30, 0, N'/pay', N'ep:money', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2021-12-25 16:43:41', N'1', N'2024-02-29 08:58:38', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1118, N'请假查询', N'', 2, 0, 5, N'leave', N'fa:leanpub', N'bpm/oa/leave/index', N'BpmOALeave', 0, N'1', N'1', N'1', N'', N'2021-09-20 08:51:03', N'1', N'2024-02-29 12:38:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1119, N'请假申请查询', N'bpm:oa-leave:query', 3, 1, 1118, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-09-20 08:51:03', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1120, N'请假申请创建', N'bpm:oa-leave:create', 3, 2, 1118, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-09-20 08:51:03', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1126, N'应用信息', N'', 2, 1, 1117, N'app', N'fa:apple', N'pay/app/index', N'PayApp', 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:30', N'1', N'2024-02-29 08:59:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1127, N'支付应用信息查询', N'pay:app:query', 3, 1, 1126, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:31', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1128, N'支付应用信息创建', N'pay:app:create', 3, 2, 1126, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:31', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1129, N'支付应用信息更新', N'pay:app:update', 3, 3, 1126, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:31', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1130, N'支付应用信息删除', N'pay:app:delete', 3, 4, 1126, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:31', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1132, N'秘钥解析', N'pay:channel:parsing', 3, 6, 1129, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2021-11-08 15:15:47', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1133, N'支付商户信息查询', N'pay:merchant:query', 3, 1, 1132, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:41', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1134, N'支付商户信息创建', N'pay:merchant:create', 3, 2, 1132, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:41', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1135, N'支付商户信息更新', N'pay:merchant:update', 3, 3, 1132, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:41', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1136, N'支付商户信息删除', N'pay:merchant:delete', 3, 4, 1132, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:41', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1137, N'支付商户信息导出', N'pay:merchant:export', 3, 5, 1132, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-11-10 01:13:41', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1138, N'租户列表', N'', 2, 0, 1224, N'list', N'ep:house', N'system/tenant/index', N'SystemTenant', 0, N'1', N'1', N'1', N'', N'2021-12-14 12:31:43', N'1', N'2024-02-29 01:01:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1139, N'租户查询', N'system:tenant:query', 3, 1, 1138, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-14 12:31:44', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1140, N'租户创建', N'system:tenant:create', 3, 2, 1138, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-14 12:31:44', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1141, N'租户更新', N'system:tenant:update', 3, 3, 1138, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-14 12:31:44', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1142, N'租户删除', N'system:tenant:delete', 3, 4, 1138, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-14 12:31:44', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1143, N'租户导出', N'system:tenant:export', 3, 5, 1138, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-14 12:31:44', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1150, N'秘钥解析', N'', 3, 6, 1129, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2021-11-08 15:15:47', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1161, N'退款订单', N'', 2, 3, 1117, N'refund', N'fa:registered', N'pay/refund/index', N'PayRefund', 0, N'1', N'1', N'1', N'', N'2021-12-25 08:29:07', N'1', N'2024-02-29 08:59:20', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1162, N'退款订单查询', N'pay:refund:query', 3, 1, 1161, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:29:07', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1163, N'退款订单创建', N'pay:refund:create', 3, 2, 1161, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:29:07', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1164, N'退款订单更新', N'pay:refund:update', 3, 3, 1161, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:29:07', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1165, N'退款订单删除', N'pay:refund:delete', 3, 4, 1161, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:29:07', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1166, N'退款订单导出', N'pay:refund:export', 3, 5, 1161, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:29:07', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1173, N'支付订单', N'', 2, 2, 1117, N'order', N'fa:cc-paypal', N'pay/order/index', N'PayOrder', 0, N'1', N'1', N'1', N'', N'2021-12-25 08:49:43', N'1', N'2024-02-29 08:59:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1174, N'支付订单查询', N'pay:order:query', 3, 1, 1173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:49:43', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1175, N'支付订单创建', N'pay:order:create', 3, 2, 1173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:49:43', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1176, N'支付订单更新', N'pay:order:update', 3, 3, 1173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:49:43', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1177, N'支付订单删除', N'pay:order:delete', 3, 4, 1173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:49:43', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1178, N'支付订单导出', N'pay:order:export', 3, 5, 1173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-25 08:49:43', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1185, N'工作流程', N'', 1, 50, 0, N'/bpm', N'fa:medium', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2021-12-30 20:26:36', N'1', N'2024-02-29 12:43:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1186, N'流程管理', N'', 1, 10, 1185, N'manager', N'fa:dedent', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2021-12-30 20:28:30', N'1', N'2024-02-29 12:36:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1187, N'流程表单', N'', 2, 2, 1186, N'form', N'fa:hdd-o', N'bpm/form/index', N'BpmForm', 0, N'1', N'1', N'1', N'', N'2021-12-30 12:38:22', N'1', N'2024-03-19 12:25:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1188, N'表单查询', N'bpm:form:query', 3, 1, 1187, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-30 12:38:22', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1189, N'表单创建', N'bpm:form:create', 3, 2, 1187, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-30 12:38:22', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1190, N'表单更新', N'bpm:form:update', 3, 3, 1187, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-30 12:38:22', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1191, N'表单删除', N'bpm:form:delete', 3, 4, 1187, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-30 12:38:22', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1192, N'表单导出', N'bpm:form:export', 3, 5, 1187, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2021-12-30 12:38:22', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1193, N'流程模型', N'', 2, 1, 1186, N'model', N'fa-solid:project-diagram', N'bpm/model/index', N'BpmModel', 0, N'1', N'1', N'1', N'1', N'2021-12-31 23:24:58', N'1', N'2024-03-19 12:25:19', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1194, N'模型查询', N'bpm:model:query', 3, 1, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-03 19:01:10', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1195, N'模型创建', N'bpm:model:create', 3, 2, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-03 19:01:24', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1196, N'模型导入', N'bpm:model:import', 3, 3, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-03 19:01:35', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1197, N'模型更新', N'bpm:model:update', 3, 4, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-03 19:02:28', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1198, N'模型删除', N'bpm:model:delete', 3, 5, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-03 19:02:43', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1199, N'模型发布', N'bpm:model:deploy', 3, 6, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-03 19:03:24', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1200, N'审批中心', N'', 2, 20, 1185, N'task', N'fa:tasks', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-07 23:51:48', N'1', N'2024-03-21 00:33:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1201, N'我的流程', N'', 2, 1, 1200, N'my', N'fa-solid:book', N'bpm/processInstance/index', N'BpmProcessInstanceMy', 0, N'1', N'1', N'1', N'', N'2022-01-07 15:53:44', N'1', N'2024-03-21 23:52:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1202, N'流程实例的查询', N'bpm:process-instance:query', 3, 1, 1201, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-01-07 15:53:44', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1207, N'待办任务', N'', 2, 10, 1200, N'todo', N'fa:slack', N'bpm/task/todo/index', N'BpmTodoTask', 0, N'1', N'1', N'1', N'1', N'2022-01-08 10:33:37', N'1', N'2024-02-29 12:37:39', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1208, N'已办任务', N'', 2, 20, 1200, N'done', N'fa:delicious', N'bpm/task/done/index', N'BpmDoneTask', 0, N'1', N'1', N'1', N'1', N'2022-01-08 10:34:13', N'1', N'2024-02-29 12:37:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1209, N'用户分组', N'', 2, 4, 1186, N'user-group', N'fa:user-secret', N'bpm/group/index', N'BpmUserGroup', 0, N'1', N'1', N'1', N'', N'2022-01-14 02:14:20', N'1', N'2024-03-21 23:55:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1210, N'用户组查询', N'bpm:user-group:query', 3, 1, 1209, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-01-14 02:14:20', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1211, N'用户组创建', N'bpm:user-group:create', 3, 2, 1209, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-01-14 02:14:20', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1212, N'用户组更新', N'bpm:user-group:update', 3, 3, 1209, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-01-14 02:14:20', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1213, N'用户组删除', N'bpm:user-group:delete', 3, 4, 1209, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-01-14 02:14:20', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1215, N'流程定义查询', N'bpm:process-definition:query', 3, 10, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:21:43', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1216, N'流程任务分配规则查询', N'bpm:task-assign-rule:query', 3, 20, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:26:53', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1217, N'流程任务分配规则创建', N'bpm:task-assign-rule:create', 3, 21, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:28:15', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1218, N'流程任务分配规则更新', N'bpm:task-assign-rule:update', 3, 22, 1193, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:28:41', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1219, N'流程实例的创建', N'bpm:process-instance:create', 3, 2, 1201, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:36:15', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1220, N'流程实例的取消', N'bpm:process-instance:cancel', 3, 3, 1201, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:36:33', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1221, N'流程任务的查询', N'bpm:task:query', 3, 1, 1207, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:38:52', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1222, N'流程任务的更新', N'bpm:task:update', 3, 2, 1207, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-01-23 00:39:24', N'1', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1224, N'租户管理', N'', 2, 0, 1, N'tenant', N'fa-solid:house-user', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-02-20 01:41:13', N'1', N'2024-02-29 00:59:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1225, N'租户套餐', N'', 2, 0, 1224, N'package', N'fa:bars', N'system/tenantPackage/index', N'SystemTenantPackage', 0, N'1', N'1', N'1', N'', N'2022-02-19 17:44:06', N'1', N'2024-02-29 01:01:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1226, N'租户套餐查询', N'system:tenant-package:query', 3, 1, 1225, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-02-19 17:44:06', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1227, N'租户套餐创建', N'system:tenant-package:create', 3, 2, 1225, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-02-19 17:44:06', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1228, N'租户套餐更新', N'system:tenant-package:update', 3, 3, 1225, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-02-19 17:44:06', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1229, N'租户套餐删除', N'system:tenant-package:delete', 3, 4, 1225, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-02-19 17:44:06', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1237, N'文件配置', N'', 2, 0, 1243, N'file-config', N'fa-solid:file-signature', N'infra/fileConfig/index', N'InfraFileConfig', 0, N'1', N'1', N'1', N'', N'2022-03-15 14:35:28', N'1', N'2024-02-29 08:52:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1238, N'文件配置查询', N'infra:file-config:query', 3, 1, 1237, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-03-15 14:35:28', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1239, N'文件配置创建', N'infra:file-config:create', 3, 2, 1237, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-03-15 14:35:28', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1240, N'文件配置更新', N'infra:file-config:update', 3, 3, 1237, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-03-15 14:35:28', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1241, N'文件配置删除', N'infra:file-config:delete', 3, 4, 1237, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-03-15 14:35:28', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1242, N'文件配置导出', N'infra:file-config:export', 3, 5, 1237, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-03-15 14:35:28', N'', N'2022-04-20 17:03:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1243, N'文件管理', N'', 2, 6, 2, N'file', N'ep:files', NULL, N'', 0, N'1', N'1', N'1', N'1', N'2022-03-16 23:47:40', N'1', N'2024-04-23 00:02:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1254, N'作者动态', N'', 1, 0, 0, N'https://www.iocoder.cn', N'ep:avatar', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-04-23 01:03:15', N'1', N'2023-12-08 23:40:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1255, N'数据源配置', N'', 2, 1, 2, N'data-source-config', N'ep:data-analysis', N'infra/dataSourceConfig/index', N'InfraDataSourceConfig', 0, N'1', N'1', N'1', N'', N'2022-04-27 14:37:32', N'1', N'2024-02-29 08:51:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1256, N'数据源配置查询', N'infra:data-source-config:query', 3, 1, 1255, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-04-27 14:37:32', N'', N'2022-04-27 14:37:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1257, N'数据源配置创建', N'infra:data-source-config:create', 3, 2, 1255, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-04-27 14:37:32', N'', N'2022-04-27 14:37:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1258, N'数据源配置更新', N'infra:data-source-config:update', 3, 3, 1255, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-04-27 14:37:32', N'', N'2022-04-27 14:37:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1259, N'数据源配置删除', N'infra:data-source-config:delete', 3, 4, 1255, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-04-27 14:37:32', N'', N'2022-04-27 14:37:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1260, N'数据源配置导出', N'infra:data-source-config:export', 3, 5, 1255, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-04-27 14:37:32', N'', N'2022-04-27 14:37:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1261, N'OAuth 2.0', N'', 2, 10, 1, N'oauth2', N'fa:dashcube', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-05-09 23:38:17', N'1', N'2024-02-29 01:12:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1263, N'应用管理', N'', 2, 0, 1261, N'oauth2/application', N'fa:hdd-o', N'system/oauth2/client/index', N'SystemOAuth2Client', 0, N'1', N'1', N'1', N'', N'2022-05-10 16:26:33', N'1', N'2024-02-29 01:13:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1264, N'客户端查询', N'system:oauth2-client:query', 3, 1, 1263, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-05-10 16:26:33', N'1', N'2022-05-11 00:31:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1265, N'客户端创建', N'system:oauth2-client:create', 3, 2, 1263, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-05-10 16:26:33', N'1', N'2022-05-11 00:31:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1266, N'客户端更新', N'system:oauth2-client:update', 3, 3, 1263, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-05-10 16:26:33', N'1', N'2022-05-11 00:31:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1267, N'客户端删除', N'system:oauth2-client:delete', 3, 4, 1263, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-05-10 16:26:33', N'1', N'2022-05-11 00:31:33', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1281, N'报表管理', N'', 2, 40, 0, N'/report', N'ep:pie-chart', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-07-10 20:22:15', N'1', N'2024-02-29 12:33:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (1282, N'报表设计器', N'', 2, 1, 1281, N'jimu-report', N'ep:trend-charts', N'report/jmreport/index', N'GoView', 0, N'1', N'1', N'1', N'1', N'2022-07-10 20:26:36', N'1', N'2024-02-29 12:33:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2000, N'商品中心', N'', 1, 60, 2362, N'product', N'fa:product-hunt', NULL, NULL, 0, N'1', N'1', N'1', N'', N'2022-07-29 15:53:53', N'1', N'2023-09-30 11:52:36', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2002, N'商品分类', N'', 2, 2, 2000, N'category', N'ep:cellphone', N'mall/product/category/index', N'ProductCategory', 0, N'1', N'1', N'1', N'', N'2022-07-29 15:53:53', N'1', N'2023-08-21 10:27:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2003, N'分类查询', N'product:category:query', 3, 1, 2002, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-29 15:53:53', N'', N'2022-07-29 15:53:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2004, N'分类创建', N'product:category:create', 3, 2, 2002, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-29 15:53:53', N'', N'2022-07-29 15:53:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2005, N'分类更新', N'product:category:update', 3, 3, 2002, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-29 15:53:53', N'', N'2022-07-29 15:53:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2006, N'分类删除', N'product:category:delete', 3, 4, 2002, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-29 15:53:53', N'', N'2022-07-29 15:53:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2008, N'商品品牌', N'', 2, 3, 2000, N'brand', N'ep:chicken', N'mall/product/brand/index', N'ProductBrand', 0, N'1', N'1', N'1', N'', N'2022-07-30 13:52:44', N'1', N'2023-08-21 10:27:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2009, N'品牌查询', N'product:brand:query', 3, 1, 2008, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 13:52:44', N'', N'2022-07-30 13:52:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2010, N'品牌创建', N'product:brand:create', 3, 2, 2008, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 13:52:44', N'', N'2022-07-30 13:52:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2011, N'品牌更新', N'product:brand:update', 3, 3, 2008, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 13:52:44', N'', N'2022-07-30 13:52:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2012, N'品牌删除', N'product:brand:delete', 3, 4, 2008, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 13:52:44', N'', N'2022-07-30 13:52:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2014, N'商品列表', N'', 2, 1, 2000, N'spu', N'ep:apple', N'mall/product/spu/index', N'ProductSpu', 0, N'1', N'1', N'1', N'', N'2022-07-30 14:22:58', N'1', N'2023-08-21 10:27:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2015, N'商品查询', N'product:spu:query', 3, 1, 2014, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 14:22:58', N'', N'2022-07-30 14:22:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2016, N'商品创建', N'product:spu:create', 3, 2, 2014, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 14:22:58', N'', N'2022-07-30 14:22:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2017, N'商品更新', N'product:spu:update', 3, 3, 2014, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 14:22:58', N'', N'2022-07-30 14:22:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2018, N'商品删除', N'product:spu:delete', 3, 4, 2014, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 14:22:58', N'', N'2022-07-30 14:22:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2019, N'商品属性', N'', 2, 4, 2000, N'property', N'ep:cold-drink', N'mall/product/property/index', N'ProductProperty', 0, N'1', N'1', N'1', N'', N'2022-08-01 14:55:35', N'1', N'2023-08-26 11:01:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2020, N'规格查询', N'product:property:query', 3, 1, 2019, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-08-01 14:55:35', N'', N'2022-12-12 20:26:24', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2021, N'规格创建', N'product:property:create', 3, 2, 2019, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-08-01 14:55:35', N'', N'2022-12-12 20:26:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2022, N'规格更新', N'product:property:update', 3, 3, 2019, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-08-01 14:55:35', N'', N'2022-12-12 20:26:33', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2023, N'规格删除', N'product:property:delete', 3, 4, 2019, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-08-01 14:55:35', N'', N'2022-12-12 20:26:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2025, N'Banner', N'', 2, 100, 2387, N'banner', N'fa:bandcamp', N'mall/promotion/banner/index', NULL, 0, N'1', N'1', N'1', N'', N'2022-08-01 14:56:14', N'1', N'2023-10-24 20:20:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2026, N'Banner查询', N'promotion:banner:query', 3, 1, 2025, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-08-01 14:56:14', N'1', N'2023-10-24 20:20:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2027, N'Banner创建', N'promotion:banner:create', 3, 2, 2025, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-08-01 14:56:14', N'1', N'2023-10-24 20:20:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2028, N'Banner更新', N'promotion:banner:update', 3, 3, 2025, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-08-01 14:56:14', N'1', N'2023-10-24 20:20:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2029, N'Banner删除', N'promotion:banner:delete', 3, 4, 2025, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-08-01 14:56:14', N'1', N'2023-10-24 20:20:36', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2030, N'营销中心', N'', 1, 70, 2362, N'promotion', N'ep:present', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-10-31 21:25:09', N'1', N'2023-09-30 11:54:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2032, N'优惠劵列表', N'', 2, 1, 2365, N'template', N'ep:discount', N'mall/promotion/coupon/template/index', N'PromotionCouponTemplate', 0, N'1', N'1', N'1', N'', N'2022-10-31 22:27:14', N'1', N'2023-10-03 12:40:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2033, N'优惠劵模板查询', N'promotion:coupon-template:query', 3, 1, 2032, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-10-31 22:27:14', N'', N'2022-10-31 22:27:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2034, N'优惠劵模板创建', N'promotion:coupon-template:create', 3, 2, 2032, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-10-31 22:27:14', N'', N'2022-10-31 22:27:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2035, N'优惠劵模板更新', N'promotion:coupon-template:update', 3, 3, 2032, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-10-31 22:27:14', N'', N'2022-10-31 22:27:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2036, N'优惠劵模板删除', N'promotion:coupon-template:delete', 3, 4, 2032, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-10-31 22:27:14', N'', N'2022-10-31 22:27:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2038, N'领取记录', N'', 2, 2, 2365, N'list', N'ep:collection-tag', N'mall/promotion/coupon/index', N'PromotionCoupon', 0, N'1', N'1', N'1', N'', N'2022-11-03 23:21:31', N'1', N'2023-10-03 12:55:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2039, N'优惠劵查询', N'promotion:coupon:query', 3, 1, 2038, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-03 23:21:31', N'', N'2022-11-03 23:21:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2040, N'优惠劵删除', N'promotion:coupon:delete', 3, 4, 2038, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-03 23:21:31', N'', N'2022-11-03 23:21:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2041, N'满减送', N'', 2, 10, 2390, N'reward-activity', N'ep:goblet-square-full', N'mall/promotion/rewardActivity/index', N'PromotionRewardActivity', 0, N'1', N'1', N'1', N'', N'2022-11-04 23:47:49', N'1', N'2023-10-21 19:24:46', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2042, N'满减送活动查询', N'promotion:reward-activity:query', 3, 1, 2041, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-04 23:47:49', N'', N'2022-11-04 23:47:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2043, N'满减送活动创建', N'promotion:reward-activity:create', 3, 2, 2041, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-04 23:47:49', N'', N'2022-11-04 23:47:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2044, N'满减送活动更新', N'promotion:reward-activity:update', 3, 3, 2041, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-04 23:47:50', N'', N'2022-11-04 23:47:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2045, N'满减送活动删除', N'promotion:reward-activity:delete', 3, 4, 2041, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-04 23:47:50', N'', N'2022-11-04 23:47:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2046, N'满减送活动关闭', N'promotion:reward-activity:close', 3, 5, 2041, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2022-11-05 10:42:53', N'1', N'2022-11-05 10:42:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2047, N'限时折扣', N'', 2, 7, 2390, N'discount-activity', N'ep:timer', N'mall/promotion/discountActivity/index', N'PromotionDiscountActivity', 0, N'1', N'1', N'1', N'', N'2022-11-05 17:12:15', N'1', N'2023-10-21 19:24:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2048, N'限时折扣活动查询', N'promotion:discount-activity:query', 3, 1, 2047, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-05 17:12:15', N'', N'2022-11-05 17:12:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2049, N'限时折扣活动创建', N'promotion:discount-activity:create', 3, 2, 2047, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-05 17:12:15', N'', N'2022-11-05 17:12:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2050, N'限时折扣活动更新', N'promotion:discount-activity:update', 3, 3, 2047, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-05 17:12:16', N'', N'2022-11-05 17:12:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2051, N'限时折扣活动删除', N'promotion:discount-activity:delete', 3, 4, 2047, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-05 17:12:16', N'', N'2022-11-05 17:12:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2052, N'限时折扣活动关闭', N'promotion:discount-activity:close', 3, 5, 2047, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-05 17:12:16', N'', N'2022-11-05 17:12:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2059, N'秒杀商品', N'', 2, 2, 2209, N'activity', N'ep:basketball', N'mall/promotion/seckill/activity/index', N'PromotionSeckillActivity', 0, N'1', N'1', N'1', N'', N'2022-11-06 22:24:49', N'1', N'2023-06-24 18:57:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2060, N'秒杀活动查询', N'promotion:seckill-activity:query', 3, 1, 2059, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-06 22:24:49', N'', N'2022-11-06 22:24:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2061, N'秒杀活动创建', N'promotion:seckill-activity:create', 3, 2, 2059, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-06 22:24:49', N'', N'2022-11-06 22:24:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2062, N'秒杀活动更新', N'promotion:seckill-activity:update', 3, 3, 2059, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-06 22:24:49', N'', N'2022-11-06 22:24:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2063, N'秒杀活动删除', N'promotion:seckill-activity:delete', 3, 4, 2059, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-06 22:24:49', N'', N'2022-11-06 22:24:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2066, N'秒杀时段', N'', 2, 1, 2209, N'config', N'ep:baseball', N'mall/promotion/seckill/config/index', N'PromotionSeckillConfig', 0, N'1', N'1', N'1', N'', N'2022-11-15 19:46:50', N'1', N'2023-06-24 18:57:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2067, N'秒杀时段查询', N'promotion:seckill-config:query', 3, 1, 2066, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-11-15 19:46:51', N'1', N'2023-06-24 17:50:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2068, N'秒杀时段创建', N'promotion:seckill-config:create', 3, 2, 2066, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-11-15 19:46:51', N'1', N'2023-06-24 17:48:39', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2069, N'秒杀时段更新', N'promotion:seckill-config:update', 3, 3, 2066, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-11-15 19:46:51', N'1', N'2023-06-24 17:50:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2070, N'秒杀时段删除', N'promotion:seckill-config:delete', 3, 4, 2066, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2022-11-15 19:46:51', N'1', N'2023-06-24 17:50:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2072, N'订单中心', N'', 1, 65, 2362, N'trade', N'ep:eleme', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2022-11-19 18:57:19', N'1', N'2023-09-30 11:54:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2073, N'售后退款', N'', 2, 2, 2072, N'after-sale', N'ep:refrigerator', N'mall/trade/afterSale/index', N'TradeAfterSale', 0, N'1', N'1', N'1', N'', N'2022-11-19 20:15:32', N'1', N'2023-10-01 21:42:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2074, N'售后查询', N'trade:after-sale:query', 3, 1, 2073, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-11-19 20:15:33', N'1', N'2022-12-10 21:04:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2075, N'秒杀活动关闭', N'promotion:seckill-activity:close', 3, 5, 2059, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2022-11-28 20:20:15', N'1', N'2023-10-03 18:34:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2076, N'订单列表', N'', 2, 1, 2072, N'order', N'ep:list', N'mall/trade/order/index', N'TradeOrder', 0, N'1', N'1', N'1', N'1', N'2022-12-10 21:05:44', N'1', N'2023-10-01 21:42:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2083, N'地区管理', N'', 2, 14, 1, N'area', N'fa:map-marker', N'system/area/index', N'SystemArea', 0, N'1', N'1', N'1', N'1', N'2022-12-23 17:35:05', N'1', N'2024-02-29 08:50:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2084, N'公众号管理', N'', 1, 100, 0, N'/mp', N'ep:compass', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-01 20:11:04', N'1', N'2024-02-29 12:39:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2085, N'账号管理', N'', 2, 1, 2084, N'account', N'fa:user', N'mp/account/index', N'MpAccount', 0, N'1', N'1', N'1', N'1', N'2023-01-01 20:13:31', N'1', N'2024-02-29 12:42:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2086, N'新增账号', N'mp:account:create', 3, 1, 2085, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-01 20:21:40', N'1', N'2023-01-07 17:32:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2087, N'修改账号', N'mp:account:update', 3, 2, 2085, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-07 17:32:46', N'1', N'2023-01-07 17:32:46', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2088, N'查询账号', N'mp:account:query', 3, 0, 2085, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-07 17:33:07', N'1', N'2023-01-07 17:33:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2089, N'删除账号', N'mp:account:delete', 3, 3, 2085, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-07 17:33:21', N'1', N'2023-01-07 17:33:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2090, N'生成二维码', N'mp:account:qr-code', 3, 4, 2085, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-07 17:33:58', N'1', N'2023-01-07 17:33:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2091, N'清空 API 配额', N'mp:account:clear-quota', 3, 5, 2085, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-07 18:20:32', N'1', N'2023-01-07 18:20:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2092, N'数据统计', N'mp:statistics:query', 2, 2, 2084, N'statistics', N'ep:trend-charts', N'mp/statistics/index', N'MpStatistics', 0, N'1', N'1', N'1', N'1', N'2023-01-07 20:17:36', N'1', N'2024-02-29 12:42:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2093, N'标签管理', N'', 2, 3, 2084, N'tag', N'ep:collection-tag', N'mp/tag/index', N'MpTag', 0, N'1', N'1', N'1', N'1', N'2023-01-08 11:37:32', N'1', N'2024-02-29 12:42:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2094, N'查询标签', N'mp:tag:query', 3, 0, 2093, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 11:59:03', N'1', N'2023-01-08 11:59:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2095, N'新增标签', N'mp:tag:create', 3, 1, 2093, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 11:59:23', N'1', N'2023-01-08 11:59:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2096, N'修改标签', N'mp:tag:update', 3, 2, 2093, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 11:59:41', N'1', N'2023-01-08 11:59:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2097, N'删除标签', N'mp:tag:delete', 3, 3, 2093, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 12:00:04', N'1', N'2023-01-08 12:00:13', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2098, N'同步标签', N'mp:tag:sync', 3, 4, 2093, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 12:00:29', N'1', N'2023-01-08 12:00:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2099, N'粉丝管理', N'', 2, 4, 2084, N'user', N'fa:user-secret', N'mp/user/index', N'MpUser', 0, N'1', N'1', N'1', N'1', N'2023-01-08 16:51:20', N'1', N'2024-02-29 12:42:39', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2100, N'查询粉丝', N'mp:user:query', 3, 0, 2099, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 17:16:59', N'1', N'2023-01-08 17:17:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2101, N'修改粉丝', N'mp:user:update', 3, 1, 2099, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 17:17:11', N'1', N'2023-01-08 17:17:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2102, N'同步粉丝', N'mp:user:sync', 3, 2, 2099, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-08 17:17:40', N'1', N'2023-01-08 17:17:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2103, N'消息管理', N'', 2, 5, 2084, N'message', N'ep:message', N'mp/message/index', N'MpMessage', 0, N'1', N'1', N'1', N'1', N'2023-01-08 18:44:19', N'1', N'2024-02-29 12:42:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2104, N'图文发表记录', N'', 2, 10, 2084, N'free-publish', N'ep:edit-pen', N'mp/freePublish/index', N'MpFreePublish', 0, N'1', N'1', N'1', N'1', N'2023-01-13 00:30:50', N'1', N'2024-02-29 12:43:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2105, N'查询发布列表', N'mp:free-publish:query', 3, 1, 2104, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-13 07:19:17', N'1', N'2023-01-13 07:19:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2106, N'发布草稿', N'mp:free-publish:submit', 3, 2, 2104, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-13 07:19:46', N'1', N'2023-01-13 07:19:46', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2107, N'删除发布记录', N'mp:free-publish:delete', 3, 3, 2104, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-13 07:20:01', N'1', N'2023-01-13 07:20:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2108, N'图文草稿箱', N'', 2, 9, 2084, N'draft', N'ep:edit', N'mp/draft/index', N'MpDraft', 0, N'1', N'1', N'1', N'1', N'2023-01-13 07:40:21', N'1', N'2024-02-29 12:43:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2109, N'新建草稿', N'mp:draft:create', 3, 1, 2108, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-13 23:15:30', N'1', N'2023-01-13 23:15:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2110, N'修改草稿', N'mp:draft:update', 3, 2, 2108, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 10:08:47', N'1', N'2023-01-14 10:08:47', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2111, N'查询草稿', N'mp:draft:query', 3, 0, 2108, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 10:09:01', N'1', N'2023-01-14 10:09:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2112, N'删除草稿', N'mp:draft:delete', 3, 3, 2108, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 10:09:19', N'1', N'2023-01-14 10:09:19', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2113, N'素材管理', N'', 2, 8, 2084, N'material', N'ep:basketball', N'mp/material/index', N'MpMaterial', 0, N'1', N'1', N'1', N'1', N'2023-01-14 14:12:07', N'1', N'2024-02-29 12:43:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2114, N'上传临时素材', N'mp:material:upload-temporary', 3, 1, 2113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 15:33:55', N'1', N'2023-01-14 15:33:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2115, N'上传永久素材', N'mp:material:upload-permanent', 3, 2, 2113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 15:34:14', N'1', N'2023-01-14 15:34:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2116, N'删除素材', N'mp:material:delete', 3, 3, 2113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 15:35:37', N'1', N'2023-01-14 15:35:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2117, N'上传图文图片', N'mp:material:upload-news-image', 3, 4, 2113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 15:36:31', N'1', N'2023-01-14 15:36:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2118, N'查询素材', N'mp:material:query', 3, 5, 2113, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-14 15:39:22', N'1', N'2023-01-14 15:39:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2119, N'菜单管理', N'', 2, 6, 2084, N'menu', N'ep:menu', N'mp/menu/index', N'MpMenu', 0, N'1', N'1', N'1', N'1', N'2023-01-14 17:43:54', N'1', N'2024-02-29 12:42:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2120, N'自动回复', N'', 2, 7, 2084, N'auto-reply', N'fa-solid:republican', N'mp/autoReply/index', N'MpAutoReply', 0, N'1', N'1', N'1', N'1', N'2023-01-15 22:13:09', N'1', N'2024-02-29 12:43:10', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2121, N'查询回复', N'mp:auto-reply:query', 3, 0, 2120, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-16 22:28:41', N'1', N'2023-01-16 22:28:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2122, N'新增回复', N'mp:auto-reply:create', 3, 1, 2120, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-16 22:28:54', N'1', N'2023-01-16 22:28:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2123, N'修改回复', N'mp:auto-reply:update', 3, 2, 2120, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-16 22:29:05', N'1', N'2023-01-16 22:29:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2124, N'删除回复', N'mp:auto-reply:delete', 3, 3, 2120, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-16 22:29:34', N'1', N'2023-01-16 22:29:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2125, N'查询菜单', N'mp:menu:query', 3, 0, 2119, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-17 23:05:41', N'1', N'2023-01-17 23:05:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2126, N'保存菜单', N'mp:menu:save', 3, 1, 2119, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-17 23:06:01', N'1', N'2023-01-17 23:06:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2127, N'删除菜单', N'mp:menu:delete', 3, 2, 2119, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-17 23:06:16', N'1', N'2023-01-17 23:06:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2128, N'查询消息', N'mp:message:query', 3, 0, 2103, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-17 23:07:14', N'1', N'2023-01-17 23:07:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2129, N'发送消息', N'mp:message:send', 3, 1, 2103, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-17 23:07:26', N'1', N'2023-01-17 23:07:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2130, N'邮箱管理', N'', 2, 2, 2739, N'mail', N'fa-solid:mail-bulk', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-25 17:27:44', N'1', N'2024-04-22 23:56:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2131, N'邮箱账号', N'', 2, 0, 2130, N'mail-account', N'fa:universal-access', N'system/mail/account/index', N'SystemMailAccount', 0, N'1', N'1', N'1', N'', N'2023-01-25 09:33:48', N'1', N'2024-02-29 08:48:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2132, N'账号查询', N'system:mail-account:query', 3, 1, 2131, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 09:33:48', N'', N'2023-01-25 09:33:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2133, N'账号创建', N'system:mail-account:create', 3, 2, 2131, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 09:33:48', N'', N'2023-01-25 09:33:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2134, N'账号更新', N'system:mail-account:update', 3, 3, 2131, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 09:33:48', N'', N'2023-01-25 09:33:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2135, N'账号删除', N'system:mail-account:delete', 3, 4, 2131, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 09:33:48', N'', N'2023-01-25 09:33:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2136, N'邮件模版', N'', 2, 0, 2130, N'mail-template', N'fa:tag', N'system/mail/template/index', N'SystemMailTemplate', 0, N'1', N'1', N'1', N'', N'2023-01-25 12:05:31', N'1', N'2024-02-29 08:48:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2137, N'模版查询', N'system:mail-template:query', 3, 1, 2136, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 12:05:31', N'', N'2023-01-25 12:05:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2138, N'模版创建', N'system:mail-template:create', 3, 2, 2136, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 12:05:31', N'', N'2023-01-25 12:05:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2139, N'模版更新', N'system:mail-template:update', 3, 3, 2136, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 12:05:31', N'', N'2023-01-25 12:05:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2140, N'模版删除', N'system:mail-template:delete', 3, 4, 2136, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-25 12:05:31', N'', N'2023-01-25 12:05:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2141, N'邮件记录', N'', 2, 0, 2130, N'mail-log', N'fa:edit', N'system/mail/log/index', N'SystemMailLog', 0, N'1', N'1', N'1', N'', N'2023-01-26 02:16:50', N'1', N'2024-02-29 08:48:51', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2142, N'日志查询', N'system:mail-log:query', 3, 1, 2141, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-26 02:16:50', N'', N'2023-01-26 02:16:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2143, N'发送测试邮件', N'system:mail-template:send-mail', 3, 5, 2136, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-26 23:29:15', N'1', N'2023-01-26 23:29:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2144, N'站内信管理', N'', 1, 3, 2739, N'notify', N'ep:message-box', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-28 10:25:18', N'1', N'2024-04-22 23:56:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2145, N'模板管理', N'', 2, 0, 2144, N'notify-template', N'fa:archive', N'system/notify/template/index', N'SystemNotifyTemplate', 0, N'1', N'1', N'1', N'', N'2023-01-28 02:26:42', N'1', N'2024-02-29 08:49:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2146, N'站内信模板查询', N'system:notify-template:query', 3, 1, 2145, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-28 02:26:42', N'', N'2023-01-28 02:26:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2147, N'站内信模板创建', N'system:notify-template:create', 3, 2, 2145, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-28 02:26:42', N'', N'2023-01-28 02:26:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2148, N'站内信模板更新', N'system:notify-template:update', 3, 3, 2145, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-28 02:26:42', N'', N'2023-01-28 02:26:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2149, N'站内信模板删除', N'system:notify-template:delete', 3, 4, 2145, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-28 02:26:42', N'', N'2023-01-28 02:26:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2150, N'发送测试站内信', N'system:notify-template:send-notify', 3, 5, 2145, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-01-28 10:54:43', N'1', N'2023-01-28 10:54:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2151, N'消息记录', N'', 2, 0, 2144, N'notify-message', N'fa:edit', N'system/notify/message/index', N'SystemNotifyMessage', 0, N'1', N'1', N'1', N'', N'2023-01-28 04:28:22', N'1', N'2024-02-29 08:49:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2152, N'站内信消息查询', N'system:notify-message:query', 3, 1, 2151, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-01-28 04:28:22', N'', N'2023-01-28 04:28:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2153, N'大屏设计器', N'', 2, 2, 1281, N'go-view', N'fa:area-chart', N'report/goview/index', N'JimuReport', 0, N'1', N'1', N'1', N'1', N'2023-02-07 00:03:19', N'1', N'2024-02-29 12:34:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2154, N'创建项目', N'report:go-view-project:create', 3, 1, 2153, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-02-07 19:25:14', N'1', N'2023-02-07 19:25:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2155, N'更新项目', N'report:go-view-project:update', 3, 2, 2153, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-02-07 19:25:34', N'1', N'2024-04-24 20:01:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2156, N'查询项目', N'report:go-view-project:query', 3, 0, 2153, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-02-07 19:25:53', N'1', N'2023-02-07 19:25:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2157, N'使用 SQL 查询数据', N'report:go-view-data:get-by-sql', 3, 3, 2153, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-02-07 19:26:15', N'1', N'2023-02-07 19:26:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2158, N'使用 HTTP 查询数据', N'report:go-view-data:get-by-http', 3, 4, 2153, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'1', N'2023-02-07 19:26:35', N'1', N'2023-02-07 19:26:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2159, N'Boot 开发文档', N'', 1, 1, 0, N'https://doc.iocoder.cn/', N'ep:document', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2023-02-10 22:46:28', N'1', N'2023-12-02 21:32:20', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2160, N'Cloud 开发文档', N'', 1, 2, 0, N'https://cloud.iocoder.cn', N'ep:document-copy', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2023-02-10 22:47:07', N'1', N'2023-12-02 21:32:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2161, N'接入示例', N'', 1, 99, 1117, N'demo', N'fa-solid:dragon', N'pay/demo/index', NULL, 0, N'1', N'1', N'1', N'', N'2023-02-11 14:21:42', N'1', N'2024-01-18 23:50:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2162, N'商品导出', N'product:spu:export', 3, 5, 2014, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2022-07-30 14:22:58', N'', N'2022-07-30 14:22:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2164, N'配送管理', N'', 1, 3, 2072, N'delivery', N'ep:shopping-cart', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-05-18 09:18:02', N'1', N'2023-09-28 10:58:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2165, N'快递发货', N'', 1, 0, 2164, N'express', N'ep:bicycle', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-05-18 09:22:06', N'1', N'2023-08-30 21:02:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2166, N'门店自提', N'', 1, 1, 2164, N'pick-up-store', N'ep:add-location', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-05-18 09:23:14', N'1', N'2023-08-30 21:03:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2167, N'快递公司', N'', 2, 0, 2165, N'express', N'ep:compass', N'mall/trade/delivery/express/index', N'Express', 0, N'1', N'1', N'1', N'1', N'2023-05-18 09:27:21', N'1', N'2023-08-30 21:02:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2168, N'快递公司查询', N'trade:delivery:express:query', 3, 1, 2167, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-18 09:37:53', N'', N'2023-05-18 09:37:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2169, N'快递公司创建', N'trade:delivery:express:create', 3, 2, 2167, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-18 09:37:53', N'', N'2023-05-18 09:37:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2170, N'快递公司更新', N'trade:delivery:express:update', 3, 3, 2167, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-18 09:37:53', N'', N'2023-05-18 09:37:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2171, N'快递公司删除', N'trade:delivery:express:delete', 3, 4, 2167, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-18 09:37:53', N'', N'2023-05-18 09:37:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2172, N'快递公司导出', N'trade:delivery:express:export', 3, 5, 2167, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-18 09:37:53', N'', N'2023-05-18 09:37:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2173, N'运费模版', N'trade:delivery:express-template:query', 2, 1, 2165, N'express-template', N'ep:coordinate', N'mall/trade/delivery/expressTemplate/index', N'ExpressTemplate', 0, N'1', N'1', N'1', N'1', N'2023-05-20 06:48:10', N'1', N'2023-08-30 21:03:13', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2174, N'快递运费模板查询', N'trade:delivery:express-template:query', 3, 1, 2173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-20 06:49:53', N'', N'2023-05-20 06:49:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2175, N'快递运费模板创建', N'trade:delivery:express-template:create', 3, 2, 2173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-20 06:49:53', N'', N'2023-05-20 06:49:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2176, N'快递运费模板更新', N'trade:delivery:express-template:update', 3, 3, 2173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-20 06:49:53', N'', N'2023-05-20 06:49:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2177, N'快递运费模板删除', N'trade:delivery:express-template:delete', 3, 4, 2173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-20 06:49:53', N'', N'2023-05-20 06:49:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2178, N'快递运费模板导出', N'trade:delivery:express-template:export', 3, 5, 2173, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-20 06:49:53', N'', N'2023-05-20 06:49:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2179, N'门店管理', N'', 2, 1, 2166, N'pick-up-store', N'ep:basketball', N'mall/trade/delivery/pickUpStore/index', N'PickUpStore', 0, N'1', N'1', N'1', N'1', N'2023-05-25 10:50:00', N'1', N'2023-08-30 21:03:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2180, N'自提门店查询', N'trade:delivery:pick-up-store:query', 3, 1, 2179, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-25 10:53:29', N'', N'2023-05-25 10:53:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2181, N'自提门店创建', N'trade:delivery:pick-up-store:create', 3, 2, 2179, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-25 10:53:29', N'', N'2023-05-25 10:53:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2182, N'自提门店更新', N'trade:delivery:pick-up-store:update', 3, 3, 2179, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-25 10:53:29', N'', N'2023-05-25 10:53:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2183, N'自提门店删除', N'trade:delivery:pick-up-store:delete', 3, 4, 2179, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-25 10:53:29', N'', N'2023-05-25 10:53:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2184, N'自提门店导出', N'trade:delivery:pick-up-store:export', 3, 5, 2179, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-05-25 10:53:29', N'', N'2023-05-25 10:53:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2209, N'秒杀活动', N'', 2, 3, 2030, N'seckill', N'ep:place', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-06-24 17:39:13', N'1', N'2023-06-24 18:55:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2262, N'会员中心', N'', 1, 55, 0, N'/member', N'ep:bicycle', NULL, NULL, 0, N'1', N'1', N'1', N'1', N'2023-06-10 00:42:03', N'1', N'2023-08-20 09:23:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2275, N'会员配置', N'', 2, 0, 2262, N'config', N'fa:archive', N'member/config/index', N'MemberConfig', 0, N'1', N'1', N'1', N'', N'2023-06-10 02:07:44', N'1', N'2023-10-01 23:41:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2276, N'会员配置查询', N'member:config:query', 3, 1, 2275, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2023-06-10 02:07:44', N'1', N'2024-04-24 19:48:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2277, N'会员配置保存', N'member:config:save', 3, 2, 2275, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2023-06-10 02:07:44', N'1', N'2024-04-24 19:49:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2281, N'签到配置', N'', 2, 2, 2300, N'config', N'ep:calendar', N'member/signin/config/index', N'SignInConfig', 0, N'1', N'1', N'1', N'', N'2023-06-10 03:26:12', N'1', N'2023-08-20 19:25:51', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2282, N'积分签到规则查询', N'point:sign-in-config:query', 3, 1, 2281, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 03:26:12', N'', N'2023-06-10 03:26:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2283, N'积分签到规则创建', N'point:sign-in-config:create', 3, 2, 2281, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 03:26:12', N'', N'2023-06-10 03:26:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2284, N'积分签到规则更新', N'point:sign-in-config:update', 3, 3, 2281, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 03:26:12', N'', N'2023-06-10 03:26:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2285, N'积分签到规则删除', N'point:sign-in-config:delete', 3, 4, 2281, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 03:26:12', N'', N'2023-06-10 03:26:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2287, N'会员积分', N'', 2, 10, 2262, N'record', N'fa:asterisk', N'member/point/record/index', N'PointRecord', 0, N'1', N'1', N'1', N'', N'2023-06-10 04:18:50', N'1', N'2023-10-01 23:42:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2288, N'用户积分记录查询', N'point:record:query', 3, 1, 2287, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 04:18:50', N'', N'2023-06-10 04:18:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2293, N'签到记录', N'', 2, 3, 2300, N'record', N'ep:chicken', N'member/signin/record/index', N'SignInRecord', 0, N'1', N'1', N'1', N'', N'2023-06-10 04:48:22', N'1', N'2023-08-20 19:26:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2294, N'用户签到积分查询', N'point:sign-in-record:query', 3, 1, 2293, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 04:48:22', N'', N'2023-06-10 04:48:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2297, N'用户签到积分删除', N'point:sign-in-record:delete', 3, 4, 2293, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-06-10 04:48:22', N'', N'2023-06-10 04:48:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2300, N'会员签到', N'', 1, 11, 2262, N'signin', N'ep:alarm-clock', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-06-27 22:49:53', N'1', N'2023-08-20 09:23:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2301, N'回调通知', N'', 2, 5, 1117, N'notify', N'ep:mute-notification', N'pay/notify/index', N'PayNotify', 0, N'1', N'1', N'1', N'', N'2023-07-20 04:41:32', N'1', N'2024-01-18 23:56:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2302, N'支付通知查询', N'pay:notify:query', 3, 1, 2301, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-07-20 04:41:32', N'', N'2023-07-20 04:41:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2303, N'拼团活动', N'', 2, 3, 2030, N'combination', N'fa:group', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:19:54', N'1', N'2023-08-12 17:20:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2304, N'拼团商品', N'', 2, 1, 2303, N'acitivity', N'ep:apple', N'mall/promotion/combination/activity/index', N'PromotionCombinationActivity', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:22:03', N'1', N'2023-08-12 17:22:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2305, N'拼团活动查询', N'promotion:combination-activity:query', 3, 1, 2304, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:54:32', N'1', N'2023-11-24 11:57:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2306, N'拼团活动创建', N'promotion:combination-activity:create', 3, 2, 2304, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:54:49', N'1', N'2023-08-12 17:54:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2307, N'拼团活动更新', N'promotion:combination-activity:update', 3, 3, 2304, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:55:04', N'1', N'2023-08-12 17:55:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2308, N'拼团活动删除', N'promotion:combination-activity:delete', 3, 4, 2304, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:55:23', N'1', N'2023-08-12 17:55:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2309, N'拼团活动关闭', N'promotion:combination-activity:close', 3, 5, 2304, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-12 17:55:37', N'1', N'2023-10-06 10:51:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2310, N'砍价活动', N'', 2, 4, 2030, N'bargain', N'ep:box', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:27:25', N'1', N'2023-08-13 00:27:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2311, N'砍价商品', N'', 2, 1, 2310, N'activity', N'ep:burger', N'mall/promotion/bargain/activity/index', N'PromotionBargainActivity', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:28:49', N'1', N'2023-10-05 01:16:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2312, N'砍价活动查询', N'promotion:bargain-activity:query', 3, 1, 2311, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:32:30', N'1', N'2023-08-13 00:32:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2313, N'砍价活动创建', N'promotion:bargain-activity:create', 3, 2, 2311, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:32:44', N'1', N'2023-08-13 00:32:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2314, N'砍价活动更新', N'promotion:bargain-activity:update', 3, 3, 2311, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:32:55', N'1', N'2023-08-13 00:32:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2315, N'砍价活动删除', N'promotion:bargain-activity:delete', 3, 4, 2311, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:34:50', N'1', N'2023-08-13 00:34:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2316, N'砍价活动关闭', N'promotion:bargain-activity:close', 3, 5, 2311, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-13 00:35:02', N'1', N'2023-08-13 00:35:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2317, N'会员管理', N'', 2, 0, 2262, N'user', N'ep:avatar', N'member/user/index', N'MemberUser', 0, N'1', N'1', N'1', N'', N'2023-08-19 04:12:15', N'1', N'2023-08-24 00:50:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2318, N'会员用户查询', N'member:user:query', 3, 1, 2317, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-19 04:12:15', N'', N'2023-08-19 04:12:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2319, N'会员用户更新', N'member:user:update', 3, 3, 2317, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-19 04:12:15', N'', N'2023-08-19 04:12:15', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2320, N'会员标签', N'', 2, 1, 2262, N'tag', N'ep:collection-tag', N'member/tag/index', N'MemberTag', 0, N'1', N'1', N'1', N'', N'2023-08-20 01:03:08', N'1', N'2023-08-20 09:23:19', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2321, N'会员标签查询', N'member:tag:query', 3, 1, 2320, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-20 01:03:08', N'', N'2023-08-20 01:03:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2322, N'会员标签创建', N'member:tag:create', 3, 2, 2320, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-20 01:03:08', N'', N'2023-08-20 01:03:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2323, N'会员标签更新', N'member:tag:update', 3, 3, 2320, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-20 01:03:08', N'', N'2023-08-20 01:03:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2324, N'会员标签删除', N'member:tag:delete', 3, 4, 2320, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-20 01:03:08', N'', N'2023-08-20 01:03:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2325, N'会员等级', N'', 2, 2, 2262, N'level', N'fa:level-up', N'member/level/index', N'MemberLevel', 0, N'1', N'1', N'1', N'', N'2023-08-22 12:41:01', N'1', N'2023-08-22 21:47:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2326, N'会员等级查询', N'member:level:query', 3, 1, 2325, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 12:41:02', N'', N'2023-08-22 12:41:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2327, N'会员等级创建', N'member:level:create', 3, 2, 2325, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 12:41:02', N'', N'2023-08-22 12:41:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2328, N'会员等级更新', N'member:level:update', 3, 3, 2325, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 12:41:02', N'', N'2023-08-22 12:41:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2329, N'会员等级删除', N'member:level:delete', 3, 4, 2325, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 12:41:02', N'', N'2023-08-22 12:41:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2330, N'会员分组', N'', 2, 3, 2262, N'group', N'fa:group', N'member/group/index', N'MemberGroup', 0, N'1', N'1', N'1', N'', N'2023-08-22 13:50:06', N'1', N'2023-10-01 23:42:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2331, N'用户分组查询', N'member:group:query', 3, 1, 2330, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 13:50:06', N'', N'2023-08-22 13:50:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2332, N'用户分组创建', N'member:group:create', 3, 2, 2330, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 13:50:06', N'', N'2023-08-22 13:50:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2333, N'用户分组更新', N'member:group:update', 3, 3, 2330, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 13:50:06', N'', N'2023-08-22 13:50:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2334, N'用户分组删除', N'member:group:delete', 3, 4, 2330, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-22 13:50:06', N'', N'2023-08-22 13:50:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2335, N'用户等级修改', N'member:user:update-level', 3, 5, 2317, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-08-23 16:49:05', N'', N'2023-08-23 16:50:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2336, N'商品评论', N'', 2, 5, 2000, N'comment', N'ep:comment', N'mall/product/comment/index', N'ProductComment', 0, N'1', N'1', N'1', N'1', N'2023-08-26 11:03:00', N'1', N'2023-08-26 11:03:38', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2337, N'评论查询', N'product:comment:query', 3, 1, 2336, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-26 11:04:01', N'1', N'2023-08-26 11:04:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2338, N'添加自评', N'product:comment:create', 3, 2, 2336, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-26 11:04:23', N'1', N'2023-08-26 11:08:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2339, N'商家回复', N'product:comment:update', 3, 3, 2336, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-26 11:04:37', N'1', N'2023-08-26 11:04:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2340, N'显隐评论', N'product:comment:update', 3, 4, 2336, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-08-26 11:04:55', N'1', N'2023-08-26 11:04:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2341, N'优惠劵发送', N'promotion:coupon:send', 3, 2, 2038, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-09-02 00:03:14', N'1', N'2023-09-02 00:03:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2342, N'交易配置', N'', 2, 0, 2072, N'config', N'ep:setting', N'mall/trade/config/index', N'TradeConfig', 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'1', N'2024-02-26 20:30:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2343, N'交易中心配置查询', N'trade:config:query', 3, 1, 2342, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2344, N'交易中心配置保存', N'trade:config:save', 3, 2, 2342, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2345, N'分销管理', N'', 1, 4, 2072, N'brokerage', N'fa-solid:project-diagram', N'', N'', 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'1', N'2023-09-28 10:58:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2346, N'分销用户', N'', 2, 0, 2345, N'brokerage-user', N'fa-solid:user-tie', N'mall/trade/brokerage/user/index', N'TradeBrokerageUser', 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'1', N'2024-02-26 20:33:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2347, N'分销用户查询', N'trade:brokerage-user:query', 3, 1, 2346, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2348, N'分销用户推广人查询', N'trade:brokerage-user:user-query', 3, 2, 2346, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2349, N'分销用户推广订单查询', N'trade:brokerage-user:order-query', 3, 3, 2346, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2350, N'分销用户修改推广资格', N'trade:brokerage-user:update-brokerage-enable', 3, 4, 2346, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2351, N'分销用户修改推广员', N'trade:brokerage-user:update-bind-user', 3, 5, 2346, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2352, N'分销用户清除推广员', N'trade:brokerage-user:clear-bind-user', 3, 6, 2346, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2353, N'佣金记录', N'', 2, 1, 2345, N'brokerage-record', N'fa:money', N'mall/trade/brokerage/record/index', N'TradeBrokerageRecord', 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'1', N'2024-02-26 20:33:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2354, N'佣金记录查询', N'trade:brokerage-record:query', 3, 1, 2353, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2355, N'佣金提现', N'', 2, 2, 2345, N'brokerage-withdraw', N'fa:credit-card', N'mall/trade/brokerage/withdraw/index', N'TradeBrokerageWithdraw', 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'1', N'2024-02-26 20:33:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2356, N'佣金提现查询', N'trade:brokerage-withdraw:query', 3, 1, 2355, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2357, N'佣金提现审核', N'trade:brokerage-withdraw:audit', 3, 2, 2355, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-28 02:46:22', N'', N'2023-09-28 02:46:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2358, N'统计中心', N'', 1, 75, 2362, N'statistics', N'ep:data-line', N'', N'', 0, N'1', N'1', N'1', N'', N'2023-09-30 03:22:40', N'1', N'2023-09-30 11:54:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2359, N'交易统计', N'', 2, 4, 2358, N'trade', N'fa-solid:credit-card', N'mall/statistics/trade/index', N'TradeStatistics', 0, N'1', N'1', N'1', N'', N'2023-09-30 03:22:40', N'1', N'2024-02-26 20:42:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2360, N'交易统计查询', N'statistics:trade:query', 3, 1, 2359, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-30 03:22:40', N'', N'2023-09-30 03:22:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2361, N'交易统计导出', N'statistics:trade:export', 3, 2, 2359, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-09-30 03:22:40', N'', N'2023-09-30 03:22:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2362, N'商城系统', N'', 1, 59, 0, N'/mall', N'ep:shop', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-09-30 11:52:02', N'1', N'2023-09-30 11:52:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2363, N'用户积分修改', N'member:user:update-point', 3, 6, 2317, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-01 14:39:43', N'', N'2023-10-01 14:39:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2364, N'用户余额修改', N'member:user:update-balance', 3, 7, 2317, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2023-10-01 14:39:43', N'1', N'2023-10-01 22:42:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2365, N'优惠劵', N'', 1, 2, 2030, N'coupon', N'fa-solid:disease', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-10-03 12:39:15', N'1', N'2023-10-05 00:16:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2366, N'砍价记录', N'', 2, 2, 2310, N'record', N'ep:list', N'mall/promotion/bargain/record/index', N'PromotionBargainRecord', 0, N'1', N'1', N'1', N'', N'2023-10-05 02:49:06', N'1', N'2023-10-05 10:50:38', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2367, N'砍价记录查询', N'promotion:bargain-record:query', 3, 1, 2366, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-05 02:49:06', N'', N'2023-10-05 02:49:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2368, N'助力记录查询', N'promotion:bargain-help:query', 3, 2, 2366, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-10-05 12:27:49', N'1', N'2023-10-05 12:27:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2369, N'拼团记录', N'promotion:combination-record:query', 2, 2, 2303, N'record', N'ep:avatar', N'mall/promotion/combination/record/index.vue', N'PromotionCombinationRecord', 0, N'1', N'1', N'1', N'1', N'2023-10-08 07:10:22', N'1', N'2023-10-08 07:34:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2374, N'会员统计', N'', 2, 2, 2358, N'member', N'ep:avatar', N'mall/statistics/member/index', N'MemberStatistics', 0, N'1', N'1', N'1', N'', N'2023-10-11 04:39:24', N'1', N'2024-02-26 20:41:46', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2375, N'会员统计查询', N'statistics:member:query', 3, 1, 2374, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-11 04:39:24', N'', N'2023-10-11 04:39:24', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2376, N'订单核销', N'trade:order:pick-up', 3, 10, 2076, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-10-14 17:11:58', N'1', N'2023-10-14 17:11:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2377, N'文章分类', N'', 2, 0, 2387, N'article/category', N'fa:certificate', N'mall/promotion/article/category/index', N'ArticleCategory', 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'1', N'2023-10-16 09:38:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2378, N'分类查询', N'promotion:article-category:query', 3, 1, 2377, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2379, N'分类创建', N'promotion:article-category:create', 3, 2, 2377, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2380, N'分类更新', N'promotion:article-category:update', 3, 3, 2377, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2381, N'分类删除', N'promotion:article-category:delete', 3, 4, 2377, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2382, N'文章列表', N'', 2, 2, 2387, N'article', N'ep:connection', N'mall/promotion/article/index', N'Article', 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'1', N'2023-10-16 09:41:19', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2383, N'文章管理查询', N'promotion:article:query', 3, 1, 2382, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2384, N'文章管理创建', N'promotion:article:create', 3, 2, 2382, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2385, N'文章管理更新', N'promotion:article:update', 3, 3, 2382, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2386, N'文章管理删除', N'promotion:article:delete', 3, 4, 2382, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-16 01:26:18', N'', N'2023-10-16 01:26:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2387, N'内容管理', N'', 1, 1, 2030, N'content', N'ep:collection', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-10-16 09:37:31', N'1', N'2023-10-16 09:37:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2388, N'商城首页', N'', 2, 1, 2362, N'home', N'ep:home-filled', N'mall/home/index', N'MallHome', 0, N'1', N'1', N'1', N'', N'2023-10-16 12:10:33', N'', N'2023-10-16 12:10:33', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2389, N'核销订单', N'', 2, 2, 2166, N'pick-up-order', N'ep:list', N'mall/trade/delivery/pickUpOrder/index', N'PickUpOrder', 0, N'1', N'1', N'1', N'', N'2023-10-19 16:09:51', N'', N'2023-10-19 16:09:51', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2390, N'优惠活动', N'', 1, 99, 2030, N'youhui', N'ep:aim', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-10-21 19:23:49', N'1', N'2023-10-21 19:23:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2391, N'客户管理', N'', 2, 10, 2397, N'customer', N'fa:address-book-o', N'crm/customer/index', N'CrmCustomer', 0, N'1', N'1', N'1', N'', N'2023-10-29 09:04:21', N'1', N'2024-02-17 17:13:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2392, N'客户查询', N'crm:customer:query', 3, 1, 2391, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 09:04:21', N'', N'2023-10-29 09:04:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2393, N'客户创建', N'crm:customer:create', 3, 2, 2391, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 09:04:21', N'', N'2023-10-29 09:04:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2394, N'客户更新', N'crm:customer:update', 3, 3, 2391, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 09:04:21', N'', N'2023-10-29 09:04:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2395, N'客户删除', N'crm:customer:delete', 3, 4, 2391, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 09:04:21', N'', N'2023-10-29 09:04:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2396, N'客户导出', N'crm:customer:export', 3, 5, 2391, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 09:04:21', N'', N'2023-10-29 09:04:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2397, N'CRM 系统', N'', 1, 200, 0, N'/crm', N'ep:avatar', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-10-29 17:08:30', N'1', N'2024-02-04 15:37:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2398, N'合同管理', N'', 2, 50, 2397, N'contract', N'ep:notebook', N'crm/contract/index', N'CrmContract', 0, N'1', N'1', N'1', N'', N'2023-10-29 10:50:41', N'1', N'2024-02-17 17:15:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2399, N'合同查询', N'crm:contract:query', 3, 1, 2398, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 10:50:41', N'', N'2023-10-29 10:50:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2400, N'合同创建', N'crm:contract:create', 3, 2, 2398, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 10:50:41', N'', N'2023-10-29 10:50:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2401, N'合同更新', N'crm:contract:update', 3, 3, 2398, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 10:50:41', N'', N'2023-10-29 10:50:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2402, N'合同删除', N'crm:contract:delete', 3, 4, 2398, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 10:50:41', N'', N'2023-10-29 10:50:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2403, N'合同导出', N'crm:contract:export', 3, 5, 2398, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 10:50:41', N'', N'2023-10-29 10:50:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2404, N'线索管理', N'', 2, 8, 2397, N'clue', N'fa:pagelines', N'crm/clue/index', N'CrmClue', 0, N'1', N'1', N'1', N'', N'2023-10-29 11:06:29', N'1', N'2024-02-17 17:15:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2405, N'线索查询', N'crm:clue:query', 3, 1, 2404, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:06:29', N'', N'2023-10-29 11:06:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2406, N'线索创建', N'crm:clue:create', 3, 2, 2404, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:06:29', N'', N'2023-10-29 11:06:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2407, N'线索更新', N'crm:clue:update', 3, 3, 2404, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:06:29', N'', N'2023-10-29 11:06:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2408, N'线索删除', N'crm:clue:delete', 3, 4, 2404, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:06:29', N'', N'2023-10-29 11:06:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2409, N'线索导出', N'crm:clue:export', 3, 5, 2404, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:06:29', N'', N'2023-10-29 11:06:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2410, N'商机管理', N'', 2, 40, 2397, N'business', N'fa:bus', N'crm/business/index', N'CrmBusiness', 0, N'1', N'1', N'1', N'', N'2023-10-29 11:12:35', N'1', N'2024-02-17 17:14:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2411, N'商机查询', N'crm:business:query', 3, 1, 2410, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:12:35', N'', N'2023-10-29 11:12:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2412, N'商机创建', N'crm:business:create', 3, 2, 2410, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:12:35', N'', N'2023-10-29 11:12:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2413, N'商机更新', N'crm:business:update', 3, 3, 2410, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:12:35', N'', N'2023-10-29 11:12:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2414, N'商机删除', N'crm:business:delete', 3, 4, 2410, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:12:35', N'', N'2023-10-29 11:12:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2415, N'商机导出', N'crm:business:export', 3, 5, 2410, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:12:35', N'', N'2023-10-29 11:12:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2416, N'联系人管理', N'', 2, 20, 2397, N'contact', N'fa:address-book-o', N'crm/contact/index', N'CrmContact', 0, N'1', N'1', N'1', N'', N'2023-10-29 11:14:56', N'1', N'2024-02-17 17:13:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2417, N'联系人查询', N'crm:contact:query', 3, 1, 2416, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:14:56', N'', N'2023-10-29 11:14:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2418, N'联系人创建', N'crm:contact:create', 3, 2, 2416, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:14:56', N'', N'2023-10-29 11:14:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2419, N'联系人更新', N'crm:contact:update', 3, 3, 2416, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:14:56', N'', N'2023-10-29 11:14:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2420, N'联系人删除', N'crm:contact:delete', 3, 4, 2416, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:14:56', N'', N'2023-10-29 11:14:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2421, N'联系人导出', N'crm:contact:export', 3, 5, 2416, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:14:56', N'', N'2023-10-29 11:14:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2422, N'回款管理', N'', 2, 60, 2397, N'receivable', N'ep:money', N'crm/receivable/index', N'CrmReceivable', 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'1', N'2024-02-17 17:16:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2423, N'回款管理查询', N'crm:receivable:query', 3, 1, 2422, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2424, N'回款管理创建', N'crm:receivable:create', 3, 2, 2422, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2425, N'回款管理更新', N'crm:receivable:update', 3, 3, 2422, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2426, N'回款管理删除', N'crm:receivable:delete', 3, 4, 2422, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2427, N'回款管理导出', N'crm:receivable:export', 3, 5, 2422, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2428, N'回款计划', N'', 2, 61, 2397, N'receivable-plan', N'fa:money', N'crm/receivable/plan/index', N'CrmReceivablePlan', 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'1', N'2024-02-17 17:16:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2429, N'回款计划查询', N'crm:receivable-plan:query', 3, 1, 2428, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2430, N'回款计划创建', N'crm:receivable-plan:create', 3, 2, 2428, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2431, N'回款计划更新', N'crm:receivable-plan:update', 3, 3, 2428, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2432, N'回款计划删除', N'crm:receivable-plan:delete', 3, 4, 2428, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2433, N'回款计划导出', N'crm:receivable-plan:export', 3, 5, 2428, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 11:18:09', N'', N'2023-10-29 11:18:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2435, N'商城装修', N'', 2, 20, 2030, N'diy-template', N'fa6-solid:brush', N'mall/promotion/diy/template/index', N'DiyTemplate', 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2436, N'装修模板', N'', 2, 1, 2435, N'diy-template', N'fa6-solid:brush', N'mall/promotion/diy/template/index', N'DiyTemplate', 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2437, N'装修模板查询', N'promotion:diy-template:query', 3, 1, 2436, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2438, N'装修模板创建', N'promotion:diy-template:create', 3, 2, 2436, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2439, N'装修模板更新', N'promotion:diy-template:update', 3, 3, 2436, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2440, N'装修模板删除', N'promotion:diy-template:delete', 3, 4, 2436, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2441, N'装修模板使用', N'promotion:diy-template:use', 3, 5, 2436, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2442, N'装修页面', N'', 2, 2, 2435, N'diy-page', N'foundation:page-edit', N'mall/promotion/diy/page/index', N'DiyPage', 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2443, N'装修页面查询', N'promotion:diy-page:query', 3, 1, 2442, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:25', N'', N'2023-10-29 14:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2444, N'装修页面创建', N'promotion:diy-page:create', 3, 2, 2442, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:26', N'', N'2023-10-29 14:19:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2445, N'装修页面更新', N'promotion:diy-page:update', 3, 3, 2442, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:26', N'', N'2023-10-29 14:19:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2446, N'装修页面删除', N'promotion:diy-page:delete', 3, 4, 2442, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-10-29 14:19:26', N'', N'2023-10-29 14:19:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2447, N'三方登录', N'', 1, 10, 1, N'social', N'fa:rocket', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-11-04 12:12:01', N'1', N'2024-02-29 01:14:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2448, N'三方应用', N'', 2, 1, 2447, N'client', N'ep:set-up', N'views/system/social/client/index.vue', N'SocialClient', 0, N'1', N'1', N'1', N'1', N'2023-11-04 12:17:19', N'1', N'2023-11-04 12:17:19', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2449, N'三方应用查询', N'system:social-client:query', 3, 1, 2448, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-11-04 12:43:12', N'1', N'2023-11-04 12:43:33', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2450, N'三方应用创建', N'system:social-client:create', 3, 2, 2448, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-11-04 12:43:58', N'1', N'2023-11-04 12:43:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2451, N'三方应用更新', N'system:social-client:update', 3, 3, 2448, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-11-04 12:44:27', N'1', N'2023-11-04 12:44:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2452, N'三方应用删除', N'system:social-client:delete', 3, 4, 2448, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-11-04 12:44:43', N'1', N'2023-11-04 12:44:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2453, N'三方用户', N'system:social-user:query', 2, 2, 2447, N'user', N'ep:avatar', N'system/social/user/index.vue', N'SocialUser', 0, N'1', N'1', N'1', N'1', N'2023-11-04 14:01:05', N'1', N'2023-11-04 14:01:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2472, N'主子表(内嵌)', N'', 2, 12, 1070, N'demo03-inner', N'fa:power-off', N'infra/demo/demo03/inner/index', N'Demo03StudentInner', 0, N'1', N'1', N'1', N'', N'2023-11-13 04:39:51', N'1', N'2023-11-16 23:53:46', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2478, N'单表(增删改查)', N'', 2, 1, 1070, N'demo01-contact', N'ep:bicycle', N'infra/demo/demo01/index', N'Demo01Contact', 0, N'1', N'1', N'1', N'', N'2023-11-15 14:42:30', N'1', N'2023-11-16 20:34:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2479, N'示例联系人查询', N'infra:demo01-contact:query', 3, 1, 2478, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-15 14:42:30', N'', N'2023-11-15 14:42:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2480, N'示例联系人创建', N'infra:demo01-contact:create', 3, 2, 2478, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-15 14:42:30', N'', N'2023-11-15 14:42:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2481, N'示例联系人更新', N'infra:demo01-contact:update', 3, 3, 2478, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-15 14:42:30', N'', N'2023-11-15 14:42:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2482, N'示例联系人删除', N'infra:demo01-contact:delete', 3, 4, 2478, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-15 14:42:30', N'', N'2023-11-15 14:42:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2483, N'示例联系人导出', N'infra:demo01-contact:export', 3, 5, 2478, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-15 14:42:30', N'', N'2023-11-15 14:42:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2484, N'树表(增删改查)', N'', 2, 2, 1070, N'demo02-category', N'fa:tree', N'infra/demo/demo02/index', N'Demo02Category', 0, N'1', N'1', N'1', N'', N'2023-11-16 12:18:27', N'1', N'2023-11-16 20:35:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2485, N'示例分类查询', N'infra:demo02-category:query', 3, 1, 2484, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:18:27', N'', N'2023-11-16 12:18:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2486, N'示例分类创建', N'infra:demo02-category:create', 3, 2, 2484, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:18:27', N'', N'2023-11-16 12:18:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2487, N'示例分类更新', N'infra:demo02-category:update', 3, 3, 2484, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:18:27', N'', N'2023-11-16 12:18:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2488, N'示例分类删除', N'infra:demo02-category:delete', 3, 4, 2484, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:18:27', N'', N'2023-11-16 12:18:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2489, N'示例分类导出', N'infra:demo02-category:export', 3, 5, 2484, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:18:27', N'', N'2023-11-16 12:18:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2490, N'主子表(标准)', N'', 2, 10, 1070, N'demo03-normal', N'fa:battery-3', N'infra/demo/demo03/normal/index', N'Demo03StudentNormal', 0, N'1', N'1', N'1', N'', N'2023-11-16 12:53:37', N'1', N'2023-11-16 23:10:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2491, N'学生查询', N'infra:demo03-student:query', 3, 1, 2490, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:53:37', N'', N'2023-11-16 12:53:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2492, N'学生创建', N'infra:demo03-student:create', 3, 2, 2490, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:53:37', N'', N'2023-11-16 12:53:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2493, N'学生更新', N'infra:demo03-student:update', 3, 3, 2490, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:53:37', N'', N'2023-11-16 12:53:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2494, N'学生删除', N'infra:demo03-student:delete', 3, 4, 2490, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:53:37', N'', N'2023-11-16 12:53:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2495, N'学生导出', N'infra:demo03-student:export', 3, 5, 2490, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-16 12:53:37', N'', N'2023-11-16 12:53:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2497, N'主子表(ERP)', N'', 2, 11, 1070, N'demo03-erp', N'ep:calendar', N'infra/demo/demo03/erp/index', N'Demo03StudentERP', 0, N'1', N'1', N'1', N'', N'2023-11-16 15:50:59', N'1', N'2023-11-17 13:19:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2516, N'客户公海配置', N'', 2, 0, 2524, N'customer-pool-config', N'ep:data-analysis', N'crm/customer/poolConfig/index', N'CrmCustomerPoolConfig', 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:31', N'1', N'2024-01-03 19:52:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2517, N'客户公海配置保存', N'crm:customer-pool-config:update', 3, 1, 2516, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:31', N'', N'2023-11-18 13:33:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2518, N'客户限制配置', N'', 2, 1, 2524, N'customer-limit-config', N'ep:avatar', N'crm/customer/limitConfig/index', N'CrmCustomerLimitConfig', 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:53', N'1', N'2024-02-24 16:43:33', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2519, N'客户限制配置查询', N'crm:customer-limit-config:query', 3, 1, 2518, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:53', N'', N'2023-11-18 13:33:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2520, N'客户限制配置创建', N'crm:customer-limit-config:create', 3, 2, 2518, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:53', N'', N'2023-11-18 13:33:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2521, N'客户限制配置更新', N'crm:customer-limit-config:update', 3, 3, 2518, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:53', N'', N'2023-11-18 13:33:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2522, N'客户限制配置删除', N'crm:customer-limit-config:delete', 3, 4, 2518, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:53', N'', N'2023-11-18 13:33:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2523, N'客户限制配置导出', N'crm:customer-limit-config:export', 3, 5, 2518, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-11-18 13:33:53', N'', N'2023-11-18 13:33:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2524, N'系统配置', N'', 1, 999, 2397, N'config', N'ep:connection', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-11-18 21:58:00', N'1', N'2024-02-17 17:14:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2525, N'WebSocket', N'', 2, 5, 2, N'websocket', N'ep:connection', N'infra/webSocket/index', N'InfraWebSocket', 0, N'1', N'1', N'1', N'1', N'2023-11-23 19:41:55', N'1', N'2024-04-23 00:02:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2526, N'产品管理', N'', 2, 80, 2397, N'product', N'fa:product-hunt', N'crm/product/index', N'CrmProduct', 0, N'1', N'1', N'1', N'1', N'2023-12-05 22:45:26', N'1', N'2024-02-20 20:36:20', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2527, N'产品查询', N'crm:product:query', 3, 1, 2526, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-05 22:47:16', N'1', N'2023-12-05 22:47:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2528, N'产品创建', N'crm:product:create', 3, 2, 2526, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-05 22:47:41', N'1', N'2023-12-05 22:47:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2529, N'产品更新', N'crm:product:update', 3, 3, 2526, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-05 22:48:03', N'1', N'2023-12-05 22:48:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2530, N'产品删除', N'crm:product:delete', 3, 4, 2526, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-05 22:48:17', N'1', N'2023-12-05 22:48:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2531, N'产品导出', N'crm:product:export', 3, 5, 2526, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-05 22:48:29', N'1', N'2023-12-05 22:48:29', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2532, N'产品分类配置', N'', 2, 3, 2524, N'product/category', N'fa-solid:window-restore', N'crm/product/category/index', N'CrmProductCategory', 0, N'1', N'1', N'1', N'1', N'2023-12-06 12:52:36', N'1', N'2023-12-06 12:52:51', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2533, N'产品分类查询', N'crm:product-category:query', 3, 1, 2532, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-06 12:53:23', N'1', N'2023-12-06 12:53:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2534, N'产品分类创建', N'crm:product-category:create', 3, 2, 2532, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-06 12:53:41', N'1', N'2023-12-06 12:53:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2535, N'产品分类更新', N'crm:product-category:update', 3, 3, 2532, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-06 12:53:59', N'1', N'2023-12-06 12:53:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2536, N'产品分类删除', N'crm:product-category:delete', 3, 4, 2532, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2023-12-06 12:54:14', N'1', N'2023-12-06 12:54:14', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2543, N'关联商机', N'crm:contact:create-business', 3, 10, 2416, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-02 17:28:25', N'1', N'2024-01-02 17:28:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2544, N'取关商机', N'crm:contact:delete-business', 3, 11, 2416, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-02 17:28:43', N'1', N'2024-01-02 17:28:51', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2545, N'商品统计', N'', 2, 3, 2358, N'product', N'fa:product-hunt', N'mall/statistics/product/index', N'ProductStatistics', 0, N'1', N'1', N'1', N'', N'2023-12-15 18:54:28', N'1', N'2024-02-26 20:41:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2546, N'客户公海', N'', 2, 30, 2397, N'customer/pool', N'fa-solid:swimming-pool', N'crm/customer/pool/index', N'CrmCustomerPool', 0, N'1', N'1', N'1', N'1', N'2024-01-15 21:29:34', N'1', N'2024-02-17 17:14:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2547, N'订单查询', N'trade:order:query', 3, 1, 2076, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-16 08:52:00', N'1', N'2024-01-16 08:52:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2548, N'订单更新', N'trade:order:update', 3, 2, 2076, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-16 08:52:21', N'1', N'2024-01-16 08:52:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2549, N'支付&退款案例', N'', 2, 1, 2161, N'order', N'fa:paypal', N'pay/demo/order/index', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-18 23:45:00', N'1', N'2024-01-18 23:47:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2550, N'转账案例', N'', 2, 2, 2161, N'transfer', N'fa:transgender-alt', N'pay/demo/transfer/index', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-18 23:51:16', N'1', N'2024-01-18 23:51:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2551, N'钱包管理', N'', 1, 4, 1117, N'wallet', N'ep:wallet', N'', N'', 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'1', N'2024-02-29 08:58:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2552, N'充值套餐', N'', 2, 2, 2551, N'wallet-recharge-package', N'fa:leaf', N'pay/wallet/rechargePackage/index', N'WalletRechargePackage', 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2553, N'钱包充值套餐查询', N'pay:wallet-recharge-package:query', 3, 1, 2552, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2554, N'钱包充值套餐创建', N'pay:wallet-recharge-package:create', 3, 2, 2552, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2555, N'钱包充值套餐更新', N'pay:wallet-recharge-package:update', 3, 3, 2552, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2556, N'钱包充值套餐删除', N'pay:wallet-recharge-package:delete', 3, 4, 2552, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2557, N'钱包余额', N'', 2, 1, 2551, N'wallet-balance', N'fa:leaf', N'pay/wallet/balance/index', N'WalletBalance', 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2558, N'钱包余额查询', N'pay:wallet:query', 3, 1, 2557, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2559, N'转账订单', N'', 2, 3, 1117, N'transfer', N'ep:credit-card', N'pay/transfer/index', N'PayTransfer', 0, N'1', N'1', N'1', N'', N'2023-12-29 02:32:54', N'', N'2023-12-29 02:32:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2560, N'数据统计', N'', 1, 200, 2397, N'statistics', N'ep:data-line', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-01-26 22:50:35', N'1', N'2024-02-24 20:10:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2561, N'排行榜', N'crm:statistics-rank:query', 2, 1, 2560, N'ranking', N'fa:area-chart', N'crm/statistics/rank/index', N'CrmStatisticsRank', 0, N'1', N'1', N'1', N'1', N'2024-01-26 22:52:09', N'1', N'2024-04-24 19:39:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2562, N'客户导入', N'crm:customer:import', 3, 6, 2391, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-01 13:09:00', N'1', N'2024-02-01 13:09:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2563, N'ERP 系统', N'', 1, 300, 0, N'/erp', N'fa-solid:store', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-04 15:37:25', N'1', N'2024-02-04 15:37:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2564, N'产品管理', N'', 1, 40, 2563, N'product', N'fa:product-hunt', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-04 15:38:43', N'1', N'2024-02-04 15:38:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2565, N'产品信息', N'', 2, 0, 2564, N'product', N'fa-solid:apple-alt', N'erp/product/product/index', N'ErpProduct', 0, N'1', N'1', N'1', N'', N'2024-02-04 07:52:15', N'1', N'2024-02-05 14:42:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2566, N'产品查询', N'erp:product:query', 3, 1, 2565, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-02-04 07:52:15', N'1', N'2024-02-04 17:21:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2567, N'产品创建', N'erp:product:create', 3, 2, 2565, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-02-04 07:52:15', N'1', N'2024-02-04 17:22:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2568, N'产品更新', N'erp:product:update', 3, 3, 2565, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-02-04 07:52:15', N'1', N'2024-02-04 17:22:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2569, N'产品删除', N'erp:product:delete', 3, 4, 2565, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-02-04 07:52:15', N'1', N'2024-02-04 17:22:22', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2570, N'产品导出', N'erp:product:export', 3, 5, 2565, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-02-04 07:52:15', N'1', N'2024-02-04 17:22:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2571, N'产品分类', N'', 2, 1, 2564, N'product-category', N'fa:certificate', N'erp/product/category/index', N'ErpProductCategory', 0, N'1', N'1', N'1', N'', N'2024-02-04 09:21:04', N'1', N'2024-02-04 17:24:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2572, N'分类查询', N'erp:product-category:query', 3, 1, 2571, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 09:21:04', N'', N'2024-02-04 09:21:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2573, N'分类创建', N'erp:product-category:create', 3, 2, 2571, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 09:21:04', N'', N'2024-02-04 09:21:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2574, N'分类更新', N'erp:product-category:update', 3, 3, 2571, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 09:21:04', N'', N'2024-02-04 09:21:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2575, N'分类删除', N'erp:product-category:delete', 3, 4, 2571, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 09:21:04', N'', N'2024-02-04 09:21:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2576, N'分类导出', N'erp:product-category:export', 3, 5, 2571, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 09:21:04', N'', N'2024-02-04 09:21:04', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2577, N'产品单位', N'', 2, 2, 2564, N'unit', N'ep:opportunity', N'erp/product/unit/index', N'ErpProductUnit', 0, N'1', N'1', N'1', N'', N'2024-02-04 11:54:08', N'1', N'2024-02-04 19:54:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2578, N'单位查询', N'erp:product-unit:query', 3, 1, 2577, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 11:54:08', N'', N'2024-02-04 11:54:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2579, N'单位创建', N'erp:product-unit:create', 3, 2, 2577, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 11:54:08', N'', N'2024-02-04 11:54:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2580, N'单位更新', N'erp:product-unit:update', 3, 3, 2577, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 11:54:08', N'', N'2024-02-04 11:54:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2581, N'单位删除', N'erp:product-unit:delete', 3, 4, 2577, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 11:54:08', N'', N'2024-02-04 11:54:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2582, N'单位导出', N'erp:product-unit:export', 3, 5, 2577, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 11:54:08', N'', N'2024-02-04 11:54:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2583, N'库存管理', N'', 1, 30, 2563, N'stock', N'fa:window-restore', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-05 00:29:37', N'1', N'2024-02-05 00:29:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2584, N'仓库信息', N'', 2, 0, 2583, N'warehouse', N'ep:house', N'erp/stock/warehouse/index', N'ErpWarehouse', 0, N'1', N'1', N'1', N'', N'2024-02-04 17:12:09', N'1', N'2024-02-05 01:12:53', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2585, N'仓库查询', N'erp:warehouse:query', 3, 1, 2584, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 17:12:09', N'', N'2024-02-04 17:12:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2586, N'仓库创建', N'erp:warehouse:create', 3, 2, 2584, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 17:12:09', N'', N'2024-02-04 17:12:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2587, N'仓库更新', N'erp:warehouse:update', 3, 3, 2584, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 17:12:09', N'', N'2024-02-04 17:12:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2588, N'仓库删除', N'erp:warehouse:delete', 3, 4, 2584, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 17:12:09', N'', N'2024-02-04 17:12:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2589, N'仓库导出', N'erp:warehouse:export', 3, 5, 2584, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-04 17:12:09', N'', N'2024-02-04 17:12:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2590, N'产品库存', N'', 2, 1, 2583, N'stock', N'ep:coffee', N'erp/stock/stock/index', N'ErpStock', 0, N'1', N'1', N'1', N'', N'2024-02-05 06:40:50', N'1', N'2024-02-05 14:42:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2591, N'库存查询', N'erp:stock:query', 3, 1, 2590, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 06:40:50', N'', N'2024-02-05 06:40:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2592, N'库存导出', N'erp:stock:export', 3, 5, 2590, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 06:40:50', N'', N'2024-02-05 06:40:50', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2593, N'出入库明细', N'', 2, 2, 2583, N'record', N'fa-solid:blog', N'erp/stock/record/index', N'ErpStockRecord', 0, N'1', N'1', N'1', N'', N'2024-02-05 10:27:21', N'1', N'2024-02-06 17:26:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2594, N'库存明细查询', N'erp:stock-record:query', 3, 1, 2593, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 10:27:21', N'', N'2024-02-05 10:27:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2595, N'库存明细导出', N'erp:stock-record:export', 3, 5, 2593, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 10:27:21', N'', N'2024-02-05 10:27:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2596, N'其它入库', N'', 2, 3, 2583, N'in', N'ep:zoom-in', N'erp/stock/in/index', N'ErpStockIn', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-07 19:06:51', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2597, N'其它入库单查询', N'erp:stock-in:query', 3, 1, 2596, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-05 16:08:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2598, N'其它入库单创建', N'erp:stock-in:create', 3, 2, 2596, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-05 16:08:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2599, N'其它入库单更新', N'erp:stock-in:update', 3, 3, 2596, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-05 16:08:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2600, N'其它入库单删除', N'erp:stock-in:delete', 3, 4, 2596, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-05 16:08:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2601, N'其它入库单导出', N'erp:stock-in:export', 3, 5, 2596, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-05 16:08:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2602, N'采购管理', N'', 1, 10, 2563, N'purchase', N'fa:buysellads', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-06 16:01:01', N'1', N'2024-02-06 16:01:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2603, N'供应商信息', N'', 2, 4, 2602, N'supplier', N'fa:superpowers', N'erp/purchase/supplier/index', N'ErpSupplier', 0, N'1', N'1', N'1', N'', N'2024-02-06 08:21:55', N'1', N'2024-02-06 16:22:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2604, N'供应商查询', N'erp:supplier:query', 3, 1, 2603, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-06 08:21:55', N'', N'2024-02-06 08:21:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2605, N'供应商创建', N'erp:supplier:create', 3, 2, 2603, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-06 08:21:55', N'', N'2024-02-06 08:21:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2606, N'供应商更新', N'erp:supplier:update', 3, 3, 2603, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-06 08:21:55', N'', N'2024-02-06 08:21:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2607, N'供应商删除', N'erp:supplier:delete', 3, 4, 2603, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-06 08:21:55', N'', N'2024-02-06 08:21:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2608, N'供应商导出', N'erp:supplier:export', 3, 5, 2603, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-06 08:21:55', N'', N'2024-02-06 08:21:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2609, N'其它入库单审批', N'erp:stock-in:update-status', 3, 6, 2596, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-05 16:08:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2610, N'其它出库', N'', 2, 4, 2583, N'out', N'ep:zoom-out', N'erp/stock/out/index', N'ErpStockOut', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-07 19:06:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2611, N'其它出库单查询', N'erp:stock-out:query', 3, 1, 2610, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 06:43:39', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2612, N'其它出库单创建', N'erp:stock-out:create', 3, 2, 2610, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 06:43:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2613, N'其它出库单更新', N'erp:stock-out:update', 3, 3, 2610, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 06:43:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2614, N'其它出库单删除', N'erp:stock-out:delete', 3, 4, 2610, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 06:43:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2615, N'其它出库单导出', N'erp:stock-out:export', 3, 5, 2610, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 06:43:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2616, N'其它出库单审批', N'erp:stock-out:update-status', 3, 6, 2610, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 06:43:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2617, N'销售管理', N'', 1, 20, 2563, N'sale', N'fa:sellsy', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-07 15:12:32', N'1', N'2024-02-07 15:12:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2618, N'客户信息', N'', 2, 4, 2617, N'customer', N'ep:avatar', N'erp/sale/customer/index', N'ErpCustomer', 0, N'1', N'1', N'1', N'', N'2024-02-07 07:21:45', N'1', N'2024-02-07 15:22:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2619, N'客户查询', N'erp:customer:query', 3, 1, 2618, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-07 07:21:45', N'', N'2024-02-07 07:21:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2620, N'客户创建', N'erp:customer:create', 3, 2, 2618, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-07 07:21:45', N'', N'2024-02-07 07:21:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2621, N'客户更新', N'erp:customer:update', 3, 3, 2618, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-07 07:21:45', N'', N'2024-02-07 07:21:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2622, N'客户删除', N'erp:customer:delete', 3, 4, 2618, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-07 07:21:45', N'', N'2024-02-07 07:21:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2623, N'客户导出', N'erp:customer:export', 3, 5, 2618, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-07 07:21:45', N'', N'2024-02-07 07:21:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2624, N'库存调拨', N'', 2, 5, 2583, N'move', N'ep:folder-remove', N'erp/stock/move/index', N'ErpStockMove', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-16 18:53:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2625, N'库存调度单查询', N'erp:stock-move:query', 3, 1, 2624, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2626, N'库存调度单创建', N'erp:stock-move:create', 3, 2, 2624, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2627, N'库存调度单更新', N'erp:stock-move:update', 3, 3, 2624, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2628, N'库存调度单删除', N'erp:stock-move:delete', 3, 4, 2624, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2629, N'库存调度单导出', N'erp:stock-move:export', 3, 5, 2624, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2630, N'库存调度单审批', N'erp:stock-move:update-status', 3, 6, 2624, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:13:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2631, N'库存盘点', N'', 2, 6, 2583, N'check', N'ep:circle-check-filled', N'erp/stock/check/index', N'ErpStockCheck', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-08 08:31:09', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2632, N'库存盘点单查询', N'erp:stock-check:query', 3, 1, 2631, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2633, N'库存盘点单创建', N'erp:stock-check:create', 3, 2, 2631, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2634, N'库存盘点单更新', N'erp:stock-check:update', 3, 3, 2631, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2635, N'库存盘点单删除', N'erp:stock-check:delete', 3, 4, 2631, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2636, N'库存盘点单导出', N'erp:stock-check:export', 3, 5, 2631, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2637, N'库存盘点单审批', N'erp:stock-check:update-status', 3, 6, 2631, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:13:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2638, N'销售订单', N'', 2, 1, 2617, N'order', N'fa:first-order', N'erp/sale/order/index', N'ErpSaleOrder', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-10 21:59:20', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2639, N'销售订单查询', N'erp:sale-order:query', 3, 1, 2638, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2640, N'销售订单创建', N'erp:sale-order:create', 3, 2, 2638, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2641, N'销售订单更新', N'erp:sale-order:update', 3, 3, 2638, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2642, N'销售订单删除', N'erp:sale-order:delete', 3, 4, 2638, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2643, N'销售订单导出', N'erp:sale-order:export', 3, 5, 2638, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2644, N'销售订单审批', N'erp:sale-order:update-status', 3, 6, 2638, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:13:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2645, N'财务管理', N'', 1, 50, 2563, N'finance', N'ep:money', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-10 08:05:58', N'1', N'2024-02-10 08:06:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2646, N'结算账户', N'', 2, 10, 2645, N'account', N'fa:universal-access', N'erp/finance/account/index', N'ErpAccount', 0, N'1', N'1', N'1', N'', N'2024-02-10 00:15:07', N'1', N'2024-02-14 08:24:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2647, N'结算账户查询', N'erp:account:query', 3, 1, 2646, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-10 00:15:07', N'', N'2024-02-10 00:15:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2648, N'结算账户创建', N'erp:account:create', 3, 2, 2646, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-10 00:15:07', N'', N'2024-02-10 00:15:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2649, N'结算账户更新', N'erp:account:update', 3, 3, 2646, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-10 00:15:07', N'', N'2024-02-10 00:15:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2650, N'结算账户删除', N'erp:account:delete', 3, 4, 2646, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-10 00:15:07', N'', N'2024-02-10 00:15:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2651, N'结算账户导出', N'erp:account:export', 3, 5, 2646, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-10 00:15:07', N'', N'2024-02-10 00:15:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2652, N'销售出库', N'', 2, 2, 2617, N'out', N'ep:sold-out', N'erp/sale/out/index', N'ErpSaleOut', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-10 22:02:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2653, N'销售出库查询', N'erp:sale-out:query', 3, 1, 2652, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2654, N'销售出库创建', N'erp:sale-out:create', 3, 2, 2652, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2655, N'销售出库更新', N'erp:sale-out:update', 3, 3, 2652, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2656, N'销售出库删除', N'erp:sale-out:delete', 3, 4, 2652, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2657, N'销售出库导出', N'erp:sale-out:export', 3, 5, 2652, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2658, N'销售出库审批', N'erp:sale-out:update-status', 3, 6, 2652, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:13:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2659, N'销售退货', N'', 2, 3, 2617, N'return', N'fa-solid:bone', N'erp/sale/return/index', N'ErpSaleReturn', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-12 06:12:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2660, N'销售退货查询', N'erp:sale-return:query', 3, 1, 2659, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2661, N'销售退货创建', N'erp:sale-return:create', 3, 2, 2659, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2662, N'销售退货更新', N'erp:sale-return:update', 3, 3, 2659, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:55', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2663, N'销售退货删除', N'erp:sale-return:delete', 3, 4, 2659, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2664, N'销售退货导出', N'erp:sale-return:export', 3, 5, 2659, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:12:59', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2665, N'销售退货审批', N'erp:sale-return:update-status', 3, 6, 2659, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-07 11:13:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2666, N'采购订单', N'', 2, 1, 2602, N'order', N'fa-solid:border-all', N'erp/purchase/order/index', N'ErpPurchaseOrder', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-12 08:51:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2667, N'采购订单查询', N'erp:purchase-order:query', 3, 1, 2666, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2668, N'采购订单创建', N'erp:purchase-order:create', 3, 2, 2666, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2669, N'采购订单更新', N'erp:purchase-order:update', 3, 3, 2666, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2670, N'采购订单删除', N'erp:purchase-order:delete', 3, 4, 2666, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2671, N'采购订单导出', N'erp:purchase-order:export', 3, 5, 2666, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2672, N'采购订单审批', N'erp:purchase-order:update-status', 3, 6, 2666, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2673, N'采购入库', N'', 2, 2, 2602, N'in', N'fa-solid:gopuram', N'erp/purchase/in/index', N'ErpPurchaseIn', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-12 11:19:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2674, N'采购入库查询', N'erp:purchase-in:query', 3, 1, 2673, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2675, N'采购入库创建', N'erp:purchase-in:create', 3, 2, 2673, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2676, N'采购入库更新', N'erp:purchase-in:update', 3, 3, 2673, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2677, N'采购入库删除', N'erp:purchase-in:delete', 3, 4, 2673, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2678, N'采购入库导出', N'erp:purchase-in:export', 3, 5, 2673, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2679, N'采购入库审批', N'erp:purchase-in:update-status', 3, 6, 2673, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2680, N'采购退货', N'', 2, 3, 2602, N'return', N'ep:minus', N'erp/purchase/return/index', N'ErpPurchaseReturn', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-12 20:51:02', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2681, N'采购退货查询', N'erp:purchase-return:query', 3, 1, 2680, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2682, N'采购退货创建', N'erp:purchase-return:create', 3, 2, 2680, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2683, N'采购退货更新', N'erp:purchase-return:update', 3, 3, 2680, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2684, N'采购退货删除', N'erp:purchase-return:delete', 3, 4, 2680, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2685, N'采购退货导出', N'erp:purchase-return:export', 3, 5, 2680, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2686, N'采购退货审批', N'erp:purchase-return:update-status', 3, 6, 2680, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2687, N'付款单', N'', 2, 1, 2645, N'payment', N'ep:caret-right', N'erp/finance/payment/index', N'ErpFinancePayment', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-14 08:24:23', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2688, N'付款单查询', N'erp:finance-payment:query', 3, 1, 2687, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2689, N'付款单创建', N'erp:finance-payment:create', 3, 2, 2687, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2690, N'付款单更新', N'erp:finance-payment:update', 3, 3, 2687, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2691, N'付款单删除', N'erp:finance-payment:delete', 3, 4, 2687, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2692, N'付款单导出', N'erp:finance-payment:export', 3, 5, 2687, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2693, N'付款单审批', N'erp:finance-payment:update-status', 3, 6, 2687, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2694, N'收款单', N'', 2, 2, 2645, N'receipt', N'ep:expand', N'erp/finance/receipt/index', N'ErpFinanceReceipt', 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'1', N'2024-02-15 19:35:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2695, N'收款单查询', N'erp:finance-receipt:query', 3, 1, 2694, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2696, N'收款单创建', N'erp:finance-receipt:create', 3, 2, 2694, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:54', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2697, N'收款单更新', N'erp:finance-receipt:update', 3, 3, 2694, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:44:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2698, N'收款单删除', N'erp:finance-receipt:delete', 3, 4, 2694, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:00', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2699, N'收款单导出', N'erp:finance-receipt:export', 3, 5, 2694, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2700, N'收款单审批', N'erp:finance-receipt:update-status', 3, 6, 2694, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-02-05 16:08:56', N'', N'2024-02-12 00:45:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2701, N'待办事项', N'', 2, 0, 2397, N'backlog', N'fa-solid:tasks', N'crm/backlog/index', N'CrmBacklog', 0, N'1', N'1', N'1', N'1', N'2024-02-17 17:17:11', N'1', N'2024-02-17 17:17:11', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2702, N'ERP 首页', N'erp:statistics:query', 2, 0, 2563, N'home', N'ep:home-filled', N'erp/home/index.vue', N'ErpHome', 0, N'1', N'1', N'1', N'1', N'2024-02-18 16:49:40', N'1', N'2024-02-26 21:12:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2703, N'商机状态配置', N'', 2, 4, 2524, N'business-status', N'fa-solid:charging-station', N'crm/business/status/index', N'CrmBusinessStatus', 0, N'1', N'1', N'1', N'1', N'2024-02-21 20:15:17', N'1', N'2024-02-21 20:15:17', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2704, N'商机状态查询', N'crm:business-status:query', 3, 1, 2703, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-21 20:35:36', N'1', N'2024-02-21 20:36:06', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2705, N'商机状态创建', N'crm:business-status:create', 3, 2, 2703, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-21 20:35:57', N'1', N'2024-02-21 20:35:57', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2706, N'商机状态更新', N'crm:business-status:update', 3, 3, 2703, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-21 20:36:21', N'1', N'2024-02-21 20:36:21', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2707, N'商机状态删除', N'crm:business-status:delete', 3, 4, 2703, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-21 20:36:36', N'1', N'2024-02-21 20:36:36', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2708, N'合同配置', N'', 2, 5, 2524, N'contract-config', N'ep:connection', N'crm/contract/config/index', N'CrmContractConfig', 0, N'1', N'1', N'1', N'1', N'2024-02-24 16:44:40', N'1', N'2024-02-24 16:44:48', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2709, N'客户公海配置查询', N'crm:customer-pool-config:query', 3, 2, 2516, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-24 16:45:19', N'1', N'2024-02-24 16:45:28', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2710, N'合同配置更新', N'crm:contract-config:update', 3, 1, 2708, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-24 16:45:56', N'1', N'2024-02-24 16:45:56', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2711, N'合同配置查询', N'crm:contract-config:query', 3, 2, 2708, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-02-24 16:46:16', N'1', N'2024-02-24 16:46:16', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2712, N'客户分析', N'crm:statistics-customer:query', 2, 0, 2560, N'customer', N'ep:avatar', N'views/crm/statistics/customer/index.vue', N'CrmStatisticsCustomer', 0, N'1', N'1', N'1', N'1', N'2024-03-09 16:43:56', N'1', N'2024-04-24 19:42:52', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2713, N'抄送我的', N'bpm:process-instance-cc:query', 2, 30, 1200, N'copy', N'ep:copy-document', N'bpm/task/copy/index', N'BpmProcessInstanceCopy', 0, N'1', N'1', N'1', N'1', N'2024-03-17 21:50:23', N'1', N'2024-04-24 19:55:12', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2714, N'流程分类', N'', 2, 3, 1186, N'category', N'fa:object-ungroup', N'bpm/category/index', N'BpmCategory', 0, N'1', N'1', N'1', N'', N'2024-03-08 02:00:51', N'1', N'2024-03-21 23:51:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2715, N'分类查询', N'bpm:category:query', 3, 1, 2714, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-03-08 02:00:51', N'1', N'2024-03-19 14:36:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2716, N'分类创建', N'bpm:category:create', 3, 2, 2714, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-03-08 02:00:51', N'1', N'2024-03-19 14:36:31', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2717, N'分类更新', N'bpm:category:update', 3, 3, 2714, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-03-08 02:00:51', N'1', N'2024-03-19 14:36:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2718, N'分类删除', N'bpm:category:delete', 3, 4, 2714, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'', N'2024-03-08 02:00:51', N'1', N'2024-03-19 14:36:41', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2720, N'发起流程', N'', 2, 0, 1200, N'create', N'fa-solid:grin-stars', N'bpm/processInstance/create/index', N'BpmProcessInstanceCreate', 0, N'1', N'0', N'1', N'1', N'2024-03-19 19:46:05', N'1', N'2024-03-23 19:03:42', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2721, N'流程实例', N'', 2, 10, 1186, N'process-instance/manager', N'fa:square', N'bpm/processInstance/manager/index', N'BpmProcessInstanceManager', 0, N'1', N'1', N'1', N'1', N'2024-03-21 23:57:30', N'1', N'2024-03-21 23:57:30', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2722, N'流程实例的查询(管理员)', N'bpm:process-instance:manager-query', 3, 1, 2721, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-03-22 08:18:27', N'1', N'2024-03-22 08:19:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2723, N'流程实例的取消(管理员)', N'bpm:process-instance:cancel-by-admin', 3, 2, 2721, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-03-22 08:19:25', N'1', N'2024-03-22 08:19:25', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2724, N'流程任务', N'', 2, 11, 1186, N'process-tasnk', N'ep:collection-tag', N'bpm/task/manager/index', N'BpmManagerTask', 0, N'1', N'1', N'1', N'1', N'2024-03-22 08:43:22', N'1', N'2024-03-22 08:43:27', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2725, N'流程任务的查询(管理员)', N'bpm:task:mananger-query', 3, 1, 2724, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-03-22 08:43:49', N'1', N'2024-03-22 08:43:49', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2726, N'流程监听器', N'', 2, 5, 1186, N'process-listener', N'fa:assistive-listening-systems', N'bpm/processListener/index', N'BpmProcessListener', 0, N'1', N'1', N'1', N'', N'2024-03-09 16:05:34', N'1', N'2024-03-23 13:13:38', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2727, N'流程监听器查询', N'bpm:process-listener:query', 3, 1, 2726, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 16:05:34', N'', N'2024-03-09 16:05:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2728, N'流程监听器创建', N'bpm:process-listener:create', 3, 2, 2726, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 16:05:34', N'', N'2024-03-09 16:05:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2729, N'流程监听器更新', N'bpm:process-listener:update', 3, 3, 2726, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 16:05:34', N'', N'2024-03-09 16:05:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2730, N'流程监听器删除', N'bpm:process-listener:delete', 3, 4, 2726, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 16:05:34', N'', N'2024-03-09 16:05:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2731, N'流程表达式', N'', 2, 6, 1186, N'process-expression', N'fa:wpexplorer', N'bpm/processExpression/index', N'BpmProcessExpression', 0, N'1', N'1', N'1', N'', N'2024-03-09 22:35:08', N'1', N'2024-03-23 19:43:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2732, N'流程表达式查询', N'bpm:process-expression:query', 3, 1, 2731, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 22:35:08', N'', N'2024-03-09 22:35:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2733, N'流程表达式创建', N'bpm:process-expression:create', 3, 2, 2731, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 22:35:08', N'', N'2024-03-09 22:35:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2734, N'流程表达式更新', N'bpm:process-expression:update', 3, 3, 2731, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 22:35:08', N'', N'2024-03-09 22:35:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2735, N'流程表达式删除', N'bpm:process-expression:delete', 3, 4, 2731, N'', N'', N'', NULL, 0, N'1', N'1', N'1', N'', N'2024-03-09 22:35:08', N'', N'2024-03-09 22:35:08', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2736, N'员工业绩', N'crm:statistics-performance:query', 2, 3, 2560, N'performance', N'ep:dish-dot', N'crm/statistics/performance/index', N'CrmStatisticsPerformance', 0, N'1', N'1', N'1', N'1', N'2024-04-05 13:49:20', N'1', N'2024-04-24 19:42:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2737, N'客户画像', N'crm:statistics-portrait:query', 2, 4, 2560, N'portrait', N'ep:picture', N'crm/statistics/portrait/index', N'CrmStatisticsPortrait', 0, N'1', N'1', N'1', N'1', N'2024-04-05 13:57:40', N'1', N'2024-04-24 19:42:24', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2738, N'销售漏斗', N'crm:statistics-funnel:query', 2, 5, 2560, N'funnel', N'ep:grape', N'crm/statistics/funnel/index', N'CrmStatisticsFunnel', 0, N'1', N'1', N'1', N'1', N'2024-04-13 10:53:26', N'1', N'2024-04-24 19:39:33', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2739, N'消息中心', N'', 1, 7, 1, N'messages', N'ep:chat-dot-round', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-22 23:54:30', N'1', N'2024-04-23 09:36:35', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2740, N'监控中心', N'', 1, 10, 2, N'monitors', N'ep:monitor', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-23 00:04:44', N'1', N'2024-04-23 00:04:44', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2741, N'领取公海客户', N'crm:customer:receive', 3, 1, 2546, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:47:45', N'1', N'2024-04-24 19:47:45', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2742, N'分配公海客户', N'crm:customer:distribute', 3, 2, 2546, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:48:05', N'1', N'2024-04-24 19:48:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2743, N'商品统计查询', N'statistics:product:query', 3, 1, 2545, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:50:05', N'1', N'2024-04-24 19:50:05', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2744, N'商品统计导出', N'statistics:product:export', 3, 2, 2545, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:50:26', N'1', N'2024-04-24 19:50:26', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2745, N'支付渠道查询', N'pay:channel:query', 3, 10, 1126, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:53:01', N'1', N'2024-04-24 19:53:01', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2746, N'支付渠道创建', N'pay:channel:create', 3, 11, 1126, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:53:18', N'1', N'2024-04-24 19:53:18', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2747, N'支付渠道更新', N'pay:channel:update', 3, 12, 1126, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:53:32', N'1', N'2024-04-24 19:53:58', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2748, N'支付渠道删除', N'pay:channel:delete', 3, 13, 1126, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:54:34', N'1', N'2024-04-24 19:54:34', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2749, N'商品收藏查询', N'product:favorite:query', 3, 10, 2014, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:55:47', N'1', N'2024-04-24 19:55:47', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2750, N'商品浏览查询', N'product:browse-history:query', 3, 20, 2014, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:57:43', N'1', N'2024-04-24 19:57:43', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2751, N'售后同意', N'trade:after-sale:agree', 3, 2, 2073, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:58:40', N'1', N'2024-04-24 19:58:40', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2752, N'售后不同意', N'trade:after-sale:disagree', 3, 3, 2073, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 19:59:03', N'1', N'2024-04-24 19:59:03', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2753, N'售后确认退货', N'trade:after-sale:receive', 3, 4, 2073, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 20:00:07', N'1', N'2024-04-24 20:00:07', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2754, N'售后确认退款', N'trade:after-sale:refund', 3, 5, 2073, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 20:00:24', N'1', N'2024-04-24 20:00:24', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2755, N'删除项目', N'report:go-view-project:delete', 3, 2, 2153, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 20:01:37', N'1', N'2024-04-24 20:01:37', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2756, N'会员等级记录查询', N'member:level-record:query', 3, 10, 2325, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 20:02:32', N'1', N'2024-04-24 20:02:32', N'0') +GO +INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES (2757, N'会员经验记录查询', N'member:experience-record:query', 3, 11, 2325, N'', N'', N'', N'', 0, N'1', N'1', N'1', N'1', N'2024-04-24 20:02:51', N'1', N'2024-04-24 20:02:51', N'0') +GO +SET IDENTITY_INSERT system_menu OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS system_notice +GO +CREATE TABLE system_notice +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + title nvarchar(50) NOT NULL, + content nvarchar(max) NOT NULL, + type tinyint NOT NULL, + status tinyint DEFAULT 0 NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'公告ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'公告标题', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'title' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'公告内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'公告类型(1通知 2公告)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'公告状态(0正常 1关闭)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'通知公告表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notice' +GO + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_notice ON +GO +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'芋道的公众', N'

新版本内容133

', 1, 0, N'admin', N'2021-01-05 17:03:48', N'1', N'2022-05-04 21:00:20', N'0', 1) +GO +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, N'维护通知:2018-07-01 系统凌晨维护', N'

11112222

', 2, 1, N'admin', N'2021-01-05 17:03:48', N'1', N'2023-12-02 20:07:26', N'0', 1) +GO +INSERT INTO system_notice (id, title, content, type, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, N'我是测试标题', N'

哈哈哈哈123

', 1, 0, N'110', N'2022-02-22 01:01:25', N'110', N'2022-02-22 01:01:46', N'0', 121) +GO +SET IDENTITY_INSERT system_notice OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_message +GO +CREATE TABLE system_notify_message +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type tinyint NOT NULL, + template_id bigint NOT NULL, + template_code nvarchar(64) NOT NULL, + template_nickname nvarchar(63) NOT NULL, + template_content nvarchar(1024) NOT NULL, + template_type int NOT NULL, + template_params nvarchar(255) NOT NULL, + read_status varchar(1) NOT NULL, + read_time datetime2 DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户id', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'template_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'template_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版发送人名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'template_nickname' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'template_content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'template_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版参数', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'template_params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否已读', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'read_status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'阅读时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'read_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'站内信消息表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_message' +GO + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_notify_message ON +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 1, 2, 1, N'test', N'123', N'我是 1,我开始 2 了', 1, N'{"name":"1","what":"2"}', N'1', N'2023-02-10 00:47:04', N'1', N'2023-01-28 11:44:08', N'1', N'2023-02-10 00:47:04', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 1, 2, 1, N'test', N'123', N'我是 1,我开始 2 了', 1, N'{"name":"1","what":"2"}', N'1', N'2023-02-10 00:47:04', N'1', N'2023-01-28 11:45:04', N'1', N'2023-02-10 00:47:04', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 103, 2, 2, N'register', N'系统消息', N'你好,欢迎 哈哈 加入大家庭!', 2, N'{"name":"哈哈"}', N'0', NULL, N'1', N'2023-01-28 21:02:20', N'1', N'2023-01-28 21:02:20', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 1, 2, 1, N'test', N'123', N'我是 芋艿,我开始 写代码 了', 1, N'{"name":"芋艿","what":"写代码"}', N'1', N'2023-02-10 00:47:04', N'1', N'2023-01-28 22:21:42', N'1', N'2023-02-10 00:47:04', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 1, 2, 1, N'test', N'123', N'我是 芋艿,我开始 写代码 了', 1, N'{"name":"芋艿","what":"写代码"}', N'1', N'2023-01-29 10:52:06', N'1', N'2023-01-28 22:22:07', N'1', N'2023-01-29 10:52:06', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 1, 2, 1, N'test', N'123', N'我是 2,我开始 3 了', 1, N'{"name":"2","what":"3"}', N'1', N'2023-01-29 10:52:06', N'1', N'2023-01-28 23:45:21', N'1', N'2023-01-29 10:52:06', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 1, 2, 2, N'register', N'系统消息', N'你好,欢迎 123 加入大家庭!', 2, N'{"name":"123"}', N'1', N'2023-01-29 10:52:06', N'1', N'2023-01-28 23:50:21', N'1', N'2023-01-29 10:52:06', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 247, 1, 4, N'brokerage_withdraw_audit_approve', N'system', N'您在2023-09-28 08:35:46提现¥0.09元的申请已通过审核', 2, N'{"reason":null,"createTime":"2023-09-28 08:35:46","price":"0.09"}', N'0', NULL, N'1', N'2023-09-28 16:36:22', N'1', N'2023-09-28 16:36:22', N'0', 1) +GO +INSERT INTO system_notify_message (id, user_id, user_type, template_id, template_code, template_nickname, template_content, template_type, template_params, read_status, read_time, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 247, 1, 4, N'brokerage_withdraw_audit_approve', N'system', N'您在2023-09-30 20:59:40提现¥1.00元的申请已通过审核', 2, N'{"reason":null,"createTime":"2023-09-30 20:59:40","price":"1.00"}', N'0', NULL, N'1', N'2023-10-03 12:11:34', N'1', N'2023-10-03 12:11:34', N'0', 1) +GO +SET IDENTITY_INSERT system_notify_message OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS system_notify_template +GO +CREATE TABLE system_notify_template +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(63) NOT NULL, + code nvarchar(64) NOT NULL, + nickname nvarchar(255) NOT NULL, + content nvarchar(1024) NOT NULL, + type tinyint NOT NULL, + params nvarchar(255) DEFAULT NULL NULL, + status tinyint NOT NULL, + remark nvarchar(255) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主键', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送人名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模版内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数数组', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'站内信模板表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_notify_template' +GO + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_access_token +GO +CREATE TABLE system_oauth2_access_token +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type tinyint NOT NULL, + user_info nvarchar(512) NOT NULL, + access_token nvarchar(255) NOT NULL, + refresh_token nvarchar(32) NOT NULL, + client_id nvarchar(255) NOT NULL, + scopes nvarchar(255) DEFAULT NULL NULL, + expires_time datetime2 NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +CREATE INDEX idx_system_oauth2_access_token_01 ON system_oauth2_access_token (access_token) +GO +CREATE INDEX idx_system_oauth2_access_token_02 ON system_oauth2_access_token (refresh_token) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户信息', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'user_info' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'访问令牌', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'access_token' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'刷新令牌', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'refresh_token' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权范围', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'过期时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'OAuth2 访问令牌', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_access_token' +GO + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_approve +GO +CREATE TABLE system_oauth2_approve +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type tinyint NOT NULL, + client_id nvarchar(255) NOT NULL, + scope nvarchar(255) DEFAULT '' NOT NULL, + approved varchar(1) DEFAULT '0' NOT NULL, + expires_time datetime2 NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权范围', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'scope' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否接受', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'approved' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'过期时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'OAuth2 批准表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_approve' +GO + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_client +GO +CREATE TABLE system_oauth2_client +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + client_id nvarchar(255) NOT NULL, + secret nvarchar(255) NOT NULL, + name nvarchar(255) NOT NULL, + logo nvarchar(255) NOT NULL, + description nvarchar(255) DEFAULT NULL NULL, + status tinyint NOT NULL, + access_token_validity_seconds int NOT NULL, + refresh_token_validity_seconds int NOT NULL, + redirect_uris nvarchar(255) NOT NULL, + authorized_grant_types nvarchar(255) NOT NULL, + scopes nvarchar(255) DEFAULT NULL NULL, + auto_approve_scopes nvarchar(255) DEFAULT NULL NULL, + authorities nvarchar(255) DEFAULT NULL NULL, + resource_ids nvarchar(255) DEFAULT NULL NULL, + additional_information nvarchar(4000) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端密钥', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'secret' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'应用名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'应用图标', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'logo' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'应用描述', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'访问令牌的有效期', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'access_token_validity_seconds' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'刷新令牌的有效期', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'refresh_token_validity_seconds' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'可重定向的 URI 地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'redirect_uris' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'authorized_grant_types' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权范围', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'自动通过的授权范围', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'auto_approve_scopes' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'权限', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'authorities' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'资源', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'resource_ids' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'附加信息', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'additional_information' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'OAuth2 客户端表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_client' +GO + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_oauth2_client ON +GO +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (1, N'default', N'admin123', N'芋道源码', N'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', N'我是描述', 0, 1800, 2592000, N'["https://www.iocoder.cn","https://doc.iocoder.cn"]', N'["password","authorization_code","implicit","refresh_token"]', N'["user.read","user.write"]', N'[]', N'["user.read","user.write"]', N'[]', N'{}', N'1', N'2022-05-11 21:47:12', N'1', N'2024-02-22 16:31:52', N'0') +GO +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (40, N'test', N'test2', N'biubiu', N'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', N'啦啦啦啦', 0, 1800, 43200, N'["https://www.iocoder.cn"]', N'["password","authorization_code","implicit"]', N'["user_info","projects"]', N'["user_info"]', N'[]', N'[]', N'{}', N'1', N'2022-05-12 00:28:20', N'1', N'2023-12-02 21:01:01', N'0') +GO +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (41, N'win-sso-demo-by-code', N'test', N'基于授权码模式,如何实现 SSO 单点登录?', N'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, N'["http://127.0.0.1:18080"]', N'["authorization_code","refresh_token"]', N'["user.read","user.write"]', N'[]', N'[]', N'[]', NULL, N'1', N'2022-09-29 13:28:31', N'1', N'2022-09-29 13:28:31', N'0') +GO +INSERT INTO system_oauth2_client (id, client_id, secret, name, logo, description, status, access_token_validity_seconds, refresh_token_validity_seconds, redirect_uris, authorized_grant_types, scopes, auto_approve_scopes, authorities, resource_ids, additional_information, creator, create_time, updater, update_time, deleted) VALUES (42, N'win-sso-demo-by-password', N'test', N'基于密码模式,如何实现 SSO 单点登录?', N'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, N'["http://127.0.0.1:18080"]', N'["password","refresh_token"]', N'["user.read","user.write"]', N'[]', N'[]', N'[]', NULL, N'1', N'2022-10-04 17:40:16', N'1', N'2022-10-04 20:31:21', N'0') +GO +SET IDENTITY_INSERT system_oauth2_client OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_code +GO +CREATE TABLE system_oauth2_code +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type tinyint NOT NULL, + code nvarchar(32) NOT NULL, + client_id nvarchar(255) NOT NULL, + scopes nvarchar(255) DEFAULT '' NULL, + expires_time datetime2 NOT NULL, + redirect_uri nvarchar(255) DEFAULT NULL NULL, + state nvarchar(255) DEFAULT '' NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权范围', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'过期时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'可重定向的 URI 地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'redirect_uri' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'state' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'OAuth2 授权码表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_code' +GO + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS system_oauth2_refresh_token +GO +CREATE TABLE system_oauth2_refresh_token +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + refresh_token nvarchar(32) NOT NULL, + user_type tinyint NOT NULL, + client_id nvarchar(255) NOT NULL, + scopes nvarchar(255) DEFAULT NULL NULL, + expires_time datetime2 NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'刷新令牌', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'refresh_token' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'授权范围', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'过期时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'OAuth2 刷新令牌', + 'SCHEMA', N'dbo', + 'TABLE', N'system_oauth2_refresh_token' +GO + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS system_operate_log +GO +CREATE TABLE system_operate_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + trace_id nvarchar(64) DEFAULT '' NOT NULL, + user_id bigint NOT NULL, + user_type tinyint DEFAULT 0 NOT NULL, + type nvarchar(50) NOT NULL, + sub_type nvarchar(50) NOT NULL, + biz_id bigint NOT NULL, + action nvarchar(2000) DEFAULT '' NOT NULL, + extra nvarchar(2000) DEFAULT '' NOT NULL, + request_method nvarchar(16) DEFAULT '' NULL, + request_url nvarchar(255) DEFAULT '' NULL, + user_ip nvarchar(50) DEFAULT NULL NULL, + user_agent nvarchar(200) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'日志主键', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'链路追踪编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作模块类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'sub_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作数据模块编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'biz_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'action' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'拓展字段', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'extra' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求方法名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'request_method' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'请求地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户 IP', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'浏览器 UA', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'操作日志记录 V2 版本', + 'SCHEMA', N'dbo', + 'TABLE', N'system_operate_log' +GO + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS system_post +GO +CREATE TABLE system_post +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + code nvarchar(64) NOT NULL, + name nvarchar(50) NOT NULL, + sort int NOT NULL, + status tinyint NOT NULL, + remark nvarchar(500) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'岗位ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'岗位编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'岗位名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'显示顺序', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'岗位信息表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_post' +GO + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_post ON +GO +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'ceo', N'董事长', 1, 0, N'', N'admin', N'2021-01-06 17:03:48', N'1', N'2023-02-11 15:19:04', N'0', 1) +GO +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, N'se', N'项目经理', 2, 0, N'', N'admin', N'2021-01-05 17:03:48', N'1', N'2023-11-15 09:18:20', N'0', 1) +GO +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, N'user', N'普通员工', 4, 0, N'111', N'admin', N'2021-01-05 17:03:48', N'1', N'2023-12-02 10:04:37', N'0', 1) +GO +INSERT INTO system_post (id, code, name, sort, status, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, N'HR', N'人力资源', 5, 0, N'', N'1', N'2024-03-24 20:45:40', N'1', N'2024-03-24 20:45:40', N'0', 1) +GO +SET IDENTITY_INSERT system_post OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS system_role +GO +CREATE TABLE system_role +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(30) NOT NULL, + code nvarchar(100) NOT NULL, + sort int NOT NULL, + data_scope tinyint DEFAULT 1 NOT NULL, + data_scope_dept_ids nvarchar(500) DEFAULT '' NOT NULL, + status tinyint NOT NULL, + type tinyint NOT NULL, + remark nvarchar(500) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色权限字符串', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'显示顺序', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'data_scope' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据范围(指定部门数组)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'data_scope_dept_ids' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色信息表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role' +GO + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_role ON +GO +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'超级管理员', N'super_admin', 1, 1, N'', 0, 1, N'超级管理员', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-22 05:08:21', N'0', 1) +GO +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, N'普通角色', N'common', 2, 2, N'', 0, 1, N'普通角色', N'admin', N'2021-01-05 17:03:48', N'', N'2022-02-22 05:08:20', N'0', 1) +GO +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, N'CRM 管理员', N'crm_admin', 2, 1, N'', 0, 1, N'CRM 专属角色', N'1', N'2024-02-24 10:51:13', N'1', N'2024-02-24 02:51:32', N'0', 1) +GO +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (101, N'测试账号', N'test', 0, 1, N'[]', 0, 2, N'我想测试', N'', N'2021-01-06 13:49:35', N'1', N'2024-03-24 22:22:45', N'0', 1) +GO +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, N'租户管理员', N'tenant_admin', 0, 1, N'', 0, 1, N'系统自动生成', N'1', N'2022-02-22 00:56:14', N'1', N'2022-02-22 00:56:14', N'0', 121) +GO +INSERT INTO system_role (id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, N'租户管理员', N'tenant_admin', 0, 1, N'', 0, 1, N'系统自动生成', N'1', N'2022-03-07 21:37:58', N'1', N'2022-03-07 21:37:58', N'0', 122) +GO +SET IDENTITY_INSERT system_role OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS system_role_menu +GO +CREATE TABLE system_role_menu +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + role_id bigint NOT NULL, + menu_id bigint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'自增编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'菜单ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'menu_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色和菜单关联表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_role_menu' +GO + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_role_menu ON +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (263, 109, 1, N'1', N'2022-02-22 00:56:14', N'1', N'2022-02-22 00:56:14', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (434, 2, 1, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (454, 2, 1093, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (455, 2, 1094, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (460, 2, 1100, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (467, 2, 1107, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (476, 2, 1117, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (477, 2, 100, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (478, 2, 101, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (479, 2, 102, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (480, 2, 1126, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (481, 2, 103, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (483, 2, 104, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (485, 2, 105, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (488, 2, 107, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (490, 2, 108, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (492, 2, 109, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (498, 2, 1138, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (523, 2, 1224, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (524, 2, 1225, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (541, 2, 500, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (543, 2, 501, N'1', N'2022-02-22 13:09:12', N'1', N'2022-02-22 13:09:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (675, 2, 2, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (689, 2, 1077, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (690, 2, 1078, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (692, 2, 1083, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (693, 2, 1084, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (699, 2, 1090, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (703, 2, 106, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (704, 2, 110, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (705, 2, 111, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (706, 2, 112, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (707, 2, 113, N'1', N'2022-02-22 13:16:57', N'1', N'2022-02-22 13:16:57', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1296, 110, 1, N'110', N'2022-02-23 00:23:55', N'110', N'2022-02-23 00:23:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1578, 111, 1, N'1', N'2022-03-07 21:37:58', N'1', N'2022-03-07 21:37:58', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1604, 101, 1216, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1605, 101, 1217, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1606, 101, 1218, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1607, 101, 1219, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1608, 101, 1220, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1609, 101, 1221, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1610, 101, 5, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1611, 101, 1222, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1612, 101, 1118, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1613, 101, 1119, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1614, 101, 1120, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1615, 101, 1185, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1616, 101, 1186, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1617, 101, 1187, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1618, 101, 1188, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1619, 101, 1189, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1620, 101, 1190, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1621, 101, 1191, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1622, 101, 1192, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1623, 101, 1193, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1624, 101, 1194, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1625, 101, 1195, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1626, 101, 1196, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1627, 101, 1197, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1628, 101, 1198, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1629, 101, 1199, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1630, 101, 1200, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1631, 101, 1201, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1632, 101, 1202, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1633, 101, 1207, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1634, 101, 1208, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1635, 101, 1209, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1636, 101, 1210, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1637, 101, 1211, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1638, 101, 1212, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1639, 101, 1213, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1640, 101, 1215, N'1', N'2022-03-19 21:45:52', N'1', N'2022-03-19 21:45:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1641, 101, 2, N'1', N'2022-04-01 22:21:24', N'1', N'2022-04-01 22:21:24', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1642, 101, 1031, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1643, 101, 1032, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1644, 101, 1033, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1645, 101, 1034, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1646, 101, 1035, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1647, 101, 1050, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1648, 101, 1051, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1649, 101, 1052, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1650, 101, 1053, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1651, 101, 1054, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1652, 101, 1056, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1653, 101, 1057, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1654, 101, 1058, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1655, 101, 1059, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1656, 101, 1060, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1657, 101, 1066, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1658, 101, 1067, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1659, 101, 1070, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1664, 101, 1075, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1666, 101, 1077, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1667, 101, 1078, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1668, 101, 1082, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1669, 101, 1083, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1670, 101, 1084, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1671, 101, 1085, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1672, 101, 1086, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1673, 101, 1087, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1674, 101, 1088, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1675, 101, 1089, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1679, 101, 1237, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1680, 101, 1238, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1681, 101, 1239, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1682, 101, 1240, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1683, 101, 1241, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1684, 101, 1242, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1685, 101, 1243, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1687, 101, 106, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1688, 101, 110, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1689, 101, 111, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1690, 101, 112, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1691, 101, 113, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1692, 101, 114, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1693, 101, 115, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1694, 101, 116, N'1', N'2022-04-01 22:21:37', N'1', N'2022-04-01 22:21:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1729, 109, 100, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1730, 109, 101, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1731, 109, 1063, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1732, 109, 1064, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1733, 109, 1001, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1734, 109, 1065, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1735, 109, 1002, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1736, 109, 1003, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1737, 109, 1004, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1738, 109, 1005, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1739, 109, 1006, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1740, 109, 1007, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1741, 109, 1008, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1742, 109, 1009, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1743, 109, 1010, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1744, 109, 1011, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1745, 109, 1012, N'1', N'2022-09-21 22:08:51', N'1', N'2022-09-21 22:08:51', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1746, 111, 100, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1747, 111, 101, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1748, 111, 1063, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1749, 111, 1064, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1750, 111, 1001, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1751, 111, 1065, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1752, 111, 1002, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1753, 111, 1003, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1754, 111, 1004, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1755, 111, 1005, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1756, 111, 1006, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1757, 111, 1007, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1758, 111, 1008, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1759, 111, 1009, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1760, 111, 1010, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1761, 111, 1011, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1762, 111, 1012, N'1', N'2022-09-21 22:08:52', N'1', N'2022-09-21 22:08:52', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1763, 109, 100, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1764, 109, 101, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1765, 109, 1063, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1766, 109, 1064, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1767, 109, 1001, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1768, 109, 1065, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1769, 109, 1002, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1770, 109, 1003, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1771, 109, 1004, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1772, 109, 1005, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1773, 109, 1006, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1774, 109, 1007, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1775, 109, 1008, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1776, 109, 1009, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1777, 109, 1010, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1778, 109, 1011, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1779, 109, 1012, N'1', N'2022-09-21 22:08:53', N'1', N'2022-09-21 22:08:53', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1780, 111, 100, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1781, 111, 101, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1782, 111, 1063, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1783, 111, 1064, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1784, 111, 1001, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1785, 111, 1065, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1786, 111, 1002, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1787, 111, 1003, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1788, 111, 1004, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1789, 111, 1005, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1790, 111, 1006, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1791, 111, 1007, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1792, 111, 1008, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1793, 111, 1009, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1794, 111, 1010, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1795, 111, 1011, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1796, 111, 1012, N'1', N'2022-09-21 22:08:54', N'1', N'2022-09-21 22:08:54', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1797, 109, 100, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1798, 109, 101, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1799, 109, 1063, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1800, 109, 1064, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1801, 109, 1001, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1802, 109, 1065, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1803, 109, 1002, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1804, 109, 1003, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1805, 109, 1004, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1806, 109, 1005, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1807, 109, 1006, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1808, 109, 1007, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1809, 109, 1008, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1810, 109, 1009, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1811, 109, 1010, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1812, 109, 1011, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1813, 109, 1012, N'1', N'2022-09-21 22:08:55', N'1', N'2022-09-21 22:08:55', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1814, 111, 100, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1815, 111, 101, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1816, 111, 1063, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1817, 111, 1064, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1818, 111, 1001, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1819, 111, 1065, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1820, 111, 1002, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1821, 111, 1003, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1822, 111, 1004, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1823, 111, 1005, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1824, 111, 1006, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1825, 111, 1007, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1826, 111, 1008, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1827, 111, 1009, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1828, 111, 1010, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1829, 111, 1011, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1830, 111, 1012, N'1', N'2022-09-21 22:08:56', N'1', N'2022-09-21 22:08:56', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1831, 109, 103, N'1', N'2022-09-21 22:43:23', N'1', N'2022-09-21 22:43:23', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1832, 109, 1017, N'1', N'2022-09-21 22:43:23', N'1', N'2022-09-21 22:43:23', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1833, 109, 1018, N'1', N'2022-09-21 22:43:23', N'1', N'2022-09-21 22:43:23', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1834, 109, 1019, N'1', N'2022-09-21 22:43:23', N'1', N'2022-09-21 22:43:23', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1835, 109, 1020, N'1', N'2022-09-21 22:43:23', N'1', N'2022-09-21 22:43:23', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1836, 111, 103, N'1', N'2022-09-21 22:43:24', N'1', N'2022-09-21 22:43:24', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1837, 111, 1017, N'1', N'2022-09-21 22:43:24', N'1', N'2022-09-21 22:43:24', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1838, 111, 1018, N'1', N'2022-09-21 22:43:24', N'1', N'2022-09-21 22:43:24', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1839, 111, 1019, N'1', N'2022-09-21 22:43:24', N'1', N'2022-09-21 22:43:24', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1840, 111, 1020, N'1', N'2022-09-21 22:43:24', N'1', N'2022-09-21 22:43:24', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1841, 109, 1036, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1842, 109, 1037, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1843, 109, 1038, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1844, 109, 1039, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1845, 109, 107, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1846, 111, 1036, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1847, 111, 1037, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1848, 111, 1038, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1849, 111, 1039, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1850, 111, 107, N'1', N'2022-09-21 22:48:13', N'1', N'2022-09-21 22:48:13', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1991, 2, 1024, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1992, 2, 1025, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1993, 2, 1026, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1994, 2, 1027, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1995, 2, 1028, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1996, 2, 1029, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1997, 2, 1030, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1998, 2, 1031, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1999, 2, 1032, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2000, 2, 1033, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2001, 2, 1034, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2002, 2, 1035, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2003, 2, 1036, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2004, 2, 1037, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2005, 2, 1038, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2006, 2, 1039, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2007, 2, 1040, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2008, 2, 1042, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2009, 2, 1043, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2010, 2, 1045, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2011, 2, 1046, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2012, 2, 1048, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2013, 2, 1050, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2014, 2, 1051, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2015, 2, 1052, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2016, 2, 1053, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2017, 2, 1054, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2018, 2, 1056, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2019, 2, 1057, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2020, 2, 1058, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2021, 2, 2083, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2022, 2, 1059, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2023, 2, 1060, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2024, 2, 1063, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2025, 2, 1064, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2026, 2, 1065, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2027, 2, 1066, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2028, 2, 1067, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2029, 2, 1070, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2034, 2, 1075, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2036, 2, 1082, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2037, 2, 1085, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2038, 2, 1086, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2039, 2, 1087, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2040, 2, 1088, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2041, 2, 1089, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2042, 2, 1091, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2043, 2, 1092, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2044, 2, 1095, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2045, 2, 1096, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2046, 2, 1097, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2047, 2, 1098, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2048, 2, 1101, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2049, 2, 1102, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2050, 2, 1103, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2051, 2, 1104, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2052, 2, 1105, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2053, 2, 1106, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2054, 2, 1108, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2055, 2, 1109, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2061, 2, 1127, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2062, 2, 1128, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2063, 2, 1129, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2064, 2, 1130, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2066, 2, 1132, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2067, 2, 1133, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2068, 2, 1134, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2069, 2, 1135, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2070, 2, 1136, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2071, 2, 1137, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2072, 2, 114, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2073, 2, 1139, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2074, 2, 115, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2075, 2, 1140, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2076, 2, 116, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2077, 2, 1141, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2078, 2, 1142, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2079, 2, 1143, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2080, 2, 1150, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2081, 2, 1161, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2082, 2, 1162, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2083, 2, 1163, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2084, 2, 1164, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2085, 2, 1165, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2086, 2, 1166, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2087, 2, 1173, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2088, 2, 1174, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2089, 2, 1175, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2090, 2, 1176, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2091, 2, 1177, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2092, 2, 1178, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2099, 2, 1226, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2100, 2, 1227, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2101, 2, 1228, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2102, 2, 1229, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2103, 2, 1237, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2104, 2, 1238, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2105, 2, 1239, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2106, 2, 1240, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2107, 2, 1241, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2108, 2, 1242, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2109, 2, 1243, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2116, 2, 1254, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2117, 2, 1255, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2118, 2, 1256, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2119, 2, 1257, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2120, 2, 1258, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2121, 2, 1259, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2122, 2, 1260, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2123, 2, 1261, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2124, 2, 1263, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2125, 2, 1264, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2126, 2, 1265, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2127, 2, 1266, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2128, 2, 1267, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2129, 2, 1001, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2130, 2, 1002, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2131, 2, 1003, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2132, 2, 1004, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2133, 2, 1005, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2134, 2, 1006, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2135, 2, 1007, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2136, 2, 1008, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2137, 2, 1009, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2138, 2, 1010, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2139, 2, 1011, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2140, 2, 1012, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2141, 2, 1013, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2142, 2, 1014, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2143, 2, 1015, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2144, 2, 1016, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2145, 2, 1017, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2146, 2, 1018, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2147, 2, 1019, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2148, 2, 1020, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2149, 2, 1021, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2150, 2, 1022, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2151, 2, 1023, N'1', N'2023-01-25 08:42:52', N'1', N'2023-01-25 08:42:52', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2152, 2, 1281, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2153, 2, 1282, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2154, 2, 2000, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2155, 2, 2002, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2156, 2, 2003, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2157, 2, 2004, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2158, 2, 2005, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2159, 2, 2006, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2160, 2, 2008, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2161, 2, 2009, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2162, 2, 2010, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2163, 2, 2011, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2164, 2, 2012, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2170, 2, 2019, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2171, 2, 2020, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2172, 2, 2021, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2173, 2, 2022, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2174, 2, 2023, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2175, 2, 2025, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2177, 2, 2027, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2178, 2, 2028, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2179, 2, 2029, N'1', N'2023-01-25 08:42:58', N'1', N'2023-01-25 08:42:58', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2180, 2, 2014, N'1', N'2023-01-25 08:43:12', N'1', N'2023-01-25 08:43:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2181, 2, 2015, N'1', N'2023-01-25 08:43:12', N'1', N'2023-01-25 08:43:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2182, 2, 2016, N'1', N'2023-01-25 08:43:12', N'1', N'2023-01-25 08:43:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2183, 2, 2017, N'1', N'2023-01-25 08:43:12', N'1', N'2023-01-25 08:43:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2184, 2, 2018, N'1', N'2023-01-25 08:43:12', N'1', N'2023-01-25 08:43:12', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2188, 101, 1024, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2189, 101, 1, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2190, 101, 1025, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2191, 101, 1026, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2192, 101, 1027, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2193, 101, 1028, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2194, 101, 1029, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2195, 101, 1030, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2196, 101, 1036, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2197, 101, 1037, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2198, 101, 1038, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2199, 101, 1039, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2200, 101, 1040, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2201, 101, 1042, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2202, 101, 1043, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2203, 101, 1045, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2204, 101, 1046, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2205, 101, 1048, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2206, 101, 2083, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2207, 101, 1063, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2208, 101, 1064, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2209, 101, 1065, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2210, 101, 1093, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2211, 101, 1094, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2212, 101, 1095, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2213, 101, 1096, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2214, 101, 1097, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2215, 101, 1098, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2216, 101, 1100, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2217, 101, 1101, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2218, 101, 1102, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2219, 101, 1103, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2220, 101, 1104, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2221, 101, 1105, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2222, 101, 1106, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2223, 101, 2130, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2224, 101, 1107, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2225, 101, 2131, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2226, 101, 1108, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2227, 101, 2132, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2228, 101, 1109, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2229, 101, 2133, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2230, 101, 2134, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2232, 101, 2135, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2234, 101, 2136, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2236, 101, 2137, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2238, 101, 2138, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2240, 101, 2139, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2242, 101, 2140, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2243, 101, 2141, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2244, 101, 2142, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2245, 101, 2143, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2246, 101, 2144, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2247, 101, 2145, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2248, 101, 2146, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2249, 101, 2147, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2250, 101, 100, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2251, 101, 2148, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2252, 101, 101, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2253, 101, 2149, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2254, 101, 102, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2255, 101, 2150, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2256, 101, 103, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2257, 101, 2151, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2258, 101, 104, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2259, 101, 2152, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2260, 101, 105, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2261, 101, 107, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2262, 101, 108, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2263, 101, 109, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2264, 101, 1138, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2265, 101, 1139, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2266, 101, 1140, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2267, 101, 1141, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2268, 101, 1142, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2269, 101, 1143, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2270, 101, 1224, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2271, 101, 1225, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2272, 101, 1226, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2273, 101, 1227, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2274, 101, 1228, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2275, 101, 1229, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2282, 101, 1261, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2283, 101, 1263, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2284, 101, 1264, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2285, 101, 1265, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2286, 101, 1266, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2287, 101, 1267, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2288, 101, 1001, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2289, 101, 1002, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2290, 101, 1003, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2291, 101, 1004, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2292, 101, 1005, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2293, 101, 1006, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2294, 101, 1007, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2295, 101, 1008, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2296, 101, 1009, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2297, 101, 1010, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2298, 101, 1011, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2299, 101, 1012, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2300, 101, 500, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2301, 101, 1013, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2302, 101, 501, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2303, 101, 1014, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2304, 101, 1015, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2305, 101, 1016, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2306, 101, 1017, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2307, 101, 1018, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2308, 101, 1019, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2309, 101, 1020, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2310, 101, 1021, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2311, 101, 1022, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2312, 101, 1023, N'1', N'2023-02-09 23:49:46', N'1', N'2023-02-09 23:49:46', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2929, 109, 1224, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2930, 109, 1225, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2931, 109, 1226, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2932, 109, 1227, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2933, 109, 1228, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2934, 109, 1229, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2935, 109, 1138, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2936, 109, 1139, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2937, 109, 1140, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2938, 109, 1141, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2939, 109, 1142, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2940, 109, 1143, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2941, 111, 1224, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2942, 111, 1225, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2943, 111, 1226, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2944, 111, 1227, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2945, 111, 1228, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2946, 111, 1229, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2947, 111, 1138, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2948, 111, 1139, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2949, 111, 1140, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2950, 111, 1141, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2951, 111, 1142, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2952, 111, 1143, N'1', N'2023-12-02 23:19:40', N'1', N'2023-12-02 23:19:40', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2993, 109, 2, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2994, 109, 1031, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2995, 109, 1032, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2996, 109, 1033, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2997, 109, 1034, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2998, 109, 1035, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2999, 109, 1050, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3000, 109, 1051, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3001, 109, 1052, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3002, 109, 1053, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3003, 109, 1054, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3004, 109, 1056, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3005, 109, 1057, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3006, 109, 1058, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3007, 109, 1059, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3008, 109, 1060, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3009, 109, 1066, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3010, 109, 1067, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3011, 109, 1070, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3012, 109, 1075, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3013, 109, 1076, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3014, 109, 1077, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3015, 109, 1078, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3016, 109, 1082, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3017, 109, 1083, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3018, 109, 1084, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3019, 109, 1085, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3020, 109, 1086, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3021, 109, 1087, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3022, 109, 1088, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3023, 109, 1089, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3024, 109, 1090, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3025, 109, 1091, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3026, 109, 1092, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3027, 109, 106, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3028, 109, 110, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3029, 109, 111, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3030, 109, 112, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3031, 109, 113, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3032, 109, 114, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3033, 109, 115, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3034, 109, 116, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3035, 109, 2472, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3036, 109, 2478, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3037, 109, 2479, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3038, 109, 2480, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3039, 109, 2481, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3040, 109, 2482, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3041, 109, 2483, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3042, 109, 2484, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3043, 109, 2485, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3044, 109, 2486, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3045, 109, 2487, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3046, 109, 2488, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3047, 109, 2489, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3048, 109, 2490, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3049, 109, 2491, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3050, 109, 2492, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3051, 109, 2493, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3052, 109, 2494, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3053, 109, 2495, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3054, 109, 2497, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3055, 109, 1237, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3056, 109, 1238, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3057, 109, 1239, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3058, 109, 1240, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3059, 109, 1241, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3060, 109, 1242, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3061, 109, 1243, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3062, 109, 2525, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3063, 109, 1255, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3064, 109, 1256, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3065, 109, 1257, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3066, 109, 1258, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3067, 109, 1259, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3068, 109, 1260, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3069, 111, 2, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3070, 111, 1031, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3071, 111, 1032, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3072, 111, 1033, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3073, 111, 1034, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3074, 111, 1035, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3075, 111, 1050, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3076, 111, 1051, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3077, 111, 1052, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3078, 111, 1053, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3079, 111, 1054, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3080, 111, 1056, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3081, 111, 1057, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3082, 111, 1058, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3083, 111, 1059, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3084, 111, 1060, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3085, 111, 1066, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3086, 111, 1067, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3087, 111, 1070, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3088, 111, 1075, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3089, 111, 1076, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3090, 111, 1077, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3091, 111, 1078, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3092, 111, 1082, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3093, 111, 1083, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3094, 111, 1084, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3095, 111, 1085, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3096, 111, 1086, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3097, 111, 1087, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3098, 111, 1088, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3099, 111, 1089, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3100, 111, 1090, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3101, 111, 1091, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3102, 111, 1092, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3103, 111, 106, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3104, 111, 110, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3105, 111, 111, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3106, 111, 112, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3107, 111, 113, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3108, 111, 114, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3109, 111, 115, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3110, 111, 116, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3111, 111, 2472, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3112, 111, 2478, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3113, 111, 2479, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3114, 111, 2480, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3115, 111, 2481, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3116, 111, 2482, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3117, 111, 2483, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3118, 111, 2484, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3119, 111, 2485, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3120, 111, 2486, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3121, 111, 2487, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3122, 111, 2488, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3123, 111, 2489, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3124, 111, 2490, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3125, 111, 2491, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3126, 111, 2492, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3127, 111, 2493, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3128, 111, 2494, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3129, 111, 2495, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3130, 111, 2497, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3131, 111, 1237, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3132, 111, 1238, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3133, 111, 1239, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3134, 111, 1240, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3135, 111, 1241, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3136, 111, 1242, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3137, 111, 1243, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3138, 111, 2525, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3139, 111, 1255, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3140, 111, 1256, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3141, 111, 1257, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3142, 111, 1258, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3143, 111, 1259, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3144, 111, 1260, N'1', N'2023-12-02 23:41:02', N'1', N'2023-12-02 23:41:02', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3221, 109, 102, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3222, 109, 1013, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3223, 109, 1014, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3224, 109, 1015, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3225, 109, 1016, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3226, 111, 102, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3227, 111, 1013, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3228, 111, 1014, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3229, 111, 1015, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3230, 111, 1016, N'1', N'2023-12-30 11:42:36', N'1', N'2023-12-30 11:42:36', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4163, 109, 5, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4164, 109, 1118, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4165, 109, 1119, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4166, 109, 1120, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4167, 109, 2713, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4168, 109, 2714, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4169, 109, 2715, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4170, 109, 2716, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4171, 109, 2717, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4172, 109, 2718, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4173, 109, 2720, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4174, 109, 1185, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4175, 109, 2721, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4176, 109, 1186, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4177, 109, 2722, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4178, 109, 1187, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4179, 109, 2723, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4180, 109, 1188, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4181, 109, 2724, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4182, 109, 1189, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4183, 109, 2725, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4184, 109, 1190, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4185, 109, 2726, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4186, 109, 1191, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4187, 109, 2727, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4188, 109, 1192, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4189, 109, 2728, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4190, 109, 1193, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4191, 109, 2729, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4192, 109, 1194, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4193, 109, 2730, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4194, 109, 1195, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4195, 109, 2731, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4196, 109, 1196, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4197, 109, 2732, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4198, 109, 1197, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4199, 109, 2733, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4200, 109, 1198, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4201, 109, 2734, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4202, 109, 1199, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4203, 109, 2735, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4204, 109, 1200, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4205, 109, 1201, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4206, 109, 1202, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4207, 109, 1207, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4208, 109, 1208, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4209, 109, 1209, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4210, 109, 1210, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4211, 109, 1211, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4212, 109, 1212, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4213, 109, 1213, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4214, 109, 1215, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4215, 109, 1216, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4216, 109, 1217, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4217, 109, 1218, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4218, 109, 1219, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4219, 109, 1220, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4220, 109, 1221, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4221, 109, 1222, N'1', N'2024-03-30 17:53:17', N'1', N'2024-03-30 17:53:17', N'0', 121) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4222, 111, 5, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4223, 111, 1118, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4224, 111, 1119, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4225, 111, 1120, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4226, 111, 2713, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4227, 111, 2714, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4228, 111, 2715, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4229, 111, 2716, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4230, 111, 2717, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4231, 111, 2718, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4232, 111, 2720, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4233, 111, 1185, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4234, 111, 2721, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4235, 111, 1186, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4236, 111, 2722, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4237, 111, 1187, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4238, 111, 2723, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4239, 111, 1188, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4240, 111, 2724, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4241, 111, 1189, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4242, 111, 2725, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4243, 111, 1190, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4244, 111, 2726, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4245, 111, 1191, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4246, 111, 2727, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4247, 111, 1192, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4248, 111, 2728, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4249, 111, 1193, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4250, 111, 2729, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4251, 111, 1194, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4252, 111, 2730, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4253, 111, 1195, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4254, 111, 2731, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4255, 111, 1196, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4256, 111, 2732, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4257, 111, 1197, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4258, 111, 2733, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4259, 111, 1198, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4260, 111, 2734, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4261, 111, 1199, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4262, 111, 2735, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4263, 111, 1200, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4264, 111, 1201, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4265, 111, 1202, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4266, 111, 1207, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4267, 111, 1208, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4268, 111, 1209, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4269, 111, 1210, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4270, 111, 1211, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4271, 111, 1212, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4272, 111, 1213, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4273, 111, 1215, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4274, 111, 1216, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4275, 111, 1217, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4276, 111, 1218, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4277, 111, 1219, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4278, 111, 1220, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4279, 111, 1221, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4280, 111, 1222, N'1', N'2024-03-30 17:53:18', N'1', N'2024-03-30 17:53:18', N'0', 122) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5777, 101, 2739, N'1', N'2024-04-30 09:38:37', N'1', N'2024-04-30 09:38:37', N'0', 1) +GO +INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5778, 101, 2740, N'1', N'2024-04-30 09:38:37', N'1', N'2024-04-30 09:38:37', N'0', 1) +GO +SET IDENTITY_INSERT system_role_menu OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_channel +GO +CREATE TABLE system_sms_channel +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + signature nvarchar(12) NOT NULL, + code nvarchar(63) NOT NULL, + status tinyint NOT NULL, + remark nvarchar(255) DEFAULT NULL NULL, + api_key nvarchar(128) NOT NULL, + api_secret nvarchar(128) DEFAULT NULL NULL, + callback_url nvarchar(255) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信签名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'signature' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'渠道编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'开启状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 的账号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'api_key' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 的秘钥', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'api_secret' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信发送回调 URL', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'callback_url' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信渠道', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_channel' +GO + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_sms_channel ON +GO +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (2, N'Ballcat', N'ALIYUN', 0, N'你要改哦,只有我可以用!!!!', N'LTAI5tCnKso2uG3kJ5gRav88', N'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, N'', N'2021-03-31 11:53:10', N'1', N'2023-12-02 22:10:17', N'0') +GO +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (4, N'测试渠道', N'DEBUG_DING_TALK', 0, N'123', N'696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', N'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, N'1', N'2021-04-13 00:23:14', N'1', N'2022-03-27 20:29:49', N'0') +GO +INSERT INTO system_sms_channel (id, signature, code, status, remark, api_key, api_secret, callback_url, creator, create_time, updater, update_time, deleted) VALUES (6, N'测试演示', N'DEBUG_DING_TALK', 0, N'仅测试', N'696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', N'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, N'1', N'2022-04-10 23:07:59', N'1', N'2023-12-02 22:10:08', N'0') +GO +SET IDENTITY_INSERT system_sms_channel OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_code +GO +CREATE TABLE system_sms_code +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + mobile nvarchar(11) NOT NULL, + code nvarchar(6) NOT NULL, + create_ip nvarchar(15) NOT NULL, + scene tinyint NOT NULL, + today_index tinyint NOT NULL, + used tinyint NOT NULL, + used_time datetime2 DEFAULT NULL NULL, + used_ip nvarchar(255) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +CREATE INDEX idx_system_sms_code_01 ON system_sms_code (mobile) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'手机号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'验证码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建 IP', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'create_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送场景', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'scene' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'今日发送的第几条', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'today_index' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否使用', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'used' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'使用时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'used_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'使用 IP', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'used_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'手机验证码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_code' +GO + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_log +GO +CREATE TABLE system_sms_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + channel_id bigint NOT NULL, + channel_code nvarchar(63) NOT NULL, + template_id bigint NOT NULL, + template_code nvarchar(63) NOT NULL, + template_type tinyint NOT NULL, + template_content nvarchar(255) NOT NULL, + template_params nvarchar(255) NOT NULL, + api_template_id nvarchar(63) NOT NULL, + mobile nvarchar(11) NOT NULL, + user_id bigint DEFAULT NULL NULL, + user_type tinyint DEFAULT NULL NULL, + send_status tinyint DEFAULT 0 NOT NULL, + send_time datetime2 DEFAULT NULL NULL, + api_send_code nvarchar(63) DEFAULT NULL NULL, + api_send_msg nvarchar(255) DEFAULT NULL NULL, + api_request_id nvarchar(255) DEFAULT NULL NULL, + api_serial_no nvarchar(255) DEFAULT NULL NULL, + receive_status tinyint DEFAULT 0 NOT NULL, + receive_time datetime2 DEFAULT NULL NULL, + api_receive_code nvarchar(63) DEFAULT NULL NULL, + api_receive_msg nvarchar(255) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信渠道编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信渠道编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'template_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'template_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'template_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'template_content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信参数', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'template_params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 的模板编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_template_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'手机号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'send_status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'发送时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'send_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 发送结果的编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_send_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 发送失败的提示', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_send_msg' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 发送返回的唯一请求 ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_request_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 发送返回的序号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_serial_no' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'接收状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'receive_status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'接收时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'receive_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'API 接收结果的编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_receive_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'API 接收结果的说明', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'api_receive_msg' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信日志', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_log' +GO + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS system_sms_template +GO +CREATE TABLE system_sms_template +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + type tinyint NOT NULL, + status tinyint NOT NULL, + code nvarchar(63) NOT NULL, + name nvarchar(63) NOT NULL, + content nvarchar(255) NOT NULL, + params nvarchar(255) NOT NULL, + remark nvarchar(255) DEFAULT NULL NULL, + api_template_id nvarchar(63) NOT NULL, + channel_id bigint NOT NULL, + channel_code nvarchar(63) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'开启状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板名称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'模板内容', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'参数数组', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'params' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信 API 的模板编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'api_template_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信渠道编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信渠道编码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'短信模板', + 'SCHEMA', N'dbo', + 'TABLE', N'system_sms_template' +GO + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_sms_template ON +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (2, 1, 0, N'test_01', N'测试验证码短信', N'正在进行登录操作{operation},您的验证码是{code}', N'["operation","code"]', N'测试备注', N'4383920', 6, N'DEBUG_DING_TALK', N'', N'2021-03-31 10:49:38', N'1', N'2023-12-02 22:32:47', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (3, 1, 0, N'test_02', N'公告通知', N'您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', N'["code"]', NULL, N'SMS_207945135', 2, N'ALIYUN', N'', N'2021-03-31 11:56:30', N'1', N'2021-04-10 01:22:02', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (6, 3, 0, N'test-01', N'测试模板', N'哈哈哈 {name}', N'["name"]', N'f哈哈哈', N'4383920', 6, N'DEBUG_DING_TALK', N'1', N'2021-04-10 01:07:21', N'1', N'2022-12-10 21:26:09', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (7, 3, 0, N'test-04', N'测试下', N'老鸡{name},牛逼{code}', N'["name","code"]', N'哈哈哈哈', N'suibian', 4, N'DEBUG_DING_TALK', N'1', N'2021-04-13 00:29:53', N'1', N'2023-12-02 22:35:34', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (8, 1, 0, N'user-sms-login', N'前台用户短信登录', N'您的验证码是{code}', N'["code"]', NULL, N'4372216', 6, N'DEBUG_DING_TALK', N'1', N'2021-10-11 08:10:00', N'1', N'2022-12-10 21:25:59', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (9, 2, 0, N'bpm_task_assigned', N'【工作流】任务被分配', N'您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', N'["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, N'suibian', 4, N'DEBUG_DING_TALK', N'1', N'2022-01-21 22:31:19', N'1', N'2022-01-22 00:03:36', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (10, 2, 0, N'bpm_process_instance_reject', N'【工作流】流程被不通过', N'您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', N'["processInstanceName","reason","detailUrl"]', NULL, N'suibian', 4, N'DEBUG_DING_TALK', N'1', N'2022-01-22 00:03:31', N'1', N'2022-05-01 12:33:14', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (11, 2, 0, N'bpm_process_instance_approve', N'【工作流】流程被通过', N'您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', N'["processInstanceName","detailUrl"]', NULL, N'suibian', 4, N'DEBUG_DING_TALK', N'1', N'2022-01-22 00:04:31', N'1', N'2022-03-27 20:32:21', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (12, 2, 0, N'demo', N'演示模板', N'我就是测试一下下', N'[]', NULL, N'biubiubiu', 6, N'DEBUG_DING_TALK', N'1', N'2022-04-10 23:22:49', N'1', N'2023-03-24 23:45:07', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (14, 1, 0, N'user-update-mobile', N'会员用户 - 修改手机', N'您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', N'["code"]', N'', N'null', 4, N'DEBUG_DING_TALK', N'1', N'2023-08-19 18:58:01', N'1', N'2023-08-19 11:34:04', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (15, 1, 0, N'user-update-password', N'会员用户 - 修改密码', N'您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', N'["code"]', N'', N'null', 4, N'DEBUG_DING_TALK', N'1', N'2023-08-19 18:58:01', N'1', N'2023-08-19 11:34:18', N'0') +GO +INSERT INTO system_sms_template (id, type, status, code, name, content, params, remark, api_template_id, channel_id, channel_code, creator, create_time, updater, update_time, deleted) VALUES (16, 1, 0, N'user-reset-password', N'会员用户 - 重置密码', N'您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', N'["code"]', N'', N'null', 4, N'DEBUG_DING_TALK', N'1', N'2023-08-19 18:58:01', N'1', N'2023-12-02 22:35:27', N'0') +GO +SET IDENTITY_INSERT system_sms_template OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_social_client +-- ---------------------------- +DROP TABLE IF EXISTS system_social_client +GO +CREATE TABLE system_social_client +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(255) NOT NULL, + social_type tinyint NOT NULL, + user_type tinyint NOT NULL, + client_id nvarchar(255) NOT NULL, + client_secret nvarchar(255) NOT NULL, + agent_id nvarchar(255) DEFAULT NULL NULL, + status tinyint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'应用名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交平台的类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'social_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端密钥', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'client_secret' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'代理编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'agent_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'状态', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交客户端表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_client' +GO + +-- ---------------------------- +-- Records of system_social_client +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_social_client ON +GO +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'钉钉', 20, 2, N'dingvrnreaje3yqvzhxg', N'i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI', NULL, 0, N'', N'2023-10-18 11:21:18', N'1', N'2023-12-20 21:28:26', N'1', 1) +GO +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, N'钉钉(王土豆)', 20, 2, N'dingtsu9hpepjkbmthhw', N'FP_bnSq_HAHKCSncmJjw5hxhnzs6vaVDSZZn3egj6rdqTQ_hu5tQVJyLMpgCakdP', NULL, 0, N'', N'2023-10-18 11:21:18', N'', N'2023-12-20 21:28:26', N'1', 121) +GO +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, N'微信公众号', 31, 1, N'wx5b23ba7a5589ecbb', N'2a7b3b20c537e52e74afd395eb85f61f', NULL, 0, N'', N'2023-10-18 16:07:46', N'1', N'2023-12-20 21:28:23', N'1', 1) +GO +INSERT INTO system_social_client (id, name, social_type, user_type, client_id, client_secret, agent_id, status, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (43, N'微信小程序', 34, 1, N'wx63c280fe3248a3e7', N'6f270509224a7ae1296bbf1c8cb97aed', NULL, 0, N'', N'2023-10-19 13:37:41', N'1', N'2023-12-20 21:28:25', N'1', 1) +GO +SET IDENTITY_INSERT system_social_client OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user +GO +CREATE TABLE system_social_user +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + type tinyint NOT NULL, + openid nvarchar(32) NOT NULL, + token nvarchar(256) DEFAULT NULL NULL, + raw_token_info nvarchar(1024) NOT NULL, + nickname nvarchar(32) NOT NULL, + avatar nvarchar(255) DEFAULT NULL NULL, + raw_user_info nvarchar(1024) NOT NULL, + code nvarchar(256) NOT NULL, + state nvarchar(256) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主键(自增策略)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交平台的类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交 openid', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'openid' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交 token', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'token' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'原始 Token 数据,一般是 JSON 格式', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'raw_token_info' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户昵称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户头像', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'原始用户数据,一般是 JSON 格式', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'raw_user_info' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'最后一次的认证 code', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'最后一次的认证 state', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'state' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交用户表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user' +GO + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS system_social_user_bind +GO +CREATE TABLE system_social_user_bind +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + user_type tinyint NOT NULL, + social_type tinyint NOT NULL, + social_user_id bigint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'主键(自增策略)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交平台的类型', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'social_type' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交用户的编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'social_user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'社交绑定表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_social_user_bind' +GO + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant +GO +CREATE TABLE system_tenant +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(30) NOT NULL, + contact_user_id bigint DEFAULT NULL NULL, + contact_name nvarchar(30) NOT NULL, + contact_mobile nvarchar(500) DEFAULT NULL NULL, + status tinyint DEFAULT 0 NOT NULL, + website nvarchar(256) DEFAULT '' NULL, + package_id bigint NOT NULL, + expire_time datetime2 NOT NULL, + account_count int NOT NULL, + creator nvarchar(64) DEFAULT '' NOT NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'联系人的用户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'contact_user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'联系人', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'contact_name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'联系手机', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'contact_mobile' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'绑定域名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'website' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户套餐编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'package_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'过期时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'expire_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'账号数量', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'account_count' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant' +GO + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_tenant ON +GO +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (1, N'芋道源码', NULL, N'芋艿', N'17321315478', 0, N'www.iocoder.cn', 0, N'2099-02-19 17:14:16', 9999, N'1', N'2021-01-05 17:03:47', N'1', N'2023-11-06 11:41:41', N'0') +GO +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (121, N'小租户', 110, N'小王2', N'15601691300', 0, N'zsxq.iocoder.cn', 111, N'2024-03-11 00:00:00', 20, N'1', N'2022-02-22 00:56:14', N'1', N'2023-11-06 11:41:47', N'0') +GO +INSERT INTO system_tenant (id, name, contact_user_id, contact_name, contact_mobile, status, website, package_id, expire_time, account_count, creator, create_time, updater, update_time, deleted) VALUES (122, N'测试租户', 113, N'芋道', N'15601691300', 0, N'test.iocoder.cn', 111, N'2022-04-30 00:00:00', 50, N'1', N'2022-03-07 21:37:58', N'1', N'2023-11-06 11:41:53', N'0') +GO +SET IDENTITY_INSERT system_tenant OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS system_tenant_package +GO +CREATE TABLE system_tenant_package +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(30) NOT NULL, + status tinyint DEFAULT 0 NOT NULL, + remark nvarchar(256) DEFAULT '' NULL, + menu_ids nvarchar(4000) NOT NULL, + creator nvarchar(64) DEFAULT '' NOT NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'套餐编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'套餐名', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'关联的菜单编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'menu_ids' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户套餐表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_tenant_package' +GO + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_tenant_package ON +GO +INSERT INTO system_tenant_package (id, name, status, remark, menu_ids, creator, create_time, updater, update_time, deleted) VALUES (111, N'普通套餐', 0, N'小功能', N'[1,2,5,1031,1032,1033,1034,1035,1036,1037,1038,1039,1050,1051,1052,1053,1054,1056,1057,1058,1059,1060,1063,1064,1065,1066,1067,1070,1075,1076,1077,1078,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1118,1119,1120,100,101,102,103,106,107,110,111,112,113,1138,114,1139,115,1140,116,1141,1142,1143,2713,2714,2715,2716,2717,2718,2720,1185,2721,1186,2722,1187,2723,1188,2724,1189,2725,1190,2726,1191,2727,2472,1192,2728,1193,2729,1194,2730,1195,2731,1196,2732,1197,2733,2478,1198,2734,2479,1199,2735,2480,1200,2481,1201,2482,1202,2483,2484,2485,2486,2487,1207,2488,1208,2489,1209,2490,1210,2491,1211,2492,1212,2493,1213,2494,2495,1215,1216,2497,1217,1218,1219,1220,1221,1222,1224,1225,1226,1227,1228,1229,1237,1238,1239,1240,1241,1242,1243,2525,1255,1256,1001,1257,1002,1258,1003,1259,1004,1260,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020]', N'1', N'2022-02-22 00:54:00', N'1', N'2024-03-30 17:53:17', N'0') +GO +SET IDENTITY_INSERT system_tenant_package OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS system_user_post +GO +CREATE TABLE system_user_post +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint DEFAULT 0 NOT NULL, + post_id bigint DEFAULT 0 NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'id', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'岗位ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'post_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户岗位表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_post' +GO + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_user_post ON +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, 1, 1, N'admin', N'2022-05-02 07:25:24', N'admin', N'2022-05-02 07:25:24', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, 100, 1, N'admin', N'2022-05-02 07:25:24', N'admin', N'2022-05-02 07:25:24', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, 104, 1, N'1', N'2022-05-16 19:36:28', N'1', N'2022-05-16 19:36:28', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (116, 117, 2, N'1', N'2022-07-09 17:40:26', N'1', N'2022-07-09 17:40:26', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, 118, 1, N'1', N'2022-07-09 17:44:44', N'1', N'2022-07-09 17:44:44', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (119, 114, 5, N'1', N'2024-03-24 20:45:51', N'1', N'2024-03-24 20:45:51', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (123, 115, 1, N'1', N'2024-04-04 09:37:14', N'1', N'2024-04-04 09:37:14', N'0', 1) +GO +INSERT INTO system_user_post (id, user_id, post_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (124, 115, 2, N'1', N'2024-04-04 09:37:14', N'1', N'2024-04-04 09:37:14', N'0', 1) +GO +SET IDENTITY_INSERT system_user_post OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS system_user_role +GO +CREATE TABLE system_user_role +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + user_id bigint NOT NULL, + role_id bigint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'自增编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'角色ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户和角色关联表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_user_role' +GO + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_user_role ON +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, 1, 1, N'', N'2022-01-11 13:19:45', N'', N'2022-05-12 12:35:17', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, 2, N'', N'2022-01-11 13:19:45', N'', N'2022-05-12 12:35:13', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, 100, 101, N'', N'2022-01-11 13:19:45', N'', N'2022-05-12 12:35:13', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, 100, 1, N'', N'2022-01-11 13:19:45', N'', N'2022-05-12 12:35:12', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 100, 2, N'', N'2022-01-11 13:19:45', N'', N'2022-05-12 12:35:11', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 103, 1, N'1', N'2022-01-11 13:19:45', N'1', N'2022-01-11 13:19:45', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (14, 110, 109, N'1', N'2022-02-22 00:56:14', N'1', N'2022-02-22 00:56:14', N'0', 121) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (15, 111, 110, N'110', N'2022-02-23 13:14:38', N'110', N'2022-02-23 13:14:38', N'0', 121) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (16, 113, 111, N'1', N'2022-03-07 21:37:58', N'1', N'2022-03-07 21:37:58', N'0', 122) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (18, 1, 2, N'1', N'2022-05-12 20:39:29', N'1', N'2022-05-12 20:39:29', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (20, 104, 101, N'1', N'2022-05-28 15:43:57', N'1', N'2022-05-28 15:43:57', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (22, 115, 2, N'1', N'2022-07-21 22:08:30', N'1', N'2022-07-21 22:08:30', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (35, 112, 1, N'1', N'2024-03-15 20:00:24', N'1', N'2024-03-15 20:00:24', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (36, 118, 1, N'1', N'2024-03-17 09:12:08', N'1', N'2024-03-17 09:12:08', N'0', 1) +GO +INSERT INTO system_user_role (id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (38, 114, 101, N'1', N'2024-03-24 22:23:03', N'1', N'2024-03-24 22:23:03', N'0', 1) +GO +SET IDENTITY_INSERT system_user_role OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS system_users +GO +CREATE TABLE system_users +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + username nvarchar(30) NOT NULL, + password nvarchar(100) DEFAULT '' NOT NULL, + nickname nvarchar(30) NOT NULL, + remark nvarchar(500) DEFAULT NULL NULL, + dept_id bigint DEFAULT NULL NULL, + post_ids nvarchar(255) DEFAULT NULL NULL, + email nvarchar(50) DEFAULT '' NULL, + mobile nvarchar(11) DEFAULT '' NULL, + sex tinyint DEFAULT 0 NULL, + avatar nvarchar(512) DEFAULT '' NULL, + status tinyint DEFAULT 0 NOT NULL, + login_ip nvarchar(50) DEFAULT '' NULL, + login_date datetime2 DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户账号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'密码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户昵称', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'部门ID', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'dept_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'岗位编号数组', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'post_ids' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户邮箱', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'email' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'手机号码', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户性别', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'头像地址', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'帐号状态(0正常 1停用)', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'最后登录IP', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'login_ip' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'最后登录时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'login_date' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'用户信息表', + 'SCHEMA', N'dbo', + 'TABLE', N'system_users' +GO + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT system_users ON +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'admin', N'$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', N'芋道源码', N'管理员', 103, N'[1]', N'aoteman@126.com', N'18818260277', 2, N'http://test.win.iocoder.cn/96c787a2ce88bf6d0ce3cd8b6cf5314e80e7703cd41bf4af8cd2e2909dbd6b6d.png', 0, N'0:0:0:0:0:0:0:1', N'2024-04-29 21:50:32', N'admin', N'2021-01-05 17:03:47', NULL, N'2024-04-29 21:50:32', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (100, N'win', N'$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', N'芋道', N'不要吓我', 104, N'[1]', N'win@iocoder.cn', N'15601691300', 1, N'', 1, N'127.0.0.1', N'2022-07-09 23:03:33', N'', N'2021-01-07 09:07:17', NULL, N'2022-07-09 23:03:33', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (103, N'yuanma', N'$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', N'源码', NULL, 106, NULL, N'yuanma@iocoder.cn', N'15601701300', 0, N'', 0, N'0:0:0:0:0:0:0:1', N'2024-03-18 21:09:04', N'', N'2021-01-13 23:50:35', NULL, N'2024-03-18 21:09:04', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (104, N'test', N'$2a$04$KhExCYl7lx6eWWZYKsibKOZ8IBJRyuNuCcEOLQ11RYhJKgHmlSwK.', N'测试号', NULL, 107, N'[1,2]', N'111@qq.com', N'15601691200', 1, N'', 0, N'0:0:0:0:0:0:0:1', N'2024-03-26 07:11:35', N'', N'2021-01-21 02:13:53', NULL, N'2024-03-26 07:11:35', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (107, N'admin107', N'$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', N'芋艿', NULL, NULL, NULL, N'', N'15601691300', 0, N'', 0, N'', NULL, N'1', N'2022-02-20 22:59:33', N'1', N'2022-02-27 08:26:51', N'0', 118) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (108, N'admin108', N'$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', N'芋艿', NULL, NULL, NULL, N'', N'15601691300', 0, N'', 0, N'', NULL, N'1', N'2022-02-20 23:00:50', N'1', N'2022-02-27 08:26:53', N'0', 119) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (109, N'admin109', N'$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', N'芋艿', NULL, NULL, NULL, N'', N'15601691300', 0, N'', 0, N'', NULL, N'1', N'2022-02-20 23:11:50', N'1', N'2022-02-27 08:26:56', N'0', 120) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (110, N'admin110', N'$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', N'小王', NULL, NULL, NULL, N'', N'15601691300', 0, N'', 0, N'127.0.0.1', N'2022-09-25 22:47:33', N'1', N'2022-02-22 00:56:14', NULL, N'2022-09-25 22:47:33', N'0', 121) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (111, N'test', N'$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', N'测试用户', NULL, NULL, N'[]', N'', N'', 0, N'', 0, N'0:0:0:0:0:0:0:1', N'2023-12-30 11:42:17', N'110', N'2022-02-23 13:14:33', NULL, N'2023-12-30 11:42:17', N'0', 121) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (112, N'newobject', N'$2a$04$dB0z8Q819fJWz0hbaLe6B.VfHCjYgWx6LFfET5lyz3JwcqlyCkQ4C', N'新对象', NULL, 100, N'[]', N'', N'15601691235', 1, N'', 0, N'0:0:0:0:0:0:0:1', N'2024-03-16 23:11:38', N'1', N'2022-02-23 19:08:03', NULL, N'2024-03-16 23:11:38', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (113, N'aoteman', N'$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', N'芋道', NULL, NULL, NULL, N'', N'15601691300', 0, N'', 0, N'127.0.0.1', N'2022-03-19 18:38:51', N'1', N'2022-03-07 21:37:58', NULL, N'2022-03-19 18:38:51', N'0', 122) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (114, N'hrmgr', N'$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', N'hr 小姐姐', NULL, NULL, N'[5]', N'', N'15601691236', 1, N'', 0, N'0:0:0:0:0:0:0:1', N'2024-03-24 22:21:05', N'1', N'2022-03-19 21:50:58', NULL, N'2024-03-24 22:21:05', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (115, N'aotemane', N'$2a$04$GcyP0Vyzb2F2Yni5PuIK9ueGxM0tkZGMtDwVRwrNbtMvorzbpNsV2', N'阿呆', N'11222', 102, N'[1,2]', N'7648@qq.com', N'15601691229', 2, N'', 0, N'', NULL, N'1', N'2022-04-30 02:55:43', N'1', N'2024-04-04 09:37:14', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (117, N'admin123', N'$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', N'测试号', N'1111', 100, N'[2]', N'', N'15601691234', 1, N'', 0, N'', NULL, N'1', N'2022-07-09 17:40:26', N'1', N'2022-07-09 17:40:26', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (118, N'goudan', N'$2a$04$OB1SuphCdiLVRpiYRKeqH.8NYS7UIp5vmIv1W7U4w6toiFeOAATVK', N'狗蛋', NULL, 103, N'[1]', N'', N'15601691239', 1, N'', 0, N'0:0:0:0:0:0:0:1', N'2024-03-17 09:10:27', N'1', N'2022-07-09 17:44:43', N'1', N'2024-04-04 09:48:05', N'0', 1) +GO +INSERT INTO system_users (id, username, password, nickname, remark, dept_id, post_ids, email, mobile, sex, avatar, status, login_ip, login_date, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (131, N'hh', N'$2a$04$jyH9h6.gaw8mpOjPfHIpx.8as2Rzfcmdlj5rlJFwgCw4rsv/MTb2K', N'呵呵', NULL, 100, N'[]', N'777@qq.com', N'15601882312', 1, N'', 0, N'', NULL, N'1', N'2024-04-27 08:45:56', N'1', N'2024-04-27 08:45:56', N'0', 1) +GO +SET IDENTITY_INSERT system_users OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo01_contact +-- ---------------------------- +DROP TABLE IF EXISTS win_demo01_contact +GO +CREATE TABLE win_demo01_contact +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(100) DEFAULT '' NOT NULL, + sex tinyint NOT NULL, + birthday datetime2 NOT NULL, + description nvarchar(255) NOT NULL, + avatar nvarchar(512) DEFAULT NULL NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'名字', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'性别', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'出生年', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'birthday' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'简介', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'头像', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'示例联系人表', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo01_contact' +GO + +-- ---------------------------- +-- Records of win_demo01_contact +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT win_demo01_contact ON +GO +INSERT INTO win_demo01_contact (id, name, sex, birthday, description, avatar, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'土豆', 2, N'2023-11-07 00:00:00', N'

天蚕土豆!呀

', N'http://127.0.0.1:48080/admin-api/infra/file/4/get/46f8fa1a37db3f3960d8910ff2fe3962ab3b2db87cf2f8ccb4dc8145b8bdf237.jpeg', N'1', N'2023-11-15 23:34:30', N'1', N'2023-11-15 23:47:39', N'0', 1) +GO +SET IDENTITY_INSERT win_demo01_contact OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo02_category +-- ---------------------------- +DROP TABLE IF EXISTS win_demo02_category +GO +CREATE TABLE win_demo02_category +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(100) DEFAULT '' NOT NULL, + parent_id bigint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'名字', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'父级编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'示例分类表', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo02_category' +GO + +-- ---------------------------- +-- Records of win_demo02_category +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT win_demo02_category ON +GO +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (1, N'土豆', 0, N'1', N'2023-11-15 23:34:30', N'1', N'2023-11-16 20:24:23', N'0', 1) +GO +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, N'番茄', 0, N'1', N'2023-11-16 20:24:00', N'1', N'2023-11-16 20:24:15', N'0', 1) +GO +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, N'怪怪', 0, N'1', N'2023-11-16 20:24:32', N'1', N'2023-11-16 20:24:32', N'0', 1) +GO +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (4, N'小番茄', 2, N'1', N'2023-11-16 20:24:39', N'1', N'2023-11-16 20:24:39', N'0', 1) +GO +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, N'大番茄', 2, N'1', N'2023-11-16 20:24:46', N'1', N'2023-11-16 20:24:46', N'0', 1) +GO +INSERT INTO win_demo02_category (id, name, parent_id, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, N'11', 3, N'1', N'2023-11-24 19:29:34', N'1', N'2023-11-24 19:29:34', N'0', 1) +GO +SET IDENTITY_INSERT win_demo02_category OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo03_course +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_course +GO +CREATE TABLE win_demo03_course +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + student_id bigint NOT NULL, + name nvarchar(100) DEFAULT '' NOT NULL, + score tinyint NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'学生编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'student_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'名字', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'分数', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'score' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'学生课程表', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_course' +GO + +-- ---------------------------- +-- Records of win_demo03_course +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT win_demo03_course ON +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, 2, N'语文', 66, N'1', N'2023-11-16 23:21:49', N'1', N'2023-11-16 23:21:49', N'0', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (3, 2, N'数学', 22, N'1', N'2023-11-16 23:21:49', N'1', N'2023-11-16 23:21:49', N'0', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (6, 5, N'体育', 23, N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 15:44:40', N'1', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 5, N'计算机', 11, N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 15:44:40', N'1', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, N'体育', 23, N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 15:47:09', N'1', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 5, N'计算机', 11, N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 15:47:09', N'1', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (10, 5, N'体育', 23, N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 23:47:10', N'0', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (11, 5, N'计算机', 11, N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 23:47:10', N'0', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (12, 2, N'电脑', 33, N'1', N'2023-11-17 00:20:42', N'1', N'2023-11-16 16:20:45', N'1', 1) +GO +INSERT INTO win_demo03_course (id, student_id, name, score, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (13, 9, N'滑雪', 12, N'1', N'2023-11-17 13:13:20', N'1', N'2023-11-17 13:13:20', N'0', 1) +GO +SET IDENTITY_INSERT win_demo03_course OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo03_grade +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_grade +GO +CREATE TABLE win_demo03_grade +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + student_id bigint NOT NULL, + name nvarchar(100) DEFAULT '' NOT NULL, + teacher nvarchar(255) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'学生编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'student_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'名字', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'班主任', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'teacher' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'学生班级表', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_grade' +GO + +-- ---------------------------- +-- Records of win_demo03_grade +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT win_demo03_grade ON +GO +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (7, 2, N'三年 2 班', N'周杰伦', N'1', N'2023-11-16 23:21:49', N'1', N'2023-11-16 23:21:49', N'0', 1) +GO +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (8, 5, N'华为', N'遥遥领先', N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-16 23:47:10', N'0', 1) +GO +INSERT INTO win_demo03_grade (id, student_id, name, teacher, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, 9, N'小图', N'小娃111', N'1', N'2023-11-17 13:10:23', N'1', N'2023-11-17 13:10:23', N'0', 1) +GO +SET IDENTITY_INSERT win_demo03_grade OFF +GO +COMMIT +GO +-- @formatter:on + +-- ---------------------------- +-- Table structure for win_demo03_student +-- ---------------------------- +DROP TABLE IF EXISTS win_demo03_student +GO +CREATE TABLE win_demo03_student +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name nvarchar(100) DEFAULT '' NOT NULL, + sex tinyint NOT NULL, + birthday datetime2 NOT NULL, + description nvarchar(255) NOT NULL, + creator nvarchar(64) DEFAULT '' NULL, + create_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater nvarchar(64) DEFAULT '' NULL, + update_time datetime2 DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT 0 NOT NULL, + tenant_id bigint DEFAULT 0 NOT NULL +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'名字', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'性别', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'出生日期', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'birthday' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'简介', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'租户编号', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student', + 'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'学生表', + 'SCHEMA', N'dbo', + 'TABLE', N'win_demo03_student' +GO + +-- ---------------------------- +-- Records of win_demo03_student +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT win_demo03_student ON +GO +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (2, N'小白', 1, N'2023-11-16 00:00:00', N'

厉害

', N'1', N'2023-11-16 23:21:49', N'1', N'2023-11-17 16:49:06', N'0', 1) +GO +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (5, N'大黑', 2, N'2023-11-13 00:00:00', N'

你在教我做事?

', N'1', N'2023-11-16 23:22:46', N'1', N'2023-11-17 16:49:07', N'0', 1) +GO +INSERT INTO win_demo03_student (id, name, sex, birthday, description, creator, create_time, updater, update_time, deleted, tenant_id) VALUES (9, N'小花', 1, N'2023-11-07 00:00:00', N'

哈哈哈

', N'1', N'2023-11-17 00:04:47', N'1', N'2023-11-17 16:49:08', N'0', 1) +GO +SET IDENTITY_INSERT win_demo03_student OFF +GO +COMMIT +GO +-- @formatter:on + diff --git a/sql/tools/.gitignore b/sql/tools/.gitignore new file mode 100644 index 0000000..e00c3e7 --- /dev/null +++ b/sql/tools/.gitignore @@ -0,0 +1,8 @@ +# 忽略python虚拟环境 +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ diff --git a/sql/tools/README.md b/sql/tools/README.md new file mode 100644 index 0000000..94c5300 --- /dev/null +++ b/sql/tools/README.md @@ -0,0 +1,130 @@ +## 0. 友情提示 + +在 `sql/tools` 目录下,我们提供一些数据库相关的工具,包括测试数据库的快速启动、MySQL 转换其它数据库等等。 + +注意!所有的操作,必须在 `sql/tools` 目录下执行。 + +## 1. 测试数据库的快速启动 + +基于 Docker Compose,快速启动 MySQL、Oracle、PostgreSQL、SQL Server 等数据库。 + +注意!使用 Docker Compose 启动完测试数据后,因为会自动导入项目的 SQL 脚本,所以可能需要等待 1-2 分钟。 + +### 1.1 MySQL + +```Bash +docker compose up -d mysql +``` + +#### 1.2 Oracle + +```Bash +## x86 版本 +docker compose up -d oracle + +## MacBook Apple Silicon +docker compose up -d oracle_m1 +``` + +> 注意:如果使用 MacBook Apple Silicon 版本,它的 ORACLE_SID 不是 XE,而是 FREE!!! + +### 1.3 PostgreSQL + +```Bash +docker compose up -d postgres +``` + +### 1.4 SQL Server + +```Bash +docker compose up -d sqlserver +# 注意:启动完 sqlserver 后,需要手动再执行如下命令,因为 SQL Server 不支持初始化脚本 +docker compose exec sqlserver bash /tmp/create_schema.sh +``` + +### 1.5 DM 达梦 + +① 下载达梦 Docker 镜像: 地址,点击“Docker 镜像”选项,进行下载。 + +② 加载镜像文件,在镜像 tar 文件所在目录运行: + +```Bash +docker load -i dm8_20240715_x86_rh6_rq_single.tar +``` + +③ 在项目 `sql/tools` 目录下运行: + +```Bash +docker compose up -d dm8 +# 注意:启动完 dm 后,需要手动再执行如下命令,因为 dm 不支持初始化脚本 +docker compose exec dm8 bash -c '/opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql' +exit +``` + +### 1.6 KingbaseES 人大金仓 + +① 下载人大金仓 Docker 镜像: + +* [x86_64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar) 【Windows 选择这个】 +* [aarch64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar) 【MacBook Apple Silicon 选择这个】 + +② 加载镜像文件,在镜像 tar 文件所在目录运行: + +```Bash +docker load -i kdb_x86_64_V009R001C001B0025.tar +``` + +③ 在项目 `sql/tools` 目录下运行: + +```Bash +docker compose up -d kingbase +# 注意:启动完 kingbase 后,需要手动再执行如下命令 +docker compose exec kingbase bash -c 'ksql -U $DB_USER -d test -f /tmp/schema.sql' +``` + +### 1.7 华为 OpenGauss + +```Bash +docker compose up -d opengauss +# 注意:启动完 opengauss 后,需要手动再执行如下命令 +docker compose exec opengauss bash -c '/usr/local/opengauss/bin/gsql -U $GS_USERNAME -W $GS_PASSWORD -d postgres -f /tmp/schema.sql' +``` + +## 1.X 容器的销毁重建 + +开发测试过程中,有时候需要创建全新干净的数据库。由于测试数据 Docker 容器采用数据卷 Volume 挂载数据库实例的数据目录,因此销毁数据需要停止容器后,删除数据卷,然后再重新创建容器。 + +以 postgres 为例,操作如下: + +```Bash +docker compose down postgres +docker volume rm ruoyi-vue-pro_postgres +``` + +## 2. MySQL 转换其它数据库 + +项目提供了 `sql/tools/convertor.py` 脚本,支持将 MySQL 转换为 Oracle、PostgreSQL、SQL Server、达梦、人大金仓、OpenGauss 等数据库的脚本。 + +### 2.1 实现原理 + +通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成对应的数据库脚本。 + +### 2.2 使用方法 + +① 安装依赖库 `simple-ddl-parser` + +```bash +pip install simple-ddl-parser +# pip3 install simple-ddl-parser +``` + +② 在 `sql/tools/` 目录下,执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`、`kingbase`、`opengauss`: + +```Bash +python3 convertor.py postgres +# python3 convertor.py postgres > tmp.sql +``` + +程序将 SQL 脚本打印到终端,可以重定向到临时文件 `tmp.sql`。 + +确认无误后,可以利用 IDEA 进行格式化。当然,也可以直接导入到数据库中。 diff --git a/sql/tools/convertor.py b/sql/tools/convertor.py new file mode 100644 index 0000000..72ec8d7 --- /dev/null +++ b/sql/tools/convertor.py @@ -0,0 +1,844 @@ +# encoding=utf8 +"""芋道系统数据库迁移工具 + +Author: dhb52 (https://gitee.com/dhb52) + +pip install simple-ddl-parser +""" + +import argparse +import pathlib +import re +import time +from abc import ABC, abstractmethod +from typing import Dict, Generator, Optional, Tuple, Union + +from simple_ddl_parser import DDLParser + +PREAMBLE = """/* + Win Database Transfer Tool + + Source Server Type : MySQL + + Target Server Type : {db_type} + + Date: {date} +*/ + +""" + + +def load_and_clean(sql_file: str) -> str: + """加载源 SQL 文件,并清理内容方便下一步 ddl 解析 + + Args: + sql_file (str): sql文件路径 + + Returns: + str: 清理后的sql文件内容 + """ + REPLACE_PAIR_LIST = ( + (" CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ", " "), + (" KEY `", " INDEX `"), + ("UNIQUE INDEX", "UNIQUE KEY"), + ("b'0'", "'0'"), + ("b'1'", "'1'"), + ) + + content = open(sql_file).read() + for replace_pair in REPLACE_PAIR_LIST: + content = content.replace(*replace_pair) + content = re.sub(r"ENGINE.*COMMENT", "COMMENT", content) + content = re.sub(r"ENGINE.*;", ";", content) + return content + + +class Convertor(ABC): + def __init__(self, src: str, db_type) -> None: + self.src = src + self.db_type = db_type + self.content = load_and_clean(self.src) + self.table_script_list = re.findall(r"CREATE TABLE [^;]*;", self.content) + + @abstractmethod + def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]) -> str: + """字段类型转换 + + Args: + type (str): 字段类型 + size (Optional[Union[int, Tuple[int]]]): 字段长度描述, 如varchar(255), decimal(10,2) + + Returns: + str: 类型定义 + """ + pass + + @abstractmethod + def gen_create(self, table_ddl: Dict) -> str: + """生成 create 脚本 + + Args: + table_ddl (Dict): 表DDL + + Returns: + str: 生成脚本 + """ + pass + + @abstractmethod + def gen_pk(self, table_name: str) -> str: + """生成主键定义 + + Args: + table_name (str): 表名 + + Returns: + str: 生成脚本 + """ + pass + + @abstractmethod + def gen_index(self, ddl: Dict) -> str: + """生成索引定义 + + Args: + table_ddl (Dict): 表DDL + + Returns: + str: 生成脚本 + """ + pass + + @abstractmethod + def gen_comment(self, table_sql: str, table_name: str) -> str: + """生成字段/表注释 + + Args: + table_sql (str): 原始表SQL + table_name (str): 表名 + + Returns: + str: 生成脚本 + """ + pass + + @abstractmethod + def gen_insert(self, table_name: str) -> str: + """生成 insert 语句块 + + Args: + table_name (str): 表名 + + Returns: + str: 生成脚本 + """ + pass + + def gen_dual(self) -> str: + """生成虚拟 dual 表 + + Returns: + str: 生成脚本, 默认返回空脚本, 表示当前数据库无需手工创建 + """ + return "" + + @staticmethod + def inserts(table_name: str, script_content: str) -> Generator: + PREFIX = f"INSERT INTO `{table_name}`" + + # 收集 `table_name` 对应的 insert 语句 + for line in script_content.split("\n"): + if line.startswith(PREFIX): + head, tail = line.replace(PREFIX, "").split(" VALUES ", maxsplit=1) + head = head.strip().replace("`", "").lower() + tail = tail.strip().replace(r"\"", '"') + # tail = tail.replace("b'0'", "'0'").replace("b'1'", "'1'") + yield f"INSERT INTO {table_name.lower()} {head} VALUES {tail}" + + @staticmethod + def index(ddl: Dict) -> Generator: + """生成索引定义 + + Args: + ddl (Dict): 表DDL + + Yields: + Generator[str]: create index 语句 + """ + + def generate_columns(columns): + keys = [ + f"{col['name'].lower()}{' ' + col['order'].lower() if col['order'] != 'ASC' else ''}" + for col in columns[0] + ] + return ", ".join(keys) + + for no, index in enumerate(ddl["index"], 1): + columns = generate_columns(index["columns"]) + table_name = ddl["table_name"].lower() + yield f"CREATE INDEX idx_{table_name}_{no:02d} ON {table_name} ({columns})" + + @staticmethod + def filed_comments(table_sql: str) -> Generator: + for line in table_sql.split("\n"): + match = re.match(r"^`([^`]+)`.* COMMENT '([^']+)'", line.strip()) + if match: + field = match.group(1) + comment_string = match.group(2).replace("\\n", "\n") + yield field, comment_string + + def table_comment(self, table_sql: str) -> str: + match = re.search(r"COMMENT \= '([^']+)';", table_sql) + return match.group(1) if match else None + + def print(self): + """打印转换后的sql脚本到终端""" + print( + PREAMBLE.format( + db_type=self.db_type, + date=time.strftime("%Y-%m-%d %H:%M:%S"), + ) + ) + + dual = self.gen_dual() + if dual: + print( + f"""-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +{dual} +""" + ) + + error_scripts = [] + for table_sql in self.table_script_list: + ddl = DDLParser(table_sql.replace("`", "")).run() + + # 如果parse失败, 需要跟进 + if len(ddl) == 0: + error_scripts.append(table_sql) + continue + + table_ddl = ddl[0] + table_name = table_ddl["table_name"] + + # 忽略 quartz 的内容 + if table_name.lower().startswith("qrtz"): + continue + + # 为每个表生成个5个基本部分 + create = self.gen_create(table_ddl) + pk = self.gen_pk(table_name) + index = self.gen_index(table_ddl) + comment = self.gen_comment(table_sql, table_name) + inserts = self.gen_insert(table_name) + + # 组合当前表的DDL脚本 + script = f"""{create} + +{pk} + +{index} + +{comment} + +{inserts} +""" + + # 清理 + script = re.sub("\n{3,}", "\n\n", script).strip() + "\n" + + print(script) + + # 将parse失败的脚本打印出来 + if error_scripts: + for script in error_scripts: + print(script) + + +class PostgreSQLConvertor(Convertor): + def __init__(self, src): + super().__init__(src, "PostgreSQL") + + def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]): + """类型转换""" + + type = type.lower() + + if type == "varchar": + return f"varchar({size})" + if type == "int": + return "int4" + if type == "bigint" or type == "bigint unsigned": + return "int8" + if type == "datetime": + return "timestamp" + if type == "bit": + return "bool" + if type in ("tinyint", "smallint"): + return "int2" + if type == "text": + return "text" + if type in ("blob", "mediumblob"): + return "bytea" + if type == "decimal": + return ( + f"numeric({','.join(str(s) for s in size)})" if len(size) else "numeric" + ) + + def gen_create(self, ddl: Dict) -> str: + """生成 create""" + + def _generate_column(col): + name = col["name"].lower() + if name == "deleted": + return "deleted int2 NOT NULL DEFAULT 0" + + type = col["type"].lower() + full_type = self.translate_type(type, col["size"]) + nullable = "NULL" if col["nullable"] else "NOT NULL" + default = f"DEFAULT {col['default']}" if col["default"] is not None else "" + return f"{name} {full_type} {nullable} {default}" + + table_name = ddl["table_name"].lower() + columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]] + filed_def_list = ",\n ".join(columns) + script = f"""-- ---------------------------- +-- Table structure for {table_name} +-- ---------------------------- +DROP TABLE IF EXISTS {table_name}; +CREATE TABLE {table_name} ( + {filed_def_list} +);""" + + return script + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_comment(self, table_sql: str, table_name: str) -> str: + """生成字段及表的注释""" + + script = "" + for field, comment_string in self.filed_comments(table_sql): + script += ( + f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n" + ) + + table_comment = self.table_comment(table_sql) + if table_comment: + script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n" + + return script + + def gen_pk(self, table_name) -> str: + """生成主键定义""" + return f"ALTER TABLE {table_name} ADD CONSTRAINT pk_{table_name} PRIMARY KEY (id);\n" + + def gen_insert(self, table_name: str) -> str: + """生成 insert 语句,以及根据最后的 insert id+1 生成 Sequence""" + + inserts = list(Convertor.inserts(table_name, self.content)) + ## 生成 insert 脚本 + script = "" + last_id = 0 + if inserts: + inserts_lines = "\n".join(inserts) + script += f"""\n\n-- ---------------------------- +-- Records of {table_name.lower()} +-- ---------------------------- +-- @formatter:off +BEGIN; +{inserts_lines} +COMMIT; +-- @formatter:on""" + match = re.search(r"VALUES \((\d+),", inserts[-1]) + if match: + last_id = int(match.group(1)) + + # 生成 Sequence + script += ( + "\n\n" + + f"""DROP SEQUENCE IF EXISTS {table_name}_seq; +CREATE SEQUENCE {table_name}_seq + START {last_id + 1};""" + ) + + return script + + def gen_dual(self) -> str: + return """DROP TABLE IF EXISTS dual; +CREATE TABLE dual +( + id int2 +); + +COMMENT ON TABLE dual IS '数据库连接的表'; + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +-- @formatter:off +INSERT INTO dual VALUES (1); +-- @formatter:on""" + + +class OracleConvertor(Convertor): + def __init__(self, src): + super().__init__(src, "Oracle") + + def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]): + """类型转换""" + type = type.lower() + + if type == "varchar": + return f"varchar2({size if size < 4000 else 4000})" + if type == "int": + return "number" + if type == "bigint" or type == "bigint unsigned": + return "number" + if type == "datetime": + return "date" + if type == "bit": + return "number(1,0)" + if type in ("tinyint", "smallint"): + return "smallint" + if type == "text": + return "clob" + if type in ("blob", "mediumblob"): + return "blob" + if type == "decimal": + return ( + f"number({','.join(str(s) for s in size)})" if len(size) else "number" + ) + + def gen_create(self, ddl) -> str: + """生成 CREATE 语句""" + + def generate_column(col): + name = col["name"].lower() + if name == "deleted": + return "deleted number(1,0) DEFAULT 0 NOT NULL" + + type = col["type"].lower() + full_type = self.translate_type(type, col["size"]) + nullable = "NULL" if col["nullable"] else "NOT NULL" + default = f"DEFAULT {col['default']}" if col["default"] is not None else "" + # Oracle 中 size 不能作为字段名 + field_name = '"size"' if name == "size" else name + # Oracle DEFAULT 定义在 NULLABLE 之前 + return f"{field_name} {full_type} {default} {nullable}" + + table_name = ddl["table_name"].lower() + columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]] + field_def_list = ",\n ".join(columns) + script = f"""-- ---------------------------- +-- Table structure for {table_name} +-- ---------------------------- +CREATE TABLE {table_name} ( + {field_def_list} +);""" + + # oracle INSERT '' 不能通过 NOT NULL 校验 + script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL") + + return script + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_comment(self, table_sql: str, table_name: str) -> str: + script = "" + for field, comment_string in self.filed_comments(table_sql): + script += ( + f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n" + ) + + table_comment = self.table_comment(table_sql) + if table_comment: + script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n" + + return script + + def gen_pk(self, table_name: str) -> str: + """生成主键定义""" + return f"ALTER TABLE {table_name} ADD CONSTRAINT pk_{table_name} PRIMARY KEY (id);\n" + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_insert(self, table_name: str) -> str: + """拷贝 INSERT 语句""" + inserts = [] + for insert_script in Convertor.inserts(table_name, self.content): + # 对日期数据添加 TO_DATE 转换 + insert_script = re.sub( + r"('\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}')", + r"to_date(\g<1>, 'SYYYY-MM-DD HH24:MI:SS')", + insert_script, + ) + inserts.append(insert_script) + + ## 生成 insert 脚本 + script = "" + last_id = 0 + if inserts: + inserts_lines = "\n".join(inserts) + script += f"""\n\n-- ---------------------------- +-- Records of {table_name.lower()} +-- ---------------------------- +-- @formatter:off +{inserts_lines} +COMMIT; +-- @formatter:on""" + match = re.search(r"VALUES \((\d+),", inserts[-1]) + if match: + last_id = int(match.group(1)) + + # 生成 Sequence + script += f""" + +CREATE SEQUENCE {table_name}_seq + START WITH {last_id + 1};""" + + return script + + +class SQLServerConvertor(Convertor): + """_summary_ + + Args: + Convertor (_type_): _description_ + """ + + def __init__(self, src): + super().__init__(src, "Microsoft SQL Server") + + def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]): + """类型转换""" + + type = type.lower() + + if type == "varchar": + return f"nvarchar({size if size < 4000 else 4000})" + if type == "int": + return "int" + if type == "bigint" or type == "bigint unsigned": + return "bigint" + if type == "datetime": + return "datetime2" + if type == "bit": + return "varchar(1)" + if type in ("tinyint", "smallint"): + return "tinyint" + if type == "text": + return "nvarchar(max)" + if type in ("blob", "mediumblob"): + return "varbinary(max)" + if type == "decimal": + return ( + f"numeric({','.join(str(s) for s in size)})" if len(size) else "numeric" + ) + + def gen_create(self, ddl: Dict) -> str: + """生成 create""" + + def _generate_column(col): + name = col["name"].lower() + if name == "id": + return "id bigint NOT NULL PRIMARY KEY IDENTITY" + if name == "deleted": + return "deleted bit DEFAULT 0 NOT NULL" + + type = col["type"].lower() + full_type = self.translate_type(type, col["size"]) + nullable = "NULL" if col["nullable"] else "NOT NULL" + default = f"DEFAULT {col['default']}" if col["default"] is not None else "" + return f"{name} {full_type} {default} {nullable}" + + table_name = ddl["table_name"].lower() + columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]] + filed_def_list = ",\n ".join(columns) + script = f"""-- ---------------------------- +-- Table structure for {table_name} +-- ---------------------------- +DROP TABLE IF EXISTS {table_name} +GO +CREATE TABLE {table_name} ( + {filed_def_list} +) +GO""" + + return script + + def gen_comment(self, table_sql: str, table_name: str) -> str: + """生成字段及表的注释""" + + script = "" + + for field, comment_string in self.filed_comments(table_sql): + script += f"""EXEC sp_addextendedproperty + 'MS_Description', N'{comment_string}', + 'SCHEMA', N'dbo', + 'TABLE', N'{table_name}', + 'COLUMN', N'{field}' +GO + +""" + + table_comment = self.table_comment(table_sql) + if table_comment: + script += f"""EXEC sp_addextendedproperty + 'MS_Description', N'{table_comment}', + 'SCHEMA', N'dbo', + 'TABLE', N'{table_name}' +GO + +""" + return script + + def gen_pk(self, table_name: str) -> str: + """生成主键定义""" + return "" + + def gen_index(self, ddl: Dict) -> str: + """生成 index""" + return "\n".join(f"{script}\nGO" for script in self.index(ddl)) + + def gen_insert(self, table_name: str) -> str: + """生成 insert 语句""" + + # 收集 `table_name` 对应的 insert 语句 + inserts = [] + for insert_script in Convertor.inserts(table_name, self.content): + # SQLServer: 字符串前加N,hack,是否存在替换字符串内容的风险 + insert_script = insert_script.replace(", '", ", N'").replace( + "VALUES ('", "VALUES (N')" + ) + # 删除 insert 的结尾分号 + insert_script = re.sub(";$", r"\nGO", insert_script) + inserts.append(insert_script) + + ## 生成 insert 脚本 + script = "" + if inserts: + inserts_lines = "\n".join(inserts) + script += f"""\n\n-- ---------------------------- +-- Records of {table_name.lower()} +-- ---------------------------- +-- @formatter:off +BEGIN TRANSACTION +GO +SET IDENTITY_INSERT {table_name.lower()} ON +GO +{inserts_lines} +SET IDENTITY_INSERT {table_name.lower()} OFF +GO +COMMIT +GO +-- @formatter:on""" + + return script + + def gen_dual(self) -> str: + return """DROP TABLE IF EXISTS dual +GO +CREATE TABLE dual +( + id int +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'数据库连接的表', + 'SCHEMA', N'dbo', + 'TABLE', N'dual' +GO + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +-- @formatter:off +INSERT INTO dual VALUES (1) +GO +-- @formatter:on""" + + +class DM8Convertor(Convertor): + def __init__(self, src): + super().__init__(src, "DM8") + + def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]): + """类型转换""" + type = type.lower() + + if type == "varchar": + return f"varchar({size})" + if type == "int": + return "int" + if type == "bigint" or type == "bigint unsigned": + return "bigint" + if type == "datetime": + return "datetime" + if type == "bit": + return "bit" + if type in ("tinyint", "smallint"): + return "smallint" + if type == "text": + return "text" + if type == "blob": + return "blob" + if type == "mediumblob": + return "varchar(10240)" + if type == "decimal": + return ( + f"decimal({','.join(str(s) for s in size)})" if len(size) else "decimal" + ) + + def gen_create(self, ddl) -> str: + """生成 CREATE 语句""" + + def generate_column(col): + name = col["name"].lower() + if name == "id": + return "id bigint NOT NULL PRIMARY KEY IDENTITY" + + type = col["type"].lower() + full_type = self.translate_type(type, col["size"]) + nullable = "NULL" if col["nullable"] else "NOT NULL" + default = f"DEFAULT {col['default']}" if col["default"] is not None else "" + return f"{name} {full_type} {default} {nullable}" + + table_name = ddl["table_name"].lower() + columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]] + field_def_list = ",\n ".join(columns) + script = f"""-- ---------------------------- +-- Table structure for {table_name} +-- ---------------------------- +CREATE TABLE {table_name} ( + {field_def_list} +);""" + + # oracle INSERT '' 不能通过 NOT NULL 校验 + script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL") + + return script + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_comment(self, table_sql: str, table_name: str) -> str: + script = "" + for field, comment_string in self.filed_comments(table_sql): + script += ( + f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n" + ) + + table_comment = self.table_comment(table_sql) + if table_comment: + script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n" + + return script + + def gen_pk(self, table_name: str) -> str: + """生成主键定义""" + return "" + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_insert(self, table_name: str) -> str: + """拷贝 INSERT 语句""" + inserts = list(Convertor.inserts(table_name, self.content)) + + ## 生成 insert 脚本 + script = "" + if inserts: + inserts_lines = "\n".join(inserts) + script += f"""\n\n-- ---------------------------- +-- Records of {table_name.lower()} +-- ---------------------------- +-- @formatter:off +SET IDENTITY_INSERT {table_name.lower()} ON; +{inserts_lines} +COMMIT; +SET IDENTITY_INSERT {table_name.lower()} OFF; +-- @formatter:on""" + + return script + + +class KingbaseConvertor(PostgreSQLConvertor): + def __init__(self, src): + super().__init__(src) + self.db_type = "Kingbase" + + def gen_create(self, ddl: Dict) -> str: + """生成 create""" + + def _generate_column(col): + name = col["name"].lower() + if name == "deleted": + return "deleted int2 NOT NULL DEFAULT 0" + + type = col["type"].lower() + full_type = self.translate_type(type, col["size"]) + nullable = "NULL" if col["nullable"] else "NOT NULL" + default = f"DEFAULT {col['default']}" if col["default"] is not None else "" + return f"{name} {full_type} {nullable} {default}" + + table_name = ddl["table_name"].lower() + columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]] + filed_def_list = ",\n ".join(columns) + script = f"""-- ---------------------------- +-- Table structure for {table_name} +-- ---------------------------- +DROP TABLE IF EXISTS {table_name}; +CREATE TABLE {table_name} ( + {filed_def_list} +);""" + + # Kingbase INSERT '' 不能通过 NOT NULL 校验 + script = script.replace("NOT NULL DEFAULT ''", "NULL DEFAULT ''") + + return script + + +class OpengaussConvertor(KingbaseConvertor): + def __init__(self, src): + super().__init__(src) + self.db_type = "OpenGauss" + + +def main(): + parser = argparse.ArgumentParser(description="芋道系统数据库转换工具") + parser.add_argument( + "type", + type=str, + help="目标数据库类型", + choices=["postgres", "oracle", "sqlserver", "dm8", "kingbase", "opengauss"], + ) + args = parser.parse_args() + + sql_file = pathlib.Path("../mysql/ruoyi-vue-pro.sql").resolve().as_posix() + convertor = None + if args.type == "postgres": + convertor = PostgreSQLConvertor(sql_file) + elif args.type == "oracle": + convertor = OracleConvertor(sql_file) + elif args.type == "sqlserver": + convertor = SQLServerConvertor(sql_file) + elif args.type == "dm8": + convertor = DM8Convertor(sql_file) + elif args.type == "kingbase": + convertor = KingbaseConvertor(sql_file) + elif args.type == "opengauss": + convertor = OpengaussConvertor(sql_file) + else: + raise NotImplementedError(f"不支持目标数据库类型: {args.type}") + + convertor.print() + + +if __name__ == "__main__": + main() diff --git a/sql/tools/docker-compose.yaml b/sql/tools/docker-compose.yaml new file mode 100644 index 0000000..44b0bc3 --- /dev/null +++ b/sql/tools/docker-compose.yaml @@ -0,0 +1,134 @@ +name: ruoyi-vue-pro + +volumes: + mysql: { } + postgres: { } + sqlserver: { } + dm8: { } + kingbase: { } + opengauss: { } + +services: + mysql: + image: mysql:8.0.33 + restart: unless-stopped + environment: + TZ: Asia/Shanghai + MYSQL_ROOT_PASSWORD: 123456 + MYSQL_DATABASE: ruoyi-vue-pro + ports: + - "3306:3306" + volumes: + - mysql:/var/lib/mysql/ + # 注入初始化脚本 + - ./mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/init.sql:ro + command: + --default-authentication-plugin=mysql_native_password + --character-set-server=utf8mb4 + --collation-server=utf8mb4_general_ci + --explicit_defaults_for_timestamp=true + --lower_case_table_names=1 + + postgres: + image: postgres:14.2 + restart: unless-stopped + environment: + POSTGRES_USER: root + POSTGRES_PASSWORD: 123456 + POSTGRES_DB: ruoyi-vue-pro + ports: + - "5432:5432" + volumes: + - postgres:/var/lib/postgresql/data + # 注入初始化脚本 + - ../postgresql/quartz.sql:/docker-entrypoint-initdb.d/quartz.sql:ro + - ../postgresql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro + + oracle: + image: gvenzl/oracle-xe:18-slim-faststart + restart: unless-stopped + environment: + ## 登录信息 SID: XE user: system password: oracle + ORACLE_PASSWORD: oracle + ports: + - "1521:1521" + volumes: + - ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro + # 创建app用户: ROOT/123456@//localhost/XEPDB1 + - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro + - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro + + oracle_m1: + image: einslib/oracle-19c:19.3.0-ee-slim-faststart + restart: unless-stopped + environment: + ## 登录信息 SID: FREE user: system password: oracle + ORACLE_PASSWORD: oracle + ports: + - "1521:1521" + volumes: + - ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro + # 创建app用户: ROOT/123456@//localhost/XEPDB1 + - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro + - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro + + sqlserver: + image: mcr.microsoft.com/mssql/server:2017-latest + restart: unless-stopped + environment: + TZ: Asia/Shanghai + ACCEPT_EULA: "Y" + SA_PASSWORD: "Win@2024" + ports: + - "1433:1433" + volumes: + - sqlserver:/var/opt/mssql + - ../sqlserver/ruoyi-vue-pro.sql:/tmp/schema.sql:ro + # docker compose exec sqlserver bash /tmp/create_schema.sh + - ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro + + dm8: + # docker load -i dm8_20240715_x86_rh6_rq_single.tar + image: dm8_single:dm8_20240715_rev232765_x86_rh6_64 + restart: unless-stopped + environment: + PAGE_SIZE: 16 + LD_LIBRARY_PATH: /opt/dmdbms/bin + EXTENT_SIZE: 32 + BLANK_PAD_MODE: 1 + LOG_SIZE: 1024 + UNICODE_FLAG: 1 + LENGTH_IN_CHAR: 1 + INSTANCE_NAME: dm8_test + ports: + - "5236:5236" + volumes: + - dm8:/opt/dmdbms/data + - ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro + + kingbase: + image: kingbase_v009r001c001b0025_single_x86:v1 +# image: kingbase_v009r001c001b0025_single_arm:v1 + restart: unless-stopped + environment: + DB_USER: root + DB_PASSWORD: 123456 + ports: + - "54321:54321" + volumes: + - kingbase:/home/kingbase/userdata + - ../kingbase/ruoyi-vue-pro.sql:/tmp/schema.sql:ro + + opengauss: + image: opengauss/opengauss:5.0.0 + restart: unless-stopped + environment: + GS_USERNAME: root + GS_PASSWORD: Win@2024 + LD_LIBRARY_PATH: /usr/local/opengauss/lib:/usr/lib + ports: + - "5432:5432" + volumes: + - opengauss:/var/lib/opengauss + - ../opengauss/ruoyi-vue-pro.sql:/tmp/schema.sql:ro + # docker compose exec opengauss bash -c '/usr/local/opengauss/bin/gsql -U $GS_USERNAME -W $GS_PASSWORD -d postgres -f /tmp/schema.sql' \ No newline at end of file diff --git a/sql/tools/oracle/1_create_user.sql b/sql/tools/oracle/1_create_user.sql new file mode 100644 index 0000000..58c9658 --- /dev/null +++ b/sql/tools/oracle/1_create_user.sql @@ -0,0 +1,3 @@ +ALTER SESSION SET CONTAINER=XEPDB1; +CREATE USER ROOT IDENTIFIED BY 123456 QUOTA UNLIMITED ON USERS; +GRANT CONNECT, RESOURCE TO ROOT; diff --git a/sql/tools/oracle/2_create_schema.sh b/sql/tools/oracle/2_create_schema.sh new file mode 100644 index 0000000..ce7955d --- /dev/null +++ b/sql/tools/oracle/2_create_schema.sh @@ -0,0 +1 @@ +sqlplus -s ROOT/123456@//localhost/XEPDB1 @/tmp/schema.sql diff --git a/sql/tools/sqlserver/create_schema.sh b/sql/tools/sqlserver/create_schema.sh new file mode 100644 index 0000000..172650b --- /dev/null +++ b/sql/tools/sqlserver/create_schema.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -Q "CREATE DATABASE [ruoyi-vue-pro]; +GO" +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -d 'ruoyi-vue-pro' -i /tmp/schema.sql diff --git a/win-dependencies/pom.xml b/win-dependencies/pom.xml new file mode 100644 index 0000000..b245576 --- /dev/null +++ b/win-dependencies/pom.xml @@ -0,0 +1,633 @@ + + + 4.0.0 + + com.win + win-dependencies + ${revision} + pom + + ${project.artifactId} + 基础 bom 文件,管理整个项目的依赖版本 + https://github.com/YunaiV/ruoyi-vue-pro + + + 2.3.0-SNAPSHOT + 1.6.0 + + 3.3.4 + + 2.3.0 + 4.5.0 + + 1.2.23 + 3.5.16 + 3.5.8 + 4.3.1 + 1.4.13 + 3.0.6 + 3.36.0 + 8.1.3.140 + 8.6.0 + 5.1.0 + + 2.3.1 + + 2.2.7 + + 9.0.0 + 3.3.3 + 0.33.0 + + 8.0.2.RELEASE + 1.1.4 + 5.2.0 + + 7.0.1 + + 2.0.3 + 1.18.1 + 1.18.34 + 1.6.2 + 5.8.32 + 6.0.0-M16 + 4.0.3 + 2.4 + 1.2.83 + 33.3.1-jre + 2.14.5 + 3.11.1 + 0.1.55 + 2.9.2 + 2.7.0 + 3.0.6 + 4.1.113.Final + 1.2.5 + + 3.5.0 + 4.11.0 + 2.17.0 + 1.27.1 + 8.5.7 + 2.0.5 + 1.8.1 + 4.6.5.B + + + + + + + io.netty + netty-bom + ${netty.version} + pom + import + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + io.github.mouzt + bizlog-sdk + ${bizlog-sdk.version} + + + org.springframework.boot + spring-boot-starter + + + + + com.win + win-spring-boot-starter-biz-tenant + ${revision} + + + com.win + win-spring-boot-starter-biz-data-permission + ${revision} + + + com.win + win-spring-boot-starter-biz-ip + ${revision} + + + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + + + + + com.win + win-spring-boot-starter-web + ${revision} + + + + com.win + win-spring-boot-starter-security + ${revision} + + + + com.win + win-spring-boot-starter-websocket + ${revision} + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + ${knife4j.version} + + + org.springdoc + springdoc-openapi-starter-webmvc-api + ${springdoc.version} + + + + + com.win + win-spring-boot-starter-mybatis + ${revision} + + + + com.alibaba + druid-spring-boot-3-starter + ${druid.version} + + + org.mybatis + mybatis + ${mybatis.version} + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus.version} + + + com.baomidou + dynamic-datasource-spring-boot3-starter + ${dynamic-datasource.version} + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join.version} + + + + com.fhs-opensource + easy-trans-spring-boot-starter + ${easy-trans.version} + + + org.springframework + spring-context + + + org.springframework.cloud + spring-cloud-commons + + + + + com.fhs-opensource + easy-trans-mybatis-plus-extend + ${easy-trans.version} + + + com.fhs-opensource + easy-trans-anno + ${easy-trans.version} + + + + com.win + win-spring-boot-starter-redis + ${revision} + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + com.dameng + DmJdbcDriver18 + ${dm8.jdbc.version} + + + + org.opengauss + opengauss-jdbc + ${opengauss.jdbc.version} + + + + cn.com.kingbase + kingbase8 + ${kingbase.jdbc.version} + + + + + com.win + win-spring-boot-starter-job + ${revision} + + + + + com.win + win-spring-boot-starter-mq + ${revision} + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + ${rocketmq-spring.version} + + + + + com.win + win-spring-boot-starter-protection + ${revision} + + + + com.baomidou + lock4j-redisson-spring-boot-starter + ${lock4j.version} + + + redisson-spring-boot-starter + org.redisson + + + + + + + com.win + win-spring-boot-starter-monitor + ${revision} + + + + org.apache.skywalking + apm-toolkit-trace + ${skywalking.version} + + + org.apache.skywalking + apm-toolkit-logback-1.x + ${skywalking.version} + + + org.apache.skywalking + apm-toolkit-opentracing + ${skywalking.version} + + + + + + + + + + + + + io.opentracing + opentracing-api + ${opentracing.version} + + + io.opentracing + opentracing-util + ${opentracing.version} + + + io.opentracing + opentracing-noop + ${opentracing.version} + + + + de.codecentric + spring-boot-admin-starter-server + ${spring-boot-admin.version} + + + de.codecentric + spring-boot-admin-server-cloud + + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + org.mockito + mockito-inline + ${mockito-inline.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + + + asm + org.ow2.asm + + + org.mockito + mockito-core + + + + + + com.github.fppt + jedis-mock + ${jedis-mock.version} + + + + uk.co.jemos.podam + podam + ${podam.version} + + + + + org.flowable + flowable-spring-boot-starter-process + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-actuator + ${flowable.version} + + + + + + com.win + win-common + ${revision} + + + + com.win + win-spring-boot-starter-excel + ${revision} + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-jdk8 + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + cn.hutool + hutool-all + ${hutool-5.version} + + + org.dromara.hutool + hutool-extra + ${hutool-6.version} + + + + com.alibaba + easyexcel + ${easyexcel.verion} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-compress + ${commons-compress.version} + + + org.apache.tika + tika-core + ${tika-core.version} + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + com.google.guava + guava + ${guava.version} + + + + com.alibaba + transmittable-thread-local + ${transmittable-thread-local.version} + + + + commons-net + commons-net + ${commons-net.version} + + + + com.jcraft + jsch + ${jsch.version} + + + + com.xingyuv + spring-boot-starter-captcha-plus + ${captcha-plus.version} + + + + org.lionsoul + ip2region + ${ip2region.version} + + + + org.jsoup + jsoup + ${jsoup.version} + + + + + com.squareup.okio + okio + ${okio.version} + + + com.squareup.okhttp3 + okhttp + ${okhttp3.version} + + + io.minio + minio + ${minio.version} + + + + com.xingyuv + spring-boot-starter-justauth + ${justauth.version} + + + cn.hutool + hutool-core + + + + + + com.github.binarywang + weixin-java-pay + ${weixin-java.version} + + + com.github.binarywang + wx-java-mp-spring-boot-starter + ${weixin-java.version} + + + com.github.binarywang + wx-java-miniapp-spring-boot-starter + ${weixin-java.version} + + + + + org.jeecgframework.jimureport + jimureport-spring-boot3-starter-fastjson2 + ${jimureport.version} + + + com.alibaba + druid + + + + + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + ${mqtt.version} + + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + bom + true + + + + + flatten + + flatten + process-resources + + + + clean + + flatten.clean + clean + + + + + + + diff --git a/win-framework/pom.xml b/win-framework/pom.xml new file mode 100644 index 0000000..f9ddd53 --- /dev/null +++ b/win-framework/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + win + com.win + ${revision} + + pom + + win-common + win-spring-boot-starter-mybatis + win-spring-boot-starter-redis + win-spring-boot-starter-web + win-spring-boot-starter-security + win-spring-boot-starter-websocket + + win-spring-boot-starter-monitor + win-spring-boot-starter-protection + win-spring-boot-starter-job + win-spring-boot-starter-mq + + win-spring-boot-starter-excel + + win-spring-boot-starter-biz-tenant + win-spring-boot-starter-biz-data-permission + win-spring-boot-starter-biz-ip + + + win-framework + + 该包是技术组件,每个子包,代表一个组件。每个组件包括两部分: + 1. core 包:是该组件的核心封装 + 2. config 包:是该组件基于 Spring 的配置 + + 技术组件,也分成两类: + 1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展 + 2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。 + 如果是业务组件,Maven 名字会包含 biz + + https://github.com/YunaiV/ruoyi-vue-pro + + diff --git a/win-framework/win-common/pom.xml b/win-framework/win-common/pom.xml new file mode 100644 index 0000000..a1fb24b --- /dev/null +++ b/win-framework/win-common/pom.xml @@ -0,0 +1,149 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-common + jar + + ${project.artifactId} + 定义基础 pojo 类、枚举、工具类等等 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + org.springframework + spring-core + provided + + + org.springframework + spring-expression + provided + + + org.springframework + spring-aop + provided + + + org.aspectj + aspectjweaver + provided + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + org.springdoc + springdoc-openapi-starter-webmvc-api + provided + + + + + org.apache.skywalking + apm-toolkit-trace + + + + + org.projectlombok + lombok + + + + org.mapstruct + mapstruct + + + org.mapstruct + mapstruct-jdk8 + + + org.mapstruct + mapstruct-processor + + + + com.google.guava + guava + provided + + + + com.fasterxml.jackson.core + jackson-databind + provided + + + com.fasterxml.jackson.core + jackson-core + provided + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + provided + + + + org.slf4j + slf4j-api + provided + + + + jakarta.validation + jakarta.validation-api + provided + + + + cn.hutool + hutool-all + + + + com.alibaba + transmittable-thread-local + + + + com.fhs-opensource + easy-trans-anno + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java b/win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java new file mode 100644 index 0000000..02a39f0 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java @@ -0,0 +1,15 @@ +package com.win.framework.common.core; + +/** + * 可生成 Int 数组的接口 + * + * @author 芋道源码 + */ +public interface IntArrayValuable { + + /** + * @return int 数组 + */ + int[] array(); + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java b/win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java new file mode 100644 index 0000000..63c0538 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java @@ -0,0 +1,22 @@ +package com.win.framework.common.core; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * Key Value 的键值对 + * + * @author 芋道源码 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class KeyValue implements Serializable { + + private K key; + private V value; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java new file mode 100644 index 0000000..0e28561 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java @@ -0,0 +1,46 @@ +package com.win.framework.common.enums; + +import cn.hutool.core.util.ObjUtil; +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 通用状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum CommonStatusEnum implements IntArrayValuable { + + ENABLE(0, "开启"), + DISABLE(1, "关闭"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray(); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } + + public static boolean isEnable(Integer status) { + return ObjUtil.equal(ENABLE.status, status); + } + + public static boolean isDisable(Integer status) { + return ObjUtil.equal(DISABLE.status, status); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/DateIntervalEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/DateIntervalEnum.java new file mode 100644 index 0000000..fcd4d72 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/DateIntervalEnum.java @@ -0,0 +1,46 @@ +package com.win.framework.common.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 时间间隔的枚举 + * + * @author dhb52 + */ +@Getter +@AllArgsConstructor +public enum DateIntervalEnum implements IntArrayValuable { + + DAY(1, "天"), + WEEK(2, "周"), + MONTH(3, "月"), + QUARTER(4, "季度"), + YEAR(5, "年") + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DateIntervalEnum::getInterval).toArray(); + + /** + * 类型 + */ + private final Integer interval; + /** + * 名称 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } + + public static DateIntervalEnum valueOf(Integer interval) { + return ArrayUtil.firstMatch(item -> item.getInterval().equals(interval), DateIntervalEnum.values()); + } + +} \ No newline at end of file diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java new file mode 100644 index 0000000..b698402 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java @@ -0,0 +1,21 @@ +package com.win.framework.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文档地址 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum DocumentEnum { + + REDIS_INSTALL("https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4VCSJ", "Redis 安装文档"), + TENANT("https://doc.iocoder.cn", "SaaS 多租户文档"); + + private final String url; + private final String memo; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/TerminalEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/TerminalEnum.java new file mode 100644 index 0000000..2381ca3 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/TerminalEnum.java @@ -0,0 +1,40 @@ +package com.win.framework.common.enums; + +import com.win.framework.common.core.IntArrayValuable; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +/** + * 终端的枚举 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +@Getter +public enum TerminalEnum implements IntArrayValuable { + + UNKNOWN(0, "未知"), // 目的:在无法解析到 terminal 时,使用它 + WECHAT_MINI_PROGRAM(10, "微信小程序"), + WECHAT_WAP(11, "微信公众号"), + H5(20, "H5 网页"), + APP(31, "手机 App"), + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TerminalEnum::getTerminal).toArray(); + + /** + * 终端 + */ + private final Integer terminal; + /** + * 终端名 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/UserTypeEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/UserTypeEnum.java new file mode 100644 index 0000000..b33a375 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/UserTypeEnum.java @@ -0,0 +1,39 @@ +package com.win.framework.common.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 全局用户类型枚举 + */ +@AllArgsConstructor +@Getter +public enum UserTypeEnum implements IntArrayValuable { + + MEMBER(1, "会员"), // 面向 c 端,普通用户 + ADMIN(2, "管理员"); // 面向 b 端,管理后台 + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(UserTypeEnum::getValue).toArray(); + + /** + * 类型 + */ + private final Integer value; + /** + * 类型名 + */ + private final String name; + + public static UserTypeEnum valueOf(Integer value) { + return ArrayUtil.firstMatch(userType -> userType.getValue().equals(value), UserTypeEnum.values()); + } + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java new file mode 100644 index 0000000..9f5f424 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java @@ -0,0 +1,34 @@ +package com.win.framework.common.enums; + +/** + * Web 过滤器顺序的枚举类,保证过滤器按照符合我们的预期 + * + * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 enums 包下 + * + * @author 芋道源码 + */ +public interface WebFilterOrderEnum { + + int CORS_FILTER = Integer.MIN_VALUE; + + int TRACE_FILTER = CORS_FILTER + 1; + + int REQUEST_BODY_CACHE_FILTER = Integer.MIN_VALUE + 500; + + // OrderedRequestContextFilter 默认为 -105,用于国际化上下文等等 + + int TENANT_CONTEXT_FILTER = - 104; // 需要保证在 ApiAccessLogFilter 前面 + + int API_ACCESS_LOG_FILTER = -103; // 需要保证在 RequestBodyCacheFilter 后面 + + int XSS_FILTER = -102; // 需要保证在 RequestBodyCacheFilter 后面 + + // Spring Security Filter 默认为 -100,可见 org.springframework.boot.autoconfigure.security.SecurityProperties 配置属性类 + + int TENANT_SECURITY_FILTER = -99; // 需要保证在 Spring Security 过滤器后面 + + int FLOWABLE_FILTER = -98; // 需要保证在 Spring Security 过滤后面 + + int DEMO_FILTER = Integer.MAX_VALUE; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java new file mode 100644 index 0000000..f14fe99 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java @@ -0,0 +1,32 @@ +package com.win.framework.common.exception; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.exception.enums.ServiceErrorCodeRange; +import lombok.Data; + +/** + * 错误码对象 + * + * 全局错误码,占用 [0, 999], 参见 {@link GlobalErrorCodeConstants} + * 业务异常错误码,占用 [1 000 000 000, +∞),参见 {@link ServiceErrorCodeRange} + * + * TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备 + */ +@Data +public class ErrorCode { + + /** + * 错误码 + */ + private final Integer code; + /** + * 错误提示 + */ + private final String msg; + + public ErrorCode(Integer code, String message) { + this.code = code; + this.msg = message; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java new file mode 100644 index 0000000..de580c3 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java @@ -0,0 +1,60 @@ +package com.win.framework.common.exception; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 服务器异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServerException extends RuntimeException { + + /** + * 全局错误码 + * + * @see GlobalErrorCodeConstants + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServerException() { + } + + public ServerException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServerException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServerException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServerException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java new file mode 100644 index 0000000..4455451 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java @@ -0,0 +1,60 @@ +package com.win.framework.common.exception; + +import com.win.framework.common.exception.enums.ServiceErrorCodeRange; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 业务逻辑异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServiceException extends RuntimeException { + + /** + * 业务错误码 + * + * @see ServiceErrorCodeRange + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() { + } + + public ServiceException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServiceException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServiceException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java new file mode 100644 index 0000000..5507071 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java @@ -0,0 +1,41 @@ +package com.win.framework.common.exception.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * 全局错误码枚举 + * 0-999 系统异常编码保留 + * + * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status + * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 + * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。 + * + * @author 芋道源码 + */ +public interface GlobalErrorCodeConstants { + + ErrorCode SUCCESS = new ErrorCode(0, "成功"); + + // ========== 客户端错误段 ========== + + ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确"); + ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录"); + ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); + ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); + ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); + ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 + ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); + + // ========== 服务端错误段 ========== + + ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); + ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启"); + ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项"); + + // ========== 自定义错误段 ========== + ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 + ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); + + ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java new file mode 100644 index 0000000..301b0e3 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java @@ -0,0 +1,48 @@ +package com.win.framework.common.exception.enums; + +/** + * 业务异常的错误码区间,解决:解决各模块错误码定义,避免重复,在此只声明不做实际使用 + * + * 一共 10 位,分成四段 + * + * 第一段,1 位,类型 + * 1 - 业务级别异常 + * x - 预留 + * 第二段,3 位,系统类型 + * 001 - 用户系统 + * 002 - 商品系统 + * 003 - 订单系统 + * 004 - 支付系统 + * 005 - 优惠劵系统 + * ... - ... + * 第三段,3 位,模块 + * 不限制规则。 + * 一般建议,每个系统里面,可能有多个模块,可以再去做分段。以用户系统为例子: + * 001 - OAuth2 模块 + * 002 - User 模块 + * 003 - MobileCode 模块 + * 第四段,3 位,错误码 + * 不限制规则。 + * 一般建议,每个模块自增。 + * + * @author 芋道源码 + */ +public class ServiceErrorCodeRange { + + // 模块 infra 错误码区间 [1-001-000-000 ~ 1-002-000-000) + // 模块 system 错误码区间 [1-002-000-000 ~ 1-003-000-000) + // 模块 report 错误码区间 [1-003-000-000 ~ 1-004-000-000) + // 模块 member 错误码区间 [1-004-000-000 ~ 1-005-000-000) + // 模块 mp 错误码区间 [1-006-000-000 ~ 1-007-000-000) + // 模块 pay 错误码区间 [1-007-000-000 ~ 1-008-000-000) + // 模块 bpm 错误码区间 [1-009-000-000 ~ 1-010-000-000) + + // 模块 product 错误码区间 [1-008-000-000 ~ 1-009-000-000) + // 模块 trade 错误码区间 [1-011-000-000 ~ 1-012-000-000) + // 模块 promotion 错误码区间 [1-013-000-000 ~ 1-014-000-000) + + // 模块 crm 错误码区间 [1-020-000-000 ~ 1-021-000-000) + + // 模块 ai 错误码区间 [1-022-000-000 ~ 1-023-000-000) + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java new file mode 100644 index 0000000..217cb3a --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java @@ -0,0 +1,77 @@ +package com.win.framework.common.exception.util; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; + +/** + * {@link ServiceException} 工具类 + * + * 目的在于,格式化异常信息提示。 + * 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化 + * + */ +@Slf4j +public class ServiceExceptionUtil { + + // ========== 和 ServiceException 的集成 ========== + + public static ServiceException exception(ErrorCode errorCode) { + return exception0(errorCode.getCode(), errorCode.getMsg()); + } + + public static ServiceException exception(ErrorCode errorCode, Object... params) { + return exception0(errorCode.getCode(), errorCode.getMsg(), params); + } + + public static ServiceException exception0(Integer code, String messagePattern, Object... params) { + String message = doFormat(code, messagePattern, params); + return new ServiceException(code, message); + } + + public static ServiceException invalidParamException(String messagePattern, Object... params) { + return exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), messagePattern, params); + } + + // ========== 格式化方法 ========== + + /** + * 将错误编号对应的消息使用 params 进行格式化。 + * + * @param code 错误编号 + * @param messagePattern 消息模版 + * @param params 参数 + * @return 格式化后的提示 + */ + @VisibleForTesting + public static String doFormat(int code, String messagePattern, Object... params) { + StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50); + int i = 0; + int j; + int l; + for (l = 0; l < params.length; l++) { + j = messagePattern.indexOf("{}", i); + if (j == -1) { + log.error("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + if (i == 0) { + return messagePattern; + } else { + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + } else { + sbuf.append(messagePattern, i, j); + sbuf.append(params[l]); + i = j + 2; + } + } + if (messagePattern.indexOf("{}", i) != -1) { + log.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + } + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/package-info.java b/win-framework/win-common/src/main/java/com/win/framework/common/package-info.java new file mode 100644 index 0000000..b547792 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/package-info.java @@ -0,0 +1,6 @@ +/** + * 基础的通用类,和框架无关 + * + * 例如说,CommonResult 为通用返回 + */ +package com.win.framework.common; diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java new file mode 100644 index 0000000..81716f9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java @@ -0,0 +1,112 @@ +package com.win.framework.common.pojo; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.util.Assert; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 通用返回 + * + * @param 数据泛型 + */ +@Data +public class CommonResult implements Serializable { + + /** + * 错误码 + * + * @see ErrorCode#getCode() + */ + private Integer code; + /** + * 返回数据 + */ + private T data; + /** + * 错误提示,用户可阅读 + * + * @see ErrorCode#getMsg() () + */ + private String msg; + + /** + * 将传入的 result 对象,转换成另外一个泛型结果的对象 + * + * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。 + * + * @param result 传入的 result 对象 + * @param 返回的泛型 + * @return 新的 CommonResult 对象 + */ + public static CommonResult error(CommonResult result) { + return error(result.getCode(), result.getMsg()); + } + + public static CommonResult error(Integer code, String message) { + Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!"); + CommonResult result = new CommonResult<>(); + result.code = code; + result.msg = message; + return result; + } + + public static CommonResult error(ErrorCode errorCode) { + return error(errorCode.getCode(), errorCode.getMsg()); + } + + public static CommonResult success(T data) { + CommonResult result = new CommonResult<>(); + result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); + result.data = data; + result.msg = ""; + return result; + } + + public static boolean isSuccess(Integer code) { + return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isSuccess() { + return isSuccess(code); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isError() { + return !isSuccess(); + } + + // ========= 和 Exception 异常体系集成 ========= + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + */ + public void checkError() throws ServiceException { + if (isSuccess()) { + return; + } + // 业务异常 + throw new ServiceException(code, msg); + } + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + * 如果没有,则返回 {@link #data} 数据 + */ + @JsonIgnore // 避免 jackson 序列化 + public T getCheckedData() { + checkError(); + return data; + } + + public static CommonResult error(ServiceException serviceException) { + return error(serviceException.getCode(), serviceException.getMessage()); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java new file mode 100644 index 0000000..7ea32ed --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java @@ -0,0 +1,36 @@ +package com.win.framework.common.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; + +@Schema(description="分页参数") +@Data +public class PageParam implements Serializable { + + private static final Integer PAGE_NO = 1; + private static final Integer PAGE_SIZE = 10; + + /** + * 每页条数 - 不分页 + * + * 例如说,导出接口,可以设置 {@link #pageSize} 为 -1 不分页,查询所有数据。 + */ + public static final Integer PAGE_SIZE_NONE = -1; + + @Schema(description = "页码,从 1 开始", requiredMode = Schema.RequiredMode.REQUIRED,example = "1") + @NotNull(message = "页码不能为空") + @Min(value = 1, message = "页码最小值为 1") + private Integer pageNo = PAGE_NO; + + @Schema(description = "每页条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "每页条数不能为空") + @Min(value = 1, message = "每页条数最小值为 1") + @Max(value = 100, message = "每页条数最大值为 100") + private Integer pageSize = PAGE_SIZE; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java new file mode 100644 index 0000000..d9dee04 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java @@ -0,0 +1,41 @@ +package com.win.framework.common.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Schema(description = "分页结果") +@Data +public final class PageResult implements Serializable { + + @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED) + private List list; + + @Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long total; + + public PageResult() { + } + + public PageResult(List list, Long total) { + this.list = list; + this.total = total; + } + + public PageResult(Long total) { + this.list = new ArrayList<>(); + this.total = total; + } + + public static PageResult empty() { + return new PageResult<>(0L); + } + + public static PageResult empty(Long total) { + return new PageResult<>(total); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortablePageParam.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortablePageParam.java new file mode 100644 index 0000000..75f6a76 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortablePageParam.java @@ -0,0 +1,19 @@ +package com.win.framework.common.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "可排序的分页参数") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SortablePageParam extends PageParam { + + @Schema(description = "排序字段") + private List sortingFields; + +} \ No newline at end of file diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortingField.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortingField.java new file mode 100644 index 0000000..41787e4 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/SortingField.java @@ -0,0 +1,37 @@ +package com.win.framework.common.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 排序字段 DTO + * + * 类名加了 ing 的原因是,避免和 ES SortField 重名。 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SortingField implements Serializable { + + /** + * 顺序 - 升序 + */ + public static final String ORDER_ASC = "asc"; + /** + * 顺序 - 降序 + */ + public static final String ORDER_DESC = "desc"; + + /** + * 字段 + */ + private String field; + /** + * 顺序 + */ + private String order; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java new file mode 100644 index 0000000..65434cc --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java @@ -0,0 +1,49 @@ +package com.win.framework.common.util.cache; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.time.Duration; +import java.util.concurrent.Executors; + +/** + * Cache 工具类 + * + * @author 芋道源码 + */ +public class CacheUtils { + + /** + * 构建异步刷新的 LoadingCache 对象 + * + * 注意:如果你的缓存和 ThreadLocal 有关系,要么自己处理 ThreadLocal 的传递,要么使用 {@link #buildCache(Duration, CacheLoader)} 方法 + * + * 或者简单理解: + * 1、和“人”相关的,使用 {@link #buildCache(Duration, CacheLoader)} 方法 + * 2、和“全局”、“系统”相关的,使用当前缓存方法 + * + * @param duration 过期时间 + * @param loader CacheLoader 对象 + * @return LoadingCache 对象 + */ + public static LoadingCache buildAsyncReloadingCache(Duration duration, CacheLoader loader) { + return CacheBuilder.newBuilder() + // 只阻塞当前数据加载线程,其他线程返回旧值 + .refreshAfterWrite(duration) + // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程 + .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置 + } + + /** + * 构建同步刷新的 LoadingCache 对象 + * + * @param duration 过期时间 + * @param loader CacheLoader 对象 + * @return LoadingCache 对象 + */ + public static LoadingCache buildCache(Duration duration, CacheLoader loader) { + return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java new file mode 100644 index 0000000..63f463e --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java @@ -0,0 +1,58 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.IterUtil; +import cn.hutool.core.util.ArrayUtil; + +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Function; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * Array 工具类 + * + * @author 芋道源码 + */ +public class ArrayUtils { + + /** + * 将 object 和 newElements 合并成一个数组 + * + * @param object 对象 + * @param newElements 数组 + * @param 泛型 + * @return 结果数组 + */ + @SafeVarargs + public static Consumer[] append(Consumer object, Consumer... newElements) { + if (object == null) { + return newElements; + } + Consumer[] result = ArrayUtil.newArray(Consumer.class, 1 + newElements.length); + result[0] = object; + System.arraycopy(newElements, 0, result, 1, newElements.length); + return result; + } + + public static V[] toArray(Collection from, Function mapper) { + return toArray(convertList(from, mapper)); + } + + @SuppressWarnings("unchecked") + public static T[] toArray(Collection from) { + if (CollectionUtil.isEmpty(from)) { + return (T[]) (new Object[0]); + } + return ArrayUtil.toArray(from, (Class) IterUtil.getElementType(from.iterator())); + } + + public static T get(T[] array, int index) { + if (null == array || index >= array.length) { + return null; + } + return array[index]; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java new file mode 100644 index 0000000..4291b7d --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java @@ -0,0 +1,330 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; +import com.google.common.collect.ImmutableMap; + +import java.util.*; +import java.util.function.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.Arrays.asList; + +/** + * Collection 工具类 + * + * @author 芋道源码 + */ +public class CollectionUtils { + + public static boolean containsAny(Object source, Object... targets) { + return asList(targets).contains(source); + } + + public static boolean isAnyEmpty(Collection... collections) { + return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty); + } + + public static boolean anyMatch(Collection from, Predicate predicate) { + return from.stream().anyMatch(predicate); + } + + public static List filterList(Collection from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(predicate).collect(Collectors.toList()); + } + + public static List distinct(Collection from, Function keyMapper) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return distinct(from, keyMapper, (t1, t2) -> t1); + } + + public static List distinct(Collection from, Function keyMapper, BinaryOperator cover) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return new ArrayList<>(convertMap(from, keyMapper, Function.identity(), cover).values()); + } + + public static List convertList(T[] from, Function func) { + if (ArrayUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return convertList(Arrays.asList(from), func); + } + + public static List convertList(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertList(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertListByFlatMap(Collection from, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertListByFlatMap(Collection from, + Function mapper, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(mapper).filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List mergeValuesFromMap(Map> map) { + return map.values() + .stream() + .flatMap(List::stream) + .collect(Collectors.toList()); + } + + public static Set convertSet(Collection from) { + return convertSet(from, v -> v); + } + + public static Set convertSet(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSet(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Map convertMapByFilter(Collection from, Predicate filter, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().filter(filter).collect(Collectors.toMap(keyFunc, v -> v)); + } + + public static Set convertSetByFlatMap(Collection from, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSetByFlatMap(Collection from, + Function mapper, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(mapper).filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Map convertMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, Function.identity()); + } + + public static Map convertMap(Collection from, Function keyFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, Function.identity(), supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, mergeFunction, HashMap::new); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1, supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.toMap(keyFunc, valueFunc, mergeFunction, supplier)); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(t -> t, Collectors.toList()))); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream() + .collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toList()))); + } + + // 暂时没想好名字,先以 2 结尾噶 + public static Map> convertMultiMap2(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); + } + + public static Map convertImmutableMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return Collections.emptyMap(); + } + ImmutableMap.Builder builder = ImmutableMap.builder(); + from.forEach(item -> builder.put(keyFunc.apply(item), item)); + return builder.build(); + } + + /** + * 对比老、新两个列表,找出新增、修改、删除的数据 + * + * @param oldList 老列表 + * @param newList 新列表 + * @param sameFunc 对比函数,返回 true 表示相同,返回 false 表示不同 + * 注意,same 是通过每个元素的“标识”,判断它们是不是同一个数据 + * @return [新增列表、修改列表、删除列表] + */ + public static List> diffList(Collection oldList, Collection newList, + BiFunction sameFunc) { + List createList = new LinkedList<>(newList); // 默认都认为是新增的,后续会进行移除 + List updateList = new ArrayList<>(); + List deleteList = new ArrayList<>(); + + // 通过以 oldList 为主遍历,找出 updateList 和 deleteList + for (T oldObj : oldList) { + // 1. 寻找是否有匹配的 + T foundObj = null; + for (Iterator iterator = createList.iterator(); iterator.hasNext(); ) { + T newObj = iterator.next(); + // 1.1 不匹配,则直接跳过 + if (!sameFunc.apply(oldObj, newObj)) { + continue; + } + // 1.2 匹配,则移除,并结束寻找 + iterator.remove(); + foundObj = newObj; + break; + } + // 2. 匹配添加到 updateList;不匹配则添加到 deleteList 中 + if (foundObj != null) { + updateList.add(foundObj); + } else { + deleteList.add(oldObj); + } + } + return asList(createList, updateList, deleteList); + } + + public static boolean containsAny(Collection source, Collection candidates) { + return org.springframework.util.CollectionUtils.containsAny(source, candidates); + } + + public static T getFirst(List from) { + return !CollectionUtil.isEmpty(from) ? from.get(0) : null; + } + + public static T findFirst(Collection from, Predicate predicate) { + return findFirst(from, predicate, Function.identity()); + } + + public static U findFirst(Collection from, Predicate predicate, Function func) { + if (CollUtil.isEmpty(from)) { + return null; + } + return from.stream().filter(predicate).findFirst().map(func).orElse(null); + } + + public static > V getMaxValue(Collection from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert !from.isEmpty(); // 断言,避免告警 + T t = from.stream().max(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static > V getMinValue(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().min(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static > T getMinObject(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + return from.stream().min(Comparator.comparing(valueFunc)).get(); + } + + public static > V getSumValue(Collection from, Function valueFunc, + BinaryOperator accumulator) { + return getSumValue(from, valueFunc, accumulator, null); + } + + public static > V getSumValue(Collection from, Function valueFunc, + BinaryOperator accumulator, V defaultValue) { + if (CollUtil.isEmpty(from)) { + return defaultValue; + } + assert !from.isEmpty(); // 断言,避免告警 + return from.stream().map(valueFunc).filter(Objects::nonNull).reduce(accumulator).orElse(defaultValue); + } + + public static void addIfNotNull(Collection coll, T item) { + if (item == null) { + return; + } + coll.add(item); + } + + public static Collection singleton(T obj) { + return obj == null ? Collections.emptyList() : Collections.singleton(obj); + } + + public static List newArrayList(List> list) { + return list.stream().flatMap(Collection::stream).collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java new file mode 100644 index 0000000..9808dcc --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java @@ -0,0 +1,68 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjUtil; +import com.win.framework.common.core.KeyValue; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * Map 工具类 + * + * @author 芋道源码 + */ +public class MapUtils { + + /** + * 从哈希表表中,获得 keys 对应的所有 value 数组 + * + * @param multimap 哈希表 + * @param keys keys + * @return value 数组 + */ + public static List getList(Multimap multimap, Collection keys) { + List result = new ArrayList<>(); + keys.forEach(k -> { + Collection values = multimap.get(k); + if (CollectionUtil.isEmpty(values)) { + return; + } + result.addAll(values); + }); + return result; + } + + /** + * 从哈希表查找到 key 对应的 value,然后进一步处理 + * key 为 null 时, 不处理 + * 注意,如果查找到的 value 为 null 时,不进行处理 + * + * @param map 哈希表 + * @param key key + * @param consumer 进一步处理的逻辑 + */ + public static void findAndThen(Map map, K key, Consumer consumer) { + if (ObjUtil.isNull(key) || CollUtil.isEmpty(map)) { + return; + } + V value = map.get(key); + if (value == null) { + return; + } + consumer.accept(value); + } + + public static Map convertMap(List> keyValues) { + Map map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size()); + keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue())); + return map; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java new file mode 100644 index 0000000..1f3dceb --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java @@ -0,0 +1,19 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; + +import java.util.Set; + +/** + * Set 工具类 + * + * @author 芋道源码 + */ +public class SetUtils { + + @SafeVarargs + public static Set asSet(T... objs) { + return CollUtil.newHashSet(objs); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java new file mode 100644 index 0000000..e0a22b2 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java @@ -0,0 +1,149 @@ +package com.win.framework.common.util.date; + +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.*; +import java.util.Calendar; +import java.util.Date; + +/** + * 时间工具类 + * + * @author 芋道源码 + */ +public class DateUtils { + + /** + * 时区 - 默认 + */ + public static final String TIME_ZONE_DEFAULT = "GMT+8"; + + /** + * 秒转换成毫秒 + */ + public static final long SECOND_MILLIS = 1000; + + public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd"; + + public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + + /** + * 将 LocalDateTime 转换成 Date + * + * @param date LocalDateTime + * @return LocalDateTime + */ + public static Date of(LocalDateTime date) { + if (date == null) { + return null; + } + // 将此日期时间与时区相结合以创建 ZonedDateTime + ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault()); + // 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳 + Instant instant = zonedDateTime.toInstant(); + // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 + return Date.from(instant); + } + + /** + * 将 Date 转换成 LocalDateTime + * + * @param date Date + * @return LocalDateTime + */ + public static LocalDateTime of(Date date) { + if (date == null) { + return null; + } + // 转为时间戳 + Instant instant = date.toInstant(); + // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 + return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + } + + public static Date addTime(Duration duration) { + return new Date(System.currentTimeMillis() + duration.toMillis()); + } + + public static boolean isExpired(LocalDateTime time) { + LocalDateTime now = LocalDateTime.now(); + return now.isAfter(time); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day) { + return buildTime(year, mouth, day, 0, 0, 0); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @param hour 小时 + * @param minute 分钟 + * @param second 秒 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day, + int hour, int minute, int second) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, mouth - 1); + calendar.set(Calendar.DAY_OF_MONTH, day); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒 + return calendar.getTime(); + } + + public static Date max(Date a, Date b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.compareTo(b) > 0 ? a : b; + } + + public static LocalDateTime max(LocalDateTime a, LocalDateTime b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.isAfter(b) ? a : b; + } + + /** + * 是否今天 + * + * @param date 日期 + * @return 是否 + */ + public static boolean isToday(LocalDateTime date) { + return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now()); + } + + /** + * 是否昨天 + * + * @param date 日期 + * @return 是否 + */ + public static boolean isYesterday(LocalDateTime date) { + return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now().minusDays(1)); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java new file mode 100644 index 0000000..51b065c --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java @@ -0,0 +1,309 @@ +package com.win.framework.common.util.date; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.DateIntervalEnum; + +import java.time.*; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.List; + +/** + * 时间工具类,用于 {@link java.time.LocalDateTime} + * + * @author 芋道源码 + */ +public class LocalDateTimeUtils { + + /** + * 空的 LocalDateTime 对象,主要用于 DB 唯一索引的默认值 + */ + public static LocalDateTime EMPTY = buildTime(1970, 1, 1); + + /** + * 解析时间 + * + * 相比 {@link LocalDateTimeUtil#parse(CharSequence)} 方法来说,会尽量去解析,直到成功 + * + * @param time 时间 + * @return 时间字符串 + */ + public static LocalDateTime parse(String time) { + try { + return LocalDateTimeUtil.parse(time, DatePattern.NORM_DATE_PATTERN); + } catch (DateTimeParseException e) { + return LocalDateTimeUtil.parse(time); + } + } + + public static LocalDateTime addTime(Duration duration) { + return LocalDateTime.now().plus(duration); + } + + public static LocalDateTime minusTime(Duration duration) { + return LocalDateTime.now().minus(duration); + } + + public static boolean beforeNow(LocalDateTime date) { + return date.isBefore(LocalDateTime.now()); + } + + public static boolean afterNow(LocalDateTime date) { + return date.isAfter(LocalDateTime.now()); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static LocalDateTime buildTime(int year, int mouth, int day) { + return LocalDateTime.of(year, mouth, day, 0, 0, 0); + } + + public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1, + int year2, int mouth2, int day2) { + return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)}; + } + + /** + * 判指定断时间,是否在该时间范围内 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param time 指定时间 + * @return 是否 + */ + public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime, String time) { + if (startTime == null || endTime == null || time == null) { + return false; + } + return LocalDateTimeUtil.isIn(parse(time), startTime, endTime); + } + + /** + * 判断当前时间是否在该时间范围内 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否 + */ + public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime) { + if (startTime == null || endTime == null) { + return false; + } + return LocalDateTimeUtil.isIn(LocalDateTime.now(), startTime, endTime); + } + + /** + * 判断当前时间是否在该时间范围内 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否 + */ + public static boolean isBetween(String startTime, String endTime) { + if (startTime == null || endTime == null) { + return false; + } + LocalDate nowDate = LocalDate.now(); + return LocalDateTimeUtil.isIn(LocalDateTime.now(), + LocalDateTime.of(nowDate, LocalTime.parse(startTime)), + LocalDateTime.of(nowDate, LocalTime.parse(endTime))); + } + + /** + * 判断时间段是否重叠 + * + * @param startTime1 开始 time1 + * @param endTime1 结束 time1 + * @param startTime2 开始 time2 + * @param endTime2 结束 time2 + * @return 重叠:true 不重叠:false + */ + public static boolean isOverlap(LocalTime startTime1, LocalTime endTime1, LocalTime startTime2, LocalTime endTime2) { + LocalDate nowDate = LocalDate.now(); + return LocalDateTimeUtil.isOverlap(LocalDateTime.of(nowDate, startTime1), LocalDateTime.of(nowDate, endTime1), + LocalDateTime.of(nowDate, startTime2), LocalDateTime.of(nowDate, endTime2)); + } + + /** + * 获取指定日期所在的月份的开始时间 + * 例如:2023-09-30 00:00:00,000 + * + * @param date 日期 + * @return 月份的开始时间 + */ + public static LocalDateTime beginOfMonth(LocalDateTime date) { + return date.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN); + } + + /** + * 获取指定日期所在的月份的最后时间 + * 例如:2023-09-30 23:59:59,999 + * + * @param date 日期 + * @return 月份的结束时间 + */ + public static LocalDateTime endOfMonth(LocalDateTime date) { + return date.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX); + } + + /** + * 获得指定日期所在季度 + * + * @param date 日期 + * @return 所在季度 + */ + public static int getQuarterOfYear(LocalDateTime date) { + return (date.getMonthValue() - 1) / 3 + 1; + } + + /** + * 获取指定日期到现在过了几天,如果指定日期在当前日期之后,获取结果为负 + * + * @param dateTime 日期 + * @return 相差天数 + */ + public static Long between(LocalDateTime dateTime) { + return LocalDateTimeUtil.between(dateTime, LocalDateTime.now(), ChronoUnit.DAYS); + } + + /** + * 获取今天的开始时间 + * + * @return 今天 + */ + public static LocalDateTime getToday() { + return LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); + } + + /** + * 获取昨天的开始时间 + * + * @return 昨天 + */ + public static LocalDateTime getYesterday() { + return LocalDateTimeUtil.beginOfDay(LocalDateTime.now().minusDays(1)); + } + + /** + * 获取本月的开始时间 + * + * @return 本月 + */ + public static LocalDateTime getMonth() { + return beginOfMonth(LocalDateTime.now()); + } + + /** + * 获取本年的开始时间 + * + * @return 本年 + */ + public static LocalDateTime getYear() { + return LocalDateTime.now().with(TemporalAdjusters.firstDayOfYear()).with(LocalTime.MIN); + } + + public static List getDateRangeList(LocalDateTime startTime, + LocalDateTime endTime, + Integer interval) { + // 1.1 找到枚举 + DateIntervalEnum intervalEnum = DateIntervalEnum.valueOf(interval); + Assert.notNull(intervalEnum, "interval({}} 找不到对应的枚举", interval); + // 1.2 将时间对齐 + startTime = LocalDateTimeUtil.beginOfDay(startTime); + endTime = LocalDateTimeUtil.endOfDay(endTime); + + // 2. 循环,生成时间范围 + List timeRanges = new ArrayList<>(); + switch (intervalEnum) { + case DAY: + while (startTime.isBefore(endTime)) { + timeRanges.add(new LocalDateTime[]{startTime, startTime.plusDays(1).minusNanos(1)}); + startTime = startTime.plusDays(1); + } + break; + case WEEK: + while (startTime.isBefore(endTime)) { + LocalDateTime endOfWeek = startTime.with(DayOfWeek.SUNDAY).plusDays(1).minusNanos(1); + timeRanges.add(new LocalDateTime[]{startTime, endOfWeek}); + startTime = endOfWeek.plusNanos(1); + } + break; + case MONTH: + while (startTime.isBefore(endTime)) { + LocalDateTime endOfMonth = startTime.with(TemporalAdjusters.lastDayOfMonth()).plusDays(1).minusNanos(1); + timeRanges.add(new LocalDateTime[]{startTime, endOfMonth}); + startTime = endOfMonth.plusNanos(1); + } + break; + case QUARTER: + while (startTime.isBefore(endTime)) { + int quarterOfYear = getQuarterOfYear(startTime); + LocalDateTime quarterEnd = quarterOfYear == 4 + ? startTime.with(TemporalAdjusters.lastDayOfYear()).plusDays(1).minusNanos(1) + : startTime.withMonth(quarterOfYear * 3 + 1).withDayOfMonth(1).minusNanos(1); + timeRanges.add(new LocalDateTime[]{startTime, quarterEnd}); + startTime = quarterEnd.plusNanos(1); + } + break; + case YEAR: + while (startTime.isBefore(endTime)) { + LocalDateTime endOfYear = startTime.with(TemporalAdjusters.lastDayOfYear()).plusDays(1).minusNanos(1); + timeRanges.add(new LocalDateTime[]{startTime, endOfYear}); + startTime = endOfYear.plusNanos(1); + } + break; + default: + throw new IllegalArgumentException("Invalid interval: " + interval); + } + // 3. 兜底,最后一个时间,需要保持在 endTime 之前 + LocalDateTime[] lastTimeRange = CollUtil.getLast(timeRanges); + if (lastTimeRange != null) { + lastTimeRange[1] = endTime; + } + return timeRanges; + } + + /** + * 格式化时间范围 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param interval 时间间隔 + * @return 时间范围 + */ + public static String formatDateRange(LocalDateTime startTime, LocalDateTime endTime, Integer interval) { + // 1. 找到枚举 + DateIntervalEnum intervalEnum = DateIntervalEnum.valueOf(interval); + Assert.notNull(intervalEnum, "interval({}} 找不到对应的枚举", interval); + + // 2. 循环,生成时间范围 + switch (intervalEnum) { + case DAY: + return LocalDateTimeUtil.format(startTime, DatePattern.NORM_DATE_PATTERN); + case WEEK: + return LocalDateTimeUtil.format(startTime, DatePattern.NORM_DATE_PATTERN) + + StrUtil.format("(第 {} 周)", LocalDateTimeUtil.weekOfYear(startTime)); + case MONTH: + return LocalDateTimeUtil.format(startTime, DatePattern.NORM_MONTH_PATTERN); + case QUARTER: + return StrUtil.format("{}-Q{}", startTime.getYear(), getQuarterOfYear(startTime)); + case YEAR: + return LocalDateTimeUtil.format(startTime, DatePattern.NORM_YEAR_PATTERN); + default: + throw new IllegalArgumentException("Invalid interval: " + interval); + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java new file mode 100644 index 0000000..ad12585 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java @@ -0,0 +1,163 @@ +package com.win.framework.common.util.http; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.map.TableMap; +import cn.hutool.core.net.url.UrlBuilder; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import jakarta.servlet.http.HttpServletRequest; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Map; + +/** + * HTTP 工具类 + * + * @author 芋道源码 + */ +public class HttpUtils { + + @SuppressWarnings("unchecked") + public static String replaceUrlQuery(String url, String key, String value) { + UrlBuilder builder = UrlBuilder.of(url, Charset.defaultCharset()); + // 先移除 + TableMap query = (TableMap) + ReflectUtil.getFieldValue(builder.getQuery(), "query"); + query.remove(key); + // 后添加 + builder.addQuery(key, value); + return builder.build(); + } + + private String append(String base, Map query, boolean fragment) { + return append(base, query, null, fragment); + } + + /** + * 拼接 URL + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 append 方法 + * + * @param base 基础 URL + * @param query 查询参数 + * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射 + * @param fragment URL 的 fragment,即拼接到 # 中 + * @return 拼接后的 URL + */ + public static String append(String base, Map query, Map keys, boolean fragment) { + UriComponentsBuilder template = UriComponentsBuilder.newInstance(); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(base); + URI redirectUri; + try { + // assume it's encoded to start with (if it came in over the wire) + redirectUri = builder.build(true).toUri(); + } catch (Exception e) { + // ... but allow client registrations to contain hard-coded non-encoded values + redirectUri = builder.build().toUri(); + builder = UriComponentsBuilder.fromUri(redirectUri); + } + template.scheme(redirectUri.getScheme()).port(redirectUri.getPort()).host(redirectUri.getHost()) + .userInfo(redirectUri.getUserInfo()).path(redirectUri.getPath()); + + if (fragment) { + StringBuilder values = new StringBuilder(); + if (redirectUri.getFragment() != null) { + String append = redirectUri.getFragment(); + values.append(append); + } + for (String key : query.keySet()) { + if (values.length() > 0) { + values.append("&"); + } + String name = key; + if (keys != null && keys.containsKey(key)) { + name = keys.get(key); + } + values.append(name).append("={").append(key).append("}"); + } + if (values.length() > 0) { + template.fragment(values.toString()); + } + UriComponents encoded = template.build().expand(query).encode(); + builder.fragment(encoded.getFragment()); + } else { + for (String key : query.keySet()) { + String name = key; + if (keys != null && keys.containsKey(key)) { + name = keys.get(key); + } + template.queryParam(name, "{" + key + "}"); + } + template.fragment(redirectUri.getFragment()); + UriComponents encoded = template.build().expand(query).encode(); + builder.query(encoded.getQuery()); + } + return builder.build().toUriString(); + } + + public static String[] obtainBasicAuthorization(HttpServletRequest request) { + String clientId; + String clientSecret; + // 先从 Header 中获取 + String authorization = request.getHeader("Authorization"); + authorization = StrUtil.subAfter(authorization, "Basic ", true); + if (StringUtils.hasText(authorization)) { + authorization = Base64.decodeStr(authorization); + clientId = StrUtil.subBefore(authorization, ":", false); + clientSecret = StrUtil.subAfter(authorization, ":", false); + // 再从 Param 中获取 + } else { + clientId = request.getParameter("client_id"); + clientSecret = request.getParameter("client_secret"); + } + + // 如果两者非空,则返回 + if (StrUtil.isNotEmpty(clientId) && StrUtil.isNotEmpty(clientSecret)) { + return new String[]{clientId, clientSecret}; + } + return null; + } + + /** + * HTTP post 请求,基于 {@link cn.hutool.http.HttpUtil} 实现 + * + * 为什么要封装该方法,因为 HttpUtil 默认封装的方法,没有允许传递 headers 参数 + * + * @param url URL + * @param headers 请求头 + * @param requestBody 请求体 + * @return 请求结果 + */ + public static String post(String url, Map headers, String requestBody) { + try (HttpResponse response = HttpRequest.post(url) + .addHeaders(headers) + .body(requestBody) + .execute()) { + return response.body(); + } + } + + /** + * HTTP get 请求,基于 {@link cn.hutool.http.HttpUtil} 实现 + * + * 为什么要封装该方法,因为 HttpUtil 默认封装的方法,没有允许传递 headers 参数 + * + * @param url URL + * @param headers 请求头 + * @return 请求结果 + */ + public static String get(String url, Map headers) { + try (HttpResponse response = HttpRequest.get(url) + .addHeaders(headers) + .execute()) { + return response.body(); + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java new file mode 100644 index 0000000..c4110d9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java @@ -0,0 +1,84 @@ +package com.win.framework.common.util.io; + +import cn.hutool.core.io.FileTypeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import lombok.SneakyThrows; + +import java.io.ByteArrayInputStream; +import java.io.File; + +/** + * 文件工具类 + * + * @author 芋道源码 + */ +public class FileUtils { + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(String data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeUtf8String(data, file); + return file; + } + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(byte[] data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeBytes(data, file); + return file; + } + + /** + * 创建临时文件,无内容 + * 该文件会在 JVM 退出时,进行删除 + * + * @return 文件 + */ + @SneakyThrows + public static File createTempFile() { + // 创建文件,通过 UUID 保证唯一 + File file = File.createTempFile(IdUtil.simpleUUID(), null); + // 标记 JVM 退出时,自动删除 + file.deleteOnExit(); + return file; + } + + /** + * 生成文件路径 + * + * @param content 文件内容 + * @param originalName 原始文件名 + * @return path,唯一不可重复 + */ + public static String generatePath(byte[] content, String originalName) { + String sha256Hex = DigestUtil.sha256Hex(content); + // 情况一:如果存在 name,则优先使用 name 的后缀 + if (StrUtil.isNotBlank(originalName)) { + String extName = FileNameUtil.extName(originalName); + return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName; + } + // 情况二:基于 content 计算 + return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content)); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java new file mode 100644 index 0000000..bb8a5cd --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java @@ -0,0 +1,28 @@ +package com.win.framework.common.util.io; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; + +import java.io.InputStream; + +/** + * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法 + * + * @author 芋道源码 + */ +public class IoUtils { + + /** + * 从流中读取 UTF8 编码的内容 + * + * @param in 输入流 + * @param isClose 是否关闭 + * @return 内容 + * @throws IORuntimeException IO 异常 + */ + public static String readUtf8(InputStream in, boolean isClose) throws IORuntimeException { + return StrUtil.utf8Str(IoUtil.read(in, isClose)); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java new file mode 100644 index 0000000..829f64e --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java @@ -0,0 +1,202 @@ +package com.win.framework.common.util.json; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author 芋道源码 + */ +@Slf4j +public class JsonUtils { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 值 + objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化 + } + + /** + * 初始化 objectMapper 属性 + *

+ * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean + * + * @param objectMapper ObjectMapper 对象 + */ + public static void init(ObjectMapper objectMapper) { + JsonUtils.objectMapper = objectMapper; + } + + @SneakyThrows + public static String toJsonString(Object object) { + return objectMapper.writeValueAsString(object); + } + + @SneakyThrows + public static byte[] toJsonByte(Object object) { + return objectMapper.writeValueAsBytes(object); + } + + @SneakyThrows + public static String toJsonPrettyString(Object object) { + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } + + public static T parseObject(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, String path, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + JsonNode treeNode = objectMapper.readTree(text); + JsonNode pathNode = treeNode.path(path); + return objectMapper.readValue(pathNode.toString(), clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Type type) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + /** + * 将字符串解析成指定类型的对象 + * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下, + * 如果 text 没有 class 属性,则会报错。此时,使用这个方法,可以解决。 + * + * @param text 字符串 + * @param clazz 类型 + * @return 对象 + */ + public static T parseObject2(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + return JSONUtil.toBean(text, clazz); + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return objectMapper.readValue(bytes, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", bytes, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + /** + * 解析 JSON 字符串成指定类型的对象,如果解析失败,则返回 null + * + * @param text 字符串 + * @param typeReference 类型引用 + * @return 指定类型的对象 + */ + public static T parseObjectQuietly(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + return null; + } + } + + public static List parseArray(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, String path, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + JsonNode treeNode = objectMapper.readTree(text); + JsonNode pathNode = treeNode.path(path); + return objectMapper.readValue(pathNode.toString(), objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(String text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(byte[] text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static boolean isJson(String text) { + return JSONUtil.isTypeJSON(text); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/NumberSerializer.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/NumberSerializer.java new file mode 100644 index 0000000..20244ba --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/NumberSerializer.java @@ -0,0 +1,37 @@ +package com.win.framework.common.util.json.databind; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; + +import java.io.IOException; + +/** + * Long 序列化规则 + * + * 会将超长 long 值转换为 string,解决前端 JavaScript 最大安全整数是 2^53-1 的问题 + * + * @author 星语 + */ +@JacksonStdImpl +public class NumberSerializer extends com.fasterxml.jackson.databind.ser.std.NumberSerializer { + + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + public static final NumberSerializer INSTANCE = new NumberSerializer(Number.class); + + public NumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, serializers); + } else { + gen.writeString(value.toString()); + } + } +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java new file mode 100644 index 0000000..a193618 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeDeserializer.java @@ -0,0 +1,27 @@ +package com.win.framework.common.util.json.databind; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * 基于时间戳的 LocalDateTime 反序列化器 + * + * @author 老五 + */ +public class TimestampLocalDateTimeDeserializer extends JsonDeserializer { + + public static final TimestampLocalDateTimeDeserializer INSTANCE = new TimestampLocalDateTimeDeserializer(); + + @Override + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + // 将 Long 时间戳,转换为 LocalDateTime 对象 + return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault()); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java new file mode 100644 index 0000000..d01f26c --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java @@ -0,0 +1,26 @@ +package com.win.framework.common.util.json.databind; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * 基于时间戳的 LocalDateTime 序列化器 + * + * @author 老五 + */ +public class TimestampLocalDateTimeSerializer extends JsonSerializer { + + public static final TimestampLocalDateTimeSerializer INSTANCE = new TimestampLocalDateTimeSerializer(); + + @Override + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // 将 LocalDateTime 对象,转换为 Long 时间戳 + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java new file mode 100644 index 0000000..62d1d72 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java @@ -0,0 +1,30 @@ +package com.win.framework.common.util.monitor; + +import org.apache.skywalking.apm.toolkit.trace.TraceContext; + +/** + * 链路追踪工具类 + * + * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 util 包下 + * + * @author 芋道源码 + */ +public class TracerUtils { + + /** + * 私有化构造方法 + */ + private TracerUtils() { + } + + /** + * 获得链路追踪编号,直接返回 SkyWalking 的 TraceId。 + * 如果不存在的话为空字符串!!! + * + * @return 链路追踪编号 + */ + public static String getTraceId() { + return TraceContext.traceId(); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java new file mode 100644 index 0000000..1969ba6 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java @@ -0,0 +1,131 @@ +package com.win.framework.common.util.number; + +import cn.hutool.core.math.Money; +import cn.hutool.core.util.NumberUtil; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 金额工具类 + * + * @author 芋道源码 + */ +public class MoneyUtils { + + /** + * 金额的小数位数 + */ + private static final int PRICE_SCALE = 2; + + /** + * 百分比对应的 BigDecimal 对象 + */ + public static final BigDecimal PERCENT_100 = BigDecimal.valueOf(100); + + /** + * 计算百分比金额,四舍五入 + * + * @param price 金额 + * @param rate 百分比,例如说 56.77% 则传入 56.77 + * @return 百分比金额 + */ + public static Integer calculateRatePrice(Integer price, Double rate) { + return calculateRatePrice(price, rate, 0, RoundingMode.HALF_UP).intValue(); + } + + /** + * 计算百分比金额,向下传入 + * + * @param price 金额 + * @param rate 百分比,例如说 56.77% 则传入 56.77 + * @return 百分比金额 + */ + public static Integer calculateRatePriceFloor(Integer price, Double rate) { + return calculateRatePrice(price, rate, 0, RoundingMode.FLOOR).intValue(); + } + + /** + * 计算百分比金额 + * + * @param price 金额(单位分) + * @param count 数量 + * @param percent 折扣(单位分),列如 60.2%,则传入 6020 + * @return 商品总价 + */ + public static Integer calculator(Integer price, Integer count, Integer percent) { + price = price * count; + if (percent == null) { + return price; + } + return MoneyUtils.calculateRatePriceFloor(price, (double) (percent / 100)); + } + + /** + * 计算百分比金额 + * + * @param price 金额 + * @param rate 百分比,例如说 56.77% 则传入 56.77 + * @param scale 保留小数位数 + * @param roundingMode 舍入模式 + */ + public static BigDecimal calculateRatePrice(Number price, Number rate, int scale, RoundingMode roundingMode) { + return NumberUtil.toBigDecimal(price).multiply(NumberUtil.toBigDecimal(rate)) // 乘以 + .divide(BigDecimal.valueOf(100), scale, roundingMode); // 除以 100 + } + + /** + * 分转元 + * + * @param fen 分 + * @return 元 + */ + public static BigDecimal fenToYuan(int fen) { + return new Money(0, fen).getAmount(); + } + + /** + * 分转元(字符串) + * + * 例如说 fen 为 1 时,则结果为 0.01 + * + * @param fen 分 + * @return 元 + */ + public static String fenToYuanStr(int fen) { + return new Money(0, fen).toString(); + } + + /** + * 金额相乘,默认进行四舍五入 + * + * 位数:{@link #PRICE_SCALE} + * + * @param price 金额 + * @param count 数量 + * @return 金额相乘结果 + */ + public static BigDecimal priceMultiply(BigDecimal price, BigDecimal count) { + if (price == null || count == null) { + return null; + } + return price.multiply(count).setScale(PRICE_SCALE, RoundingMode.HALF_UP); + } + + /** + * 金额相乘(百分比),默认进行四舍五入 + * + * 位数:{@link #PRICE_SCALE} + * + * @param price 金额 + * @param percent 百分比 + * @return 金额相乘结果 + */ + public static BigDecimal priceMultiplyPercent(BigDecimal price, BigDecimal percent) { + if (price == null || percent == null) { + return null; + } + return price.multiply(percent).divide(PERCENT_100, PRICE_SCALE, RoundingMode.HALF_UP); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java new file mode 100644 index 0000000..b806339 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java @@ -0,0 +1,64 @@ +package com.win.framework.common.util.number; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; + +import java.math.BigDecimal; + +/** + * 数字的工具类,补全 {@link cn.hutool.core.util.NumberUtil} 的功能 + * + * @author 芋道源码 + */ +public class NumberUtils { + + public static Long parseLong(String str) { + return StrUtil.isNotEmpty(str) ? Long.valueOf(str) : null; + } + + public static Integer parseInt(String str) { + return StrUtil.isNotEmpty(str) ? Integer.valueOf(str) : null; + } + + /** + * 通过经纬度获取地球上两点之间的距离 + * + * 参考 <DistanceUtil> 实现,目前它已经被 hutool 删除 + * + * @param lat1 经度1 + * @param lng1 纬度1 + * @param lat2 经度2 + * @param lng2 纬度2 + * @return 距离,单位:千米 + */ + public static double getDistance(double lat1, double lng1, double lat2, double lng2) { + double radLat1 = lat1 * Math.PI / 180.0; + double radLat2 = lat2 * Math.PI / 180.0; + double a = radLat1 - radLat2; + double b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0; + double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) + * Math.pow(Math.sin(b / 2), 2))); + distance = distance * 6378.137; + distance = Math.round(distance * 10000d) / 10000d; + return distance; + } + + /** + * 提供精确的乘法运算 + * + * 和 hutool {@link NumberUtil#mul(BigDecimal...)} 的差别是,如果存在 null,则返回 null + * + * @param values 多个被乘值 + * @return 积 + */ + public static BigDecimal mul(BigDecimal... values) { + for (BigDecimal value : values) { + if (value == null) { + return null; + } + } + return NumberUtil.mul(values); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/object/BeanUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/BeanUtils.java new file mode 100644 index 0000000..86bcf16 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/BeanUtils.java @@ -0,0 +1,69 @@ +package com.win.framework.common.util.object; + +import cn.hutool.core.bean.BeanUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; + +import java.util.List; +import java.util.function.Consumer; + +/** + * Bean 工具类 + * + * 1. 默认使用 {@link cn.hutool.core.bean.BeanUtil} 作为实现类,虽然不同 bean 工具的性能有差别,但是对绝大多数同学的项目,不用在意这点性能 + * 2. 针对复杂的对象转换,可以搜参考 AuthConvert 实现,通过 mapstruct + default 配合实现 + * + * @author 芋道源码 + */ +public class BeanUtils { + + public static T toBean(Object source, Class targetClass) { + return BeanUtil.toBean(source, targetClass); + } + + public static T toBean(Object source, Class targetClass, Consumer peek) { + T target = toBean(source, targetClass); + if (target != null) { + peek.accept(target); + } + return target; + } + + public static List toBean(List source, Class targetType) { + if (source == null) { + return null; + } + return CollectionUtils.convertList(source, s -> toBean(s, targetType)); + } + + public static List toBean(List source, Class targetType, Consumer peek) { + List list = toBean(source, targetType); + if (list != null) { + list.forEach(peek); + } + return list; + } + + public static PageResult toBean(PageResult source, Class targetType) { + return toBean(source, targetType, null); + } + + public static PageResult toBean(PageResult source, Class targetType, Consumer peek) { + if (source == null) { + return null; + } + List list = toBean(source.getList(), targetType); + if (peek != null) { + list.forEach(peek); + } + return new PageResult<>(list, source.getTotal()); + } + + public static void copyProperties(Object source, Object target) { + if (source == null || target == null) { + return; + } + BeanUtil.copyProperties(source, target, false); + } + +} \ No newline at end of file diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java new file mode 100644 index 0000000..730e62a --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java @@ -0,0 +1,63 @@ +package com.win.framework.common.util.object; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.function.Consumer; + +/** + * Object 工具类 + * + * @author 芋道源码 + */ +public class ObjectUtils { + + /** + * 复制对象,并忽略 Id 编号 + * + * @param object 被复制对象 + * @param consumer 消费者,可以二次编辑被复制对象 + * @return 复制后的对象 + */ + public static T cloneIgnoreId(T object, Consumer consumer) { + T result = ObjectUtil.clone(object); + // 忽略 id 编号 + Field field = ReflectUtil.getField(object.getClass(), "id"); + if (field != null) { + ReflectUtil.setFieldValue(result, field, null); + } + // 二次编辑 + if (result != null) { + consumer.accept(result); + } + return result; + } + + public static > T max(T obj1, T obj2) { + if (obj1 == null) { + return obj2; + } + if (obj2 == null) { + return obj1; + } + return obj1.compareTo(obj2) > 0 ? obj1 : obj2; + } + + @SafeVarargs + public static T defaultIfNull(T... array) { + for (T item : array) { + if (item != null) { + return item; + } + } + return null; + } + + @SafeVarargs + public static boolean equalsAny(T obj, T... array) { + return Arrays.asList(array).contains(obj); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java new file mode 100644 index 0000000..835c522 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java @@ -0,0 +1,67 @@ +package com.win.framework.common.util.object; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.lang.func.LambdaUtil; +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.SortablePageParam; +import com.win.framework.common.pojo.SortingField; +import org.springframework.util.Assert; + +import static java.util.Collections.singletonList; + +/** + * {@link com.win.framework.common.pojo.PageParam} 工具类 + * + * @author 芋道源码 + */ +public class PageUtils { + + private static final Object[] ORDER_TYPES = new String[]{SortingField.ORDER_ASC, SortingField.ORDER_DESC}; + + public static int getStart(PageParam pageParam) { + return (pageParam.getPageNo() - 1) * pageParam.getPageSize(); + } + + /** + * 构建排序字段(默认倒序) + * + * @param func 排序字段的 Lambda 表达式 + * @param 排序字段所属的类型 + * @return 排序字段 + */ + public static SortingField buildSortingField(Func1 func) { + return buildSortingField(func, SortingField.ORDER_DESC); + } + + /** + * 构建排序字段 + * + * @param func 排序字段的 Lambda 表达式 + * @param order 排序类型 {@link SortingField#ORDER_ASC} {@link SortingField#ORDER_DESC} + * @param 排序字段所属的类型 + * @return 排序字段 + */ + public static SortingField buildSortingField(Func1 func, String order) { + Assert.isTrue(ArrayUtil.contains(ORDER_TYPES, order), String.format("字段的排序类型只能是 %s/%s", ORDER_TYPES)); + + String fieldName = LambdaUtil.getFieldName(func); + return new SortingField(fieldName, order); + } + + /** + * 构建默认的排序字段 + * 如果排序字段为空,则设置排序字段;否则忽略 + * + * @param sortablePageParam 排序分页查询参数 + * @param func 排序字段的 Lambda 表达式 + * @param 排序字段所属的类型 + */ + public static void buildDefaultSortingField(SortablePageParam sortablePageParam, Func1 func) { + if (sortablePageParam != null && CollUtil.isEmpty(sortablePageParam.getSortingFields())) { + sortablePageParam.setSortingFields(singletonList(buildSortingField(func))); + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/package-info.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/package-info.java new file mode 100644 index 0000000..f9b8af7 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/package-info.java @@ -0,0 +1,7 @@ +/** + * 对于工具类的选择,优先查找 Hutool 中有没对应的方法 + * 如果没有,则自己封装对应的工具类,以 Utils 结尾,用于区分 + * + * ps:如果担心 Hutool 存在坑的问题,可以阅读 Hutool 的实现源码,以确保可靠性。并且,可以补充相关的单元测试。 + */ +package com.win.framework.common.util; diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java new file mode 100644 index 0000000..d6c26a9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java @@ -0,0 +1,101 @@ +package com.win.framework.common.util.servlet; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.win.framework.common.util.json.JsonUtils; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.MediaType; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.Map; + +/** + * 客户端工具类 + * + * @author 芋道源码 + */ +public class ServletUtils { + + /** + * 返回 JSON 字符串 + * + * @param response 响应 + * @param object 对象,会序列化成 JSON 字符串 + */ + @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码 + public static void writeJSON(HttpServletResponse response, Object object) { + String content = JsonUtils.toJsonString(object); + JakartaServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE); + } + + /** + * @param request 请求 + * @return ua + */ + public static String getUserAgent(HttpServletRequest request) { + String ua = request.getHeader("User-Agent"); + return ua != null ? ua : ""; + } + + /** + * 获得请求 + * + * @return HttpServletRequest + */ + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + + public static String getUserAgent() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return getUserAgent(request); + } + + public static String getClientIP() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return JakartaServletUtil.getClientIP(request); + } + + public static boolean isJsonRequest(ServletRequest request) { + return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE); + } + + public static String getBody(HttpServletRequest request) { + // 只有在 json 请求在读取,因为只有 CacheRequestBodyFilter 才会进行缓存,支持重复读取 + if (isJsonRequest(request)) { + return JakartaServletUtil.getBody(request); + } + return null; + } + + public static byte[] getBodyBytes(HttpServletRequest request) { + // 只有在 json 请求在读取,因为只有 CacheRequestBodyFilter 才会进行缓存,支持重复读取 + if (isJsonRequest(request)) { + return JakartaServletUtil.getBodyBytes(request); + } + return null; + } + + public static String getClientIP(HttpServletRequest request) { + return JakartaServletUtil.getClientIP(request); + } + + public static Map getParamMap(HttpServletRequest request) { + return JakartaServletUtil.getParamMap(request); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java new file mode 100644 index 0000000..a8f8b53 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java @@ -0,0 +1,109 @@ +package com.win.framework.common.util.spring; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Spring EL 表达式的工具类 + * + * @author mashu + */ +public class SpringExpressionUtils { + + /** + * Spring EL 表达式解析器 + */ + private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(); + /** + * 参数名发现器 + */ + private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); + + private SpringExpressionUtils() { + } + + /** + * 从切面中,单个解析 EL 表达式的结果 + * + * @param joinPoint 切面点 + * @param expressionString EL 表达式数组 + * @return 执行界面 + */ + public static Object parseExpression(JoinPoint joinPoint, String expressionString) { + Map result = parseExpressions(joinPoint, Collections.singletonList(expressionString)); + return result.get(expressionString); + } + + /** + * 从切面中,批量解析 EL 表达式的结果 + * + * @param joinPoint 切面点 + * @param expressionStrings EL 表达式数组 + * @return 结果,key 为表达式,value 为对应值 + */ + public static Map parseExpressions(JoinPoint joinPoint, List expressionStrings) { + // 如果为空,则不进行解析 + if (CollUtil.isEmpty(expressionStrings)) { + return MapUtil.newHashMap(); + } + + // 第一步,构建解析的上下文 EvaluationContext + // 通过 joinPoint 获取被注解方法 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组 + String[] paramNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method); + // Spring 的表达式上下文对象 + EvaluationContext context = new StandardEvaluationContext(); + // 给上下文赋值 + if (ArrayUtil.isNotEmpty(paramNames)) { + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < paramNames.length; i++) { + context.setVariable(paramNames[i], args[i]); + } + } + + // 第二步,逐个参数解析 + Map result = MapUtil.newHashMap(expressionStrings.size(), true); + expressionStrings.forEach(key -> { + Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context); + result.put(key, value); + }); + return result; + } + + /** + * 从 Bean 工厂,解析 EL 表达式的结果 + * + * @param expressionString EL 表达式 + * @return 执行界面 + */ + public static Object parseExpression(String expressionString) { + if (StrUtil.isBlank(expressionString)) { + return null; + } + Expression expression = EXPRESSION_PARSER.parseExpression(expressionString); + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setBeanResolver(new BeanFactoryResolver(SpringUtil.getApplicationContext())); + return expression.getValue(context); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringUtils.java new file mode 100644 index 0000000..5440746 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringUtils.java @@ -0,0 +1,24 @@ +package com.win.framework.common.util.spring; + +import cn.hutool.extra.spring.SpringUtil; + +import java.util.Objects; + +/** + * Spring 工具类 + * + * @author 芋道源码 + */ +public class SpringUtils extends SpringUtil { + + /** + * 是否为生产环境 + * + * @return 是否生产环境 + */ + public static boolean isProd() { + String activeProfile = getActiveProfile(); + return Objects.equals("prod", activeProfile); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java new file mode 100644 index 0000000..c88c8e9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java @@ -0,0 +1,80 @@ +package com.win.framework.common.util.string; + +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 字符串工具类 + * + * @author 芋道源码 + */ +public class StrUtils { + + public static String maxLength(CharSequence str, int maxLength) { + return StrUtil.maxLength(str, maxLength - 3); // -3 的原因,是该方法会补充 ... 恰好 + } + + /** + * 给定字符串是否以任何一个字符串开始 + * 给定字符串和数组为空都返回 false + * + * @param str 给定字符串 + * @param prefixes 需要检测的开始字符串 + * @since 3.0.6 + */ + public static boolean startWithAny(String str, Collection prefixes) { + if (StrUtil.isEmpty(str) || ArrayUtil.isEmpty(prefixes)) { + return false; + } + + for (CharSequence suffix : prefixes) { + if (StrUtil.startWith(str, suffix, false)) { + return true; + } + } + return false; + } + + public static List splitToLong(String value, CharSequence separator) { + long[] longs = StrUtil.splitToLong(value, separator); + return Arrays.stream(longs).boxed().collect(Collectors.toList()); + } + + public static Set splitToLongSet(String value) { + return splitToLongSet(value, StrPool.COMMA); + } + + public static Set splitToLongSet(String value, CharSequence separator) { + long[] longs = StrUtil.splitToLong(value, separator); + return Arrays.stream(longs).boxed().collect(Collectors.toSet()); + } + + public static List splitToInteger(String value, CharSequence separator) { + int[] integers = StrUtil.splitToInt(value, separator); + return Arrays.stream(integers).boxed().collect(Collectors.toList()); + } + + /** + * 移除字符串中,包含指定字符串的行 + * + * @param content 字符串 + * @param sequence 包含的字符串 + * @return 移除后的字符串 + */ + public static String removeLineContains(String content, String sequence) { + if (StrUtil.isEmpty(content) || StrUtil.isEmpty(sequence)) { + return content; + } + return Arrays.stream(content.split("\n")) + .filter(line -> !line.contains(sequence)) + .collect(Collectors.joining("\n")); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java new file mode 100644 index 0000000..56a3d0c --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java @@ -0,0 +1,55 @@ +package com.win.framework.common.util.validation; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import org.springframework.util.StringUtils; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * 校验工具类 + * + * @author 芋道源码 + */ +public class ValidationUtils { + + private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$"); + + private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"); + + private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*"); + + public static boolean isMobile(String mobile) { + return StringUtils.hasText(mobile) + && PATTERN_MOBILE.matcher(mobile).matches(); + } + + public static boolean isURL(String url) { + return StringUtils.hasText(url) + && PATTERN_URL.matcher(url).matches(); + } + + public static boolean isXmlNCName(String str) { + return StringUtils.hasText(str) + && PATTERN_XML_NCNAME.matcher(str).matches(); + } + + public static void validate(Object object, Class... groups) { + Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + Assert.notNull(validator); + validate(validator, object, groups); + } + + public static void validate(Validator validator, Object object, Class... groups) { + Set> constraintViolations = validator.validate(object, groups); + if (CollUtil.isNotEmpty(constraintViolations)) { + throw new ConstraintViolationException(constraintViolations); + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java new file mode 100644 index 0000000..abd2934 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java @@ -0,0 +1,35 @@ +package com.win.framework.common.validation; + +import com.win.framework.common.core.IntArrayValuable; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = {InEnumValidator.class, InEnumCollectionValidator.class} +) +public @interface InEnum { + + /** + * @return 实现 EnumValuable 接口的 + */ + Class value(); + + String message() default "必须在指定范围 {value}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java new file mode 100644 index 0000000..d7d86cd --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java @@ -0,0 +1,42 @@ +package com.win.framework.common.validation; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.core.IntArrayValuable; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class InEnumCollectionValidator implements ConstraintValidator> { + + private List values; + + @Override + public void initialize(InEnum annotation) { + IntArrayValuable[] values = annotation.value().getEnumConstants(); + if (values.length == 0) { + this.values = Collections.emptyList(); + } else { + this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + } + } + + @Override + public boolean isValid(Collection list, ConstraintValidatorContext context) { + // 校验通过 + if (CollUtil.containsAll(values, list)) { + return true; + } + // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() + .replaceAll("\\{value}", CollUtil.join(list, ","))).addConstraintViolation(); // 重新添加错误提示语句 + return false; + } + +} + diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java new file mode 100644 index 0000000..f922d80 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java @@ -0,0 +1,44 @@ +package com.win.framework.common.validation; + +import com.win.framework.common.core.IntArrayValuable; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class InEnumValidator implements ConstraintValidator { + + private List values; + + @Override + public void initialize(InEnum annotation) { + IntArrayValuable[] values = annotation.value().getEnumConstants(); + if (values.length == 0) { + this.values = Collections.emptyList(); + } else { + this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + } + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + // 为空时,默认不校验,即认为通过 + if (value == null) { + return true; + } + // 校验通过 + if (values.contains(value)) { + return true; + } + // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() + .replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误提示语句 + return false; + } + +} + diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java new file mode 100644 index 0000000..4512825 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java @@ -0,0 +1,28 @@ +package com.win.framework.common.validation; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = MobileValidator.class +) +public @interface Mobile { + + String message() default "手机号格式不正确"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java new file mode 100644 index 0000000..684be37 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java @@ -0,0 +1,25 @@ +package com.win.framework.common.validation; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.validation.ValidationUtils; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +public class MobileValidator implements ConstraintValidator { + + @Override + public void initialize(Mobile annotation) { + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + // 如果手机号为空,默认不校验,即校验通过 + if (StrUtil.isEmpty(value)) { + return true; + } + // 校验手机 + return ValidationUtils.isMobile(value); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/Telephone.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/Telephone.java new file mode 100644 index 0000000..a8fc0df --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/Telephone.java @@ -0,0 +1,28 @@ +package com.win.framework.common.validation; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = TelephoneValidator.class +) +public @interface Telephone { + + String message() default "电话格式不正确"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/TelephoneValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/TelephoneValidator.java new file mode 100644 index 0000000..30f7d5f --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/TelephoneValidator.java @@ -0,0 +1,25 @@ +package com.win.framework.common.validation; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.PhoneUtil; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +public class TelephoneValidator implements ConstraintValidator { + + @Override + public void initialize(Telephone annotation) { + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + // 如果手机号为空,默认不校验,即校验通过 + if (CharSequenceUtil.isEmpty(value)) { + return true; + } + // 校验手机 + return PhoneUtil.isTel(value) || PhoneUtil.isPhone(value); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java new file mode 100644 index 0000000..488269f --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Hibernate Validator 实现参数校验 + */ +package com.win.framework.common.validation; diff --git a/win-framework/win-common/《芋道 Spring Boot 参数校验 Validation 入门》.md b/win-framework/win-common/《芋道 Spring Boot 参数校验 Validation 入门》.md new file mode 100644 index 0000000..6067d8f --- /dev/null +++ b/win-framework/win-common/《芋道 Spring Boot 参数校验 Validation 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/pom.xml b/win-framework/win-spring-boot-starter-biz-data-permission/pom.xml new file mode 100644 index 0000000..dcff0d5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/pom.xml @@ -0,0 +1,46 @@ + + + + win-framework + com.win + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-data-permission + jar + + ${project.artifactId} + 数据权限 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-security + true + + + + + com.win + win-spring-boot-starter-mybatis + + + + + com.win + win-module-system-api + ${revision} + + + + + diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java new file mode 100644 index 0000000..abd7d4b --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java @@ -0,0 +1,46 @@ +package com.win.framework.datapermission.config; + +import com.win.framework.datapermission.core.aop.DataPermissionAnnotationAdvisor; +import com.win.framework.datapermission.core.db.DataPermissionRuleHandler; +import com.win.framework.datapermission.core.rule.DataPermissionRule; +import com.win.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.win.framework.datapermission.core.rule.DataPermissionRuleFactoryImpl; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.util.List; + +/** + * 数据权限的自动配置类 + * + * @author 芋道源码 + */ +@AutoConfiguration +public class WinDataPermissionAutoConfiguration { + + @Bean + public DataPermissionRuleFactory dataPermissionRuleFactory(List rules) { + return new DataPermissionRuleFactoryImpl(rules); + } + + @Bean + public DataPermissionRuleHandler dataPermissionRuleHandler(MybatisPlusInterceptor interceptor, + DataPermissionRuleFactory ruleFactory) { + // 创建 DataPermissionInterceptor 拦截器 + DataPermissionRuleHandler handler = new DataPermissionRuleHandler(ruleFactory); + DataPermissionInterceptor inner = new DataPermissionInterceptor(handler); + // 添加到 interceptor 中 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定 + MyBatisUtils.addInterceptor(interceptor, inner, 0); + return handler; + } + + @Bean + public DataPermissionAnnotationAdvisor dataPermissionAnnotationAdvisor() { + return new DataPermissionAnnotationAdvisor(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java new file mode 100644 index 0000000..299f868 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java @@ -0,0 +1,34 @@ +package com.win.framework.datapermission.config; + +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer; +import com.win.framework.security.core.LoginUser; +import com.win.module.system.api.permission.PermissionApi; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; + +import java.util.List; + +/** + * 基于部门的数据权限 AutoConfiguration + * + * @author 芋道源码 + */ +@AutoConfiguration +@ConditionalOnClass(LoginUser.class) +@ConditionalOnBean(value = {PermissionApi.class, DeptDataPermissionRuleCustomizer.class}) +public class WinDeptDataPermissionAutoConfiguration { + + @Bean + public DeptDataPermissionRule deptDataPermissionRule(PermissionApi permissionApi, + List customizers) { + // 创建 DeptDataPermissionRule 对象 + DeptDataPermissionRule rule = new DeptDataPermissionRule(permissionApi); + // 补全表配置 + customizers.forEach(customizer -> customizer.customize(rule)); + return rule; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java new file mode 100644 index 0000000..e796a52 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java @@ -0,0 +1,35 @@ +package com.win.framework.datapermission.core.annotation; + +import com.win.framework.datapermission.core.rule.DataPermissionRule; + +import java.lang.annotation.*; + +/** + * 数据权限注解 + * 可声明在类或者方法上,标识使用的数据权限规则 + * + * @author 芋道源码 + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + /** + * 当前类或方法是否开启数据权限 + * 即使不添加 @DataPermission 注解,默认是开启状态 + * 可通过设置 enable 为 false 禁用 + */ + boolean enable() default true; + + /** + * 生效的数据权限规则数组,优先级高于 {@link #excludeRules()} + */ + Class[] includeRules() default {}; + + /** + * 排除的数据权限规则数组,优先级最低 + */ + Class[] excludeRules() default {}; + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java new file mode 100644 index 0000000..2fd821a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java @@ -0,0 +1,36 @@ +package com.win.framework.datapermission.core.aop; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import org.aopalliance.aop.Advice; +import org.springframework.aop.Pointcut; +import org.springframework.aop.support.AbstractPointcutAdvisor; +import org.springframework.aop.support.ComposablePointcut; +import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; + +/** + * {@link com.win.framework.datapermission.core.annotation.DataPermission} 注解的 Advisor 实现类 + * + * @author 芋道源码 + */ +@Getter +@EqualsAndHashCode(callSuper = true) +public class DataPermissionAnnotationAdvisor extends AbstractPointcutAdvisor { + + private final Advice advice; + + private final Pointcut pointcut; + + public DataPermissionAnnotationAdvisor() { + this.advice = new DataPermissionAnnotationInterceptor(); + this.pointcut = this.buildPointcut(); + } + + protected Pointcut buildPointcut() { + Pointcut classPointcut = new AnnotationMatchingPointcut(DataPermission.class, true); + Pointcut methodPointcut = new AnnotationMatchingPointcut(null, DataPermission.class, true); + return new ComposablePointcut(classPointcut).union(methodPointcut); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java new file mode 100644 index 0000000..03cebca --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java @@ -0,0 +1,72 @@ +package com.win.framework.datapermission.core.aop; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import lombok.Getter; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.springframework.core.MethodClassKey; +import org.springframework.core.annotation.AnnotationUtils; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * {@link DataPermission} 注解的拦截器 + * 1. 在执行方法前,将 @DataPermission 注解入栈 + * 2. 在执行方法后,将 @DataPermission 注解出栈 + * + * @author 芋道源码 + */ +@DataPermission // 该注解,用于 {@link DATA_PERMISSION_NULL} 的空对象 +public class DataPermissionAnnotationInterceptor implements MethodInterceptor { + + /** + * DataPermission 空对象,用于方法无 {@link DataPermission} 注解时,使用 DATA_PERMISSION_NULL 进行占位 + */ + static final DataPermission DATA_PERMISSION_NULL = DataPermissionAnnotationInterceptor.class.getAnnotation(DataPermission.class); + + @Getter + private final Map dataPermissionCache = new ConcurrentHashMap<>(); + + @Override + public Object invoke(MethodInvocation methodInvocation) throws Throwable { + // 入栈 + DataPermission dataPermission = this.findAnnotation(methodInvocation); + if (dataPermission != null) { + DataPermissionContextHolder.add(dataPermission); + } + try { + // 执行逻辑 + return methodInvocation.proceed(); + } finally { + // 出栈 + if (dataPermission != null) { + DataPermissionContextHolder.remove(); + } + } + } + + private DataPermission findAnnotation(MethodInvocation methodInvocation) { + // 1. 从缓存中获取 + Method method = methodInvocation.getMethod(); + Object targetObject = methodInvocation.getThis(); + Class clazz = targetObject != null ? targetObject.getClass() : method.getDeclaringClass(); + MethodClassKey methodClassKey = new MethodClassKey(method, clazz); + DataPermission dataPermission = dataPermissionCache.get(methodClassKey); + if (dataPermission != null) { + return dataPermission != DATA_PERMISSION_NULL ? dataPermission : null; + } + + // 2.1 从方法中获取 + dataPermission = AnnotationUtils.findAnnotation(method, DataPermission.class); + // 2.2 从类上获取 + if (dataPermission == null) { + dataPermission = AnnotationUtils.findAnnotation(clazz, DataPermission.class); + } + // 2.3 添加到缓存中 + dataPermissionCache.put(methodClassKey, dataPermission != null ? dataPermission : DATA_PERMISSION_NULL); + return dataPermission; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java new file mode 100644 index 0000000..6ae7ab2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java @@ -0,0 +1,72 @@ +package com.win.framework.datapermission.core.aop; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.alibaba.ttl.TransmittableThreadLocal; + +import java.util.LinkedList; +import java.util.List; + +/** + * {@link DataPermission} 注解的 Context 上下文 + * + * @author 芋道源码 + */ +public class DataPermissionContextHolder { + + /** + * 使用 List 的原因,可能存在方法的嵌套调用 + */ + private static final ThreadLocal> DATA_PERMISSIONS = + TransmittableThreadLocal.withInitial(LinkedList::new); + + /** + * 获得当前的 DataPermission 注解 + * + * @return DataPermission 注解 + */ + public static DataPermission get() { + return DATA_PERMISSIONS.get().peekLast(); + } + + /** + * 入栈 DataPermission 注解 + * + * @param dataPermission DataPermission 注解 + */ + public static void add(DataPermission dataPermission) { + DATA_PERMISSIONS.get().addLast(dataPermission); + } + + /** + * 出栈 DataPermission 注解 + * + * @return DataPermission 注解 + */ + public static DataPermission remove() { + DataPermission dataPermission = DATA_PERMISSIONS.get().removeLast(); + // 无元素时,清空 ThreadLocal + if (DATA_PERMISSIONS.get().isEmpty()) { + DATA_PERMISSIONS.remove(); + } + return dataPermission; + } + + /** + * 获得所有 DataPermission + * + * @return DataPermission 队列 + */ + public static List getAll() { + return DATA_PERMISSIONS.get(); + } + + /** + * 清空上下文 + * + * 目前仅仅用于单测 + */ + public static void clear() { + DATA_PERMISSIONS.remove(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionRuleHandler.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionRuleHandler.java new file mode 100644 index 0000000..3efe449 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionRuleHandler.java @@ -0,0 +1,57 @@ +package com.win.framework.datapermission.core.db; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.datapermission.core.rule.DataPermissionRule; +import com.win.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler; +import lombok.RequiredArgsConstructor; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.schema.Table; + +import java.util.List; + +/** + * 基于 {@link DataPermissionRule} 的数据权限处理器 + * + * 它的底层,是基于 MyBatis Plus 的 数据权限插件 + * 核心原理:它会在 SQL 执行前拦截 SQL 语句,并根据用户权限动态添加权限相关的 SQL 片段。这样,只有用户有权限访问的数据才会被查询出来 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class DataPermissionRuleHandler implements MultiDataPermissionHandler { + + private final DataPermissionRuleFactory ruleFactory; + + @Override + public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) { + // 获得 Mapper 对应的数据权限的规则 + List rules = ruleFactory.getDataPermissionRule(mappedStatementId); + if (CollUtil.isEmpty(rules)) { + return null; + } + + // 生成条件 + Expression allExpression = null; + for (DataPermissionRule rule : rules) { + // 判断表名是否匹配 + String tableName = MyBatisUtils.getTableName(table); + if (!rule.getTableNames().contains(tableName)) { + continue; + } + + // 单条规则的条件 + Expression oneExpress = rule.getExpression(tableName, table.getAlias()); + if (oneExpress == null) { + continue; + } + // 拼接到 allExpression 中 + allExpression = allExpression == null ? oneExpress + : new AndExpression(allExpression, oneExpress); + } + return allExpression; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java new file mode 100644 index 0000000..83efe1c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java @@ -0,0 +1,36 @@ +package com.win.framework.datapermission.core.rule; + +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; + +import java.util.Set; + +/** + * 数据权限规则接口 + * 通过实现接口,自定义数据规则。例如说, + * + * @author 芋道源码 + */ +public interface DataPermissionRule { + + /** + * 返回需要生效的表名数组 + * 为什么需要该方法?Data Permission 数组基于 SQL 重写,通过 Where 返回只有权限的数据 + * + * 如果需要基于实体名获得表名,可调用 {@link TableInfoHelper#getTableInfo(Class)} 获得 + * + * @return 表名数组 + */ + Set getTableNames(); + + /** + * 根据表名和别名,生成对应的 WHERE / OR 过滤条件 + * + * @param tableName 表名 + * @param tableAlias 别名,可能为空 + * @return 过滤条件 Expression 表达式 + */ + Expression getExpression(String tableName, Alias tableAlias); + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java new file mode 100644 index 0000000..88b9094 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java @@ -0,0 +1,28 @@ +package com.win.framework.datapermission.core.rule; + +import java.util.List; + +/** + * {@link DataPermissionRule} 工厂接口 + * 作为 {@link DataPermissionRule} 的容器,提供管理能力 + * + * @author 芋道源码 + */ +public interface DataPermissionRuleFactory { + + /** + * 获得所有数据权限规则数组 + * + * @return 数据权限规则数组 + */ + List getDataPermissionRules(); + + /** + * 获得指定 Mapper 的数据权限规则数组 + * + * @param mappedStatementId 指定 Mapper 的编号 + * @return 数据权限规则数组 + */ + List getDataPermissionRule(String mappedStatementId); + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java new file mode 100644 index 0000000..1e1e703 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java @@ -0,0 +1,62 @@ +package com.win.framework.datapermission.core.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.datapermission.core.aop.DataPermissionContextHolder; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 默认的 DataPermissionRuleFactoryImpl 实现类 + * 支持通过 {@link DataPermissionContextHolder} 过滤数据权限 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory { + + /** + * 数据权限规则数组 + */ + private final List rules; + + @Override + public List getDataPermissionRules() { + return rules; + } + + @Override // mappedStatementId 参数,暂时没有用。以后,可以基于 mappedStatementId + DataPermission 进行缓存 + public List getDataPermissionRule(String mappedStatementId) { + // 1. 无数据权限 + if (CollUtil.isEmpty(rules)) { + return Collections.emptyList(); + } + // 2. 未配置,则默认开启 + DataPermission dataPermission = DataPermissionContextHolder.get(); + if (dataPermission == null) { + return rules; + } + // 3. 已配置,但禁用 + if (!dataPermission.enable()) { + return Collections.emptyList(); + } + + // 4. 已配置,只选择部分规则 + if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) { + return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass())) + .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 + } + // 5. 已配置,只排除部分规则 + if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) { + return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass())) + .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 + } + // 6. 已配置,全部规则 + return rules; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java new file mode 100644 index 0000000..4cdf9c9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java @@ -0,0 +1,207 @@ +package com.win.framework.datapermission.core.rule.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.datapermission.core.rule.DataPermissionRule; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * 基于部门的 {@link DataPermissionRule} 数据权限规则实现 + * + * 注意,使用 DeptDataPermissionRule 时,需要保证表中有 dept_id 部门编号的字段,可自定义。 + * + * 实际业务场景下,会存在一个经典的问题?当用户修改部门时,冗余的 dept_id 是否需要修改? + * 1. 一般情况下,dept_id 不进行修改,则会导致用户看不到之前的数据。【win-server 采用该方案】 + * 2. 部分情况下,希望该用户还是能看到之前的数据,则有两种方式解决:【需要你改造该 DeptDataPermissionRule 的实现代码】 + * 1)编写洗数据的脚本,将 dept_id 修改成新部门的编号;【建议】 + * 最终过滤条件是 WHERE dept_id = ? + * 2)洗数据的话,可能涉及的数据量较大,也可以采用 user_id 进行过滤的方式,此时需要获取到 dept_id 对应的所有 user_id 用户编号; + * 最终过滤条件是 WHERE user_id IN (?, ?, ? ...) + * 3)想要保证原 dept_id 和 user_id 都可以看的到,此时使用 dept_id 和 user_id 一起过滤; + * 最终过滤条件是 WHERE dept_id = ? OR user_id IN (?, ?, ? ...) + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Slf4j +public class DeptDataPermissionRule implements DataPermissionRule { + + /** + * LoginUser 的 Context 缓存 Key + */ + protected static final String CONTEXT_KEY = DeptDataPermissionRule.class.getSimpleName(); + + private static final String DEPT_COLUMN_NAME = "dept_id"; + private static final String USER_COLUMN_NAME = "user_id"; + + static final Expression EXPRESSION_NULL = new NullValue(); + + private final PermissionApi permissionApi; + + /** + * 基于部门的表字段配置 + * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 + * + * key:表名 + * value:字段名 + */ + private final Map deptColumns = new HashMap<>(); + /** + * 基于用户的表字段配置 + * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 + * + * key:表名 + * value:字段名 + */ + private final Map userColumns = new HashMap<>(); + /** + * 所有表名,是 {@link #deptColumns} 和 {@link #userColumns} 的合集 + */ + private final Set TABLE_NAMES = new HashSet<>(); + + @Override + public Set getTableNames() { + return TABLE_NAMES; + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + // 只有有登陆用户的情况下,才进行数据权限的处理 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) { + return null; + } + // 只有管理员类型的用户,才进行数据权限的处理 + if (ObjectUtil.notEqual(loginUser.getUserType(), UserTypeEnum.ADMIN.getValue())) { + return null; + } + + // 获得数据权限 + DeptDataPermissionRespDTO deptDataPermission = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class); + // 从上下文中拿不到,则调用逻辑进行获取 + if (deptDataPermission == null) { + deptDataPermission = permissionApi.getDeptDataPermission(loginUser.getId()); + if (deptDataPermission == null) { + log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser)); + throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限", + loginUser.getId(), tableName, tableAlias.getName())); + } + // 添加到上下文中,避免重复计算 + loginUser.setContext(CONTEXT_KEY, deptDataPermission); + } + + // 情况一,如果是 ALL 可查看全部,则无需拼接条件 + if (deptDataPermission.getAll()) { + return null; + } + + // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限 + if (CollUtil.isEmpty(deptDataPermission.getDeptIds()) + && Boolean.FALSE.equals(deptDataPermission.getSelf())) { + return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空 + } + + // 情况三,拼接 Dept 和 User 的条件,最后组合 + Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds()); + Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId()); + if (deptExpression == null && userExpression == null) { + // TODO 芋艿:获得不到条件的时候,暂时不抛出异常,而是不返回数据 + log.warn("[getExpression][LoginUser({}) Table({}/{}) DeptDataPermission({}) 构建的条件为空]", + JsonUtils.toJsonString(loginUser), tableName, tableAlias, JsonUtils.toJsonString(deptDataPermission)); +// throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 构建的条件为空", +// loginUser.getId(), tableName, tableAlias.getName())); + return EXPRESSION_NULL; + } + if (deptExpression == null) { + return userExpression; + } + if (userExpression == null) { + return deptExpression; + } + // 目前,如果有指定部门 + 可查看自己,采用 OR 条件。即,WHERE (dept_id IN ? OR user_id = ?) + return new ParenthesedExpressionList(new OrExpression(deptExpression, userExpression)); + } + + private Expression buildDeptExpression(String tableName, Alias tableAlias, Set deptIds) { + // 如果不存在配置,则无需作为条件 + String columnName = deptColumns.get(tableName); + if (StrUtil.isEmpty(columnName)) { + return null; + } + // 如果为空,则无条件 + if (CollUtil.isEmpty(deptIds)) { + return null; + } + // 拼接条件 + return new InExpression(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), + // Parenthesis 的目的,是提供 (1,2,3) 的 () 左右括号 + new ParenthesedExpressionList(new ExpressionList(CollectionUtils.convertList(deptIds, LongValue::new)))); + } + + private Expression buildUserExpression(String tableName, Alias tableAlias, Boolean self, Long userId) { + // 如果不查看自己,则无需作为条件 + if (Boolean.FALSE.equals(self)) { + return null; + } + String columnName = userColumns.get(tableName); + if (StrUtil.isEmpty(columnName)) { + return null; + } + // 拼接条件 + return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), new LongValue(userId)); + } + + // ==================== 添加配置 ==================== + + public void addDeptColumn(Class entityClass) { + addDeptColumn(entityClass, DEPT_COLUMN_NAME); + } + + public void addDeptColumn(Class entityClass, String columnName) { + String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); + addDeptColumn(tableName, columnName); + } + + public void addDeptColumn(String tableName, String columnName) { + deptColumns.put(tableName, columnName); + TABLE_NAMES.add(tableName); + } + + public void addUserColumn(Class entityClass) { + addUserColumn(entityClass, USER_COLUMN_NAME); + } + + public void addUserColumn(Class entityClass, String columnName) { + String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); + addUserColumn(tableName, columnName); + } + + public void addUserColumn(String tableName, String columnName) { + userColumns.put(tableName, columnName); + TABLE_NAMES.add(tableName); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java new file mode 100644 index 0000000..ae4ca72 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java @@ -0,0 +1,20 @@ +package com.win.framework.datapermission.core.rule.dept; + +/** + * {@link DeptDataPermissionRule} 的自定义配置接口 + * + * @author 芋道源码 + */ +@FunctionalInterface +public interface DeptDataPermissionRuleCustomizer { + + /** + * 自定义该权限规则 + * 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则 + * 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则 + * + * @param rule 权限规则 + */ + void customize(DeptDataPermissionRule rule); + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java new file mode 100644 index 0000000..f372520 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java @@ -0,0 +1,6 @@ +/** + * 基于部门的数据权限规则 + * + * @author 芋道源码 + */ +package com.win.framework.datapermission.core.rule.dept; diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java new file mode 100644 index 0000000..3511967 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java @@ -0,0 +1,63 @@ +package com.win.framework.datapermission.core.util; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.datapermission.core.aop.DataPermissionContextHolder; +import lombok.SneakyThrows; + +import java.util.concurrent.Callable; + +/** + * 数据权限 Util + * + * @author 芋道源码 + */ +public class DataPermissionUtils { + + private static DataPermission DATA_PERMISSION_DISABLE; + + @DataPermission(enable = false) + @SneakyThrows + private static DataPermission getDisableDataPermissionDisable() { + if (DATA_PERMISSION_DISABLE == null) { + DATA_PERMISSION_DISABLE = DataPermissionUtils.class + .getDeclaredMethod("getDisableDataPermissionDisable") + .getAnnotation(DataPermission.class); + } + return DATA_PERMISSION_DISABLE; + } + + /** + * 忽略数据权限,执行对应的逻辑 + * + * @param runnable 逻辑 + */ + public static void executeIgnore(Runnable runnable) { + DataPermission dataPermission = getDisableDataPermissionDisable(); + DataPermissionContextHolder.add(dataPermission); + try { + // 执行 runnable + runnable.run(); + } finally { + DataPermissionContextHolder.remove(); + } + } + + /** + * 忽略数据权限,执行对应的逻辑 + * + * @param callable 逻辑 + * @return 执行结果 + */ + @SneakyThrows + public static T executeIgnore(Callable callable) { + DataPermission dataPermission = getDisableDataPermissionDisable(); + DataPermissionContextHolder.add(dataPermission); + try { + // 执行 callable + return callable.call(); + } finally { + DataPermissionContextHolder.remove(); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java new file mode 100644 index 0000000..241e474 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 JSqlParser 解析 SQL,增加数据权限的 WHERE 条件 + */ +package com.win.framework.datapermission; diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..39e2b2e --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.datapermission.config.WinDataPermissionAutoConfiguration +com.win.framework.datapermission.config.WinDeptDataPermissionAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-ip/pom.xml b/win-framework/win-spring-boot-starter-biz-ip/pom.xml new file mode 100644 index 0000000..d9c0679 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/pom.xml @@ -0,0 +1,48 @@ + + + + win-framework + com.win + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-ip + jar + + ${project.artifactId} + IP 拓展,支持如下功能: + 1. IP 功能:查询 IP 对应的城市信息 + 基于 https://gitee.com/lionsoul/ip2region 实现 + 2. 城市功能:查询城市编码对应的城市信息 + 基于 https://github.com/modood/Administrative-divisions-of-China 实现 + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.lionsoul + ip2region + + + + org.projectlombok + lombok + + + + org.slf4j + slf4j-api + provided + + + + + diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java new file mode 100644 index 0000000..0d51cbe --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java @@ -0,0 +1,61 @@ +package com.win.framework.ip.core; + +import com.win.framework.ip.core.enums.AreaTypeEnum; +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.util.List; + +/** + * 区域节点,包括国家、省份、城市、地区等信息 + * + * 数据可见 resources/area.csv 文件 + * + * @author 芋道源码 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString(exclude = {"parent"}) // 参见 https://gitee.com/wincode/win-cloud-mini/pulls/2 原因 +public class Area { + + /** + * 编号 - 全球,即根目录 + */ + public static final Integer ID_GLOBAL = 0; + /** + * 编号 - 中国 + */ + public static final Integer ID_CHINA = 1; + + /** + * 编号 + */ + private Integer id; + /** + * 名字 + */ + private String name; + /** + * 类型 + * + * 枚举 {@link AreaTypeEnum} + */ + private Integer type; + + /** + * 父节点 + */ + @JsonManagedReference + private Area parent; + /** + * 子节点 + */ + @JsonBackReference + private List children; + +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java new file mode 100644 index 0000000..57c7144 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java @@ -0,0 +1,39 @@ +package com.win.framework.ip.core.enums; + +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 区域类型枚举 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum AreaTypeEnum implements IntArrayValuable { + + COUNTRY(1, "国家"), + PROVINCE(2, "省份"), + CITY(3, "城市"), + DISTRICT(4, "地区"), // 县、镇、区等 + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AreaTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + /** + * 名字 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java new file mode 100644 index 0000000..3b079d6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java @@ -0,0 +1,214 @@ +package com.win.framework.ip.core.utils; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.text.csv.CsvRow; +import cn.hutool.core.text.csv.CsvUtil; +import com.win.framework.common.util.object.ObjectUtils; +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.enums.AreaTypeEnum; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.common.util.collection.CollectionUtils.findFirst; + +/** + * 区域工具类 + * + * @author 芋道源码 + */ +@Slf4j +public class AreaUtils { + + /** + * 初始化 SEARCHER + */ + @SuppressWarnings("InstantiationOfUtilityClass") + private final static AreaUtils INSTANCE = new AreaUtils(); + + /** + * Area 内存缓存,提升访问速度 + */ + private static Map areas; + + private AreaUtils() { + long now = System.currentTimeMillis(); + areas = new HashMap<>(); + areas.put(Area.ID_GLOBAL, new Area(Area.ID_GLOBAL, "全球", 0, + null, new ArrayList<>())); + // 从 csv 中加载数据 + List rows = CsvUtil.getReader().read(ResourceUtil.getUtf8Reader("area.csv")).getRows(); + rows.remove(0); // 删除 header + for (CsvRow row : rows) { + // 创建 Area 对象 + Area area = new Area(Integer.valueOf(row.get(0)), row.get(1), Integer.valueOf(row.get(2)), + null, new ArrayList<>()); + // 添加到 areas 中 + areas.put(area.getId(), area); + } + + // 构建父子关系:因为 Area 中没有 parentId 字段,所以需要重复读取 + for (CsvRow row : rows) { + Area area = areas.get(Integer.valueOf(row.get(0))); // 自己 + Area parent = areas.get(Integer.valueOf(row.get(3))); // 父 + Assert.isTrue(area != parent, "{}:父子节点相同", area.getName()); + area.setParent(parent); + parent.getChildren().add(area); + } + log.info("启动加载 AreaUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now); + } + + /** + * 获得指定编号对应的区域 + * + * @param id 区域编号 + * @return 区域 + */ + public static Area getArea(Integer id) { + return areas.get(id); + } + + /** + * 获得指定区域对应的编号 + * + * @param pathStr 区域路径,例如说:河南省/石家庄市/新华区 + * @return 区域 + */ + public static Area parseArea(String pathStr) { + String[] paths = pathStr.split("/"); + Area area = null; + for (String path : paths) { + if (area == null) { + area = findFirst(areas.values(), item -> item.getName().equals(path)); + } else { + area = findFirst(area.getChildren(), item -> item.getName().equals(path)); + } + } + return area; + } + + /** + * 获取所有节点的全路径名称如:河南省/石家庄市/新华区 + * + * @param areas 地区树 + * @return 所有节点的全路径名称 + */ + public static List getAreaNodePathList(List areas) { + List paths = new ArrayList<>(); + areas.forEach(area -> getAreaNodePathList(area, "", paths)); + return paths; + } + + /** + * 构建一棵树的所有节点的全路径名称,并将其存储为 "祖先/父级/子级" 的形式 + * + * @param node 父节点 + * @param path 全路径名称 + * @param paths 全路径名称列表,省份/城市/地区 + */ + private static void getAreaNodePathList(Area node, String path, List paths) { + if (node == null) { + return; + } + // 构建当前节点的路径 + String currentPath = path.isEmpty() ? node.getName() : path + "/" + node.getName(); + paths.add(currentPath); + // 递归遍历子节点 + for (Area child : node.getChildren()) { + getAreaNodePathList(child, currentPath, paths); + } + } + + /** + * 格式化区域 + * + * @param id 区域编号 + * @return 格式化后的区域 + */ + public static String format(Integer id) { + return format(id, " "); + } + + /** + * 格式化区域 + * + * 例如说: + * 1. id = “静安区”时:上海 上海市 静安区 + * 2. id = “上海市”时:上海 上海市 + * 3. id = “上海”时:上海 + * 4. id = “美国”时:美国 + * 当区域在中国时,默认不显示中国 + * + * @param id 区域编号 + * @param separator 分隔符 + * @return 格式化后的区域 + */ + public static String format(Integer id, String separator) { + // 获得区域 + Area area = areas.get(id); + if (area == null) { + return null; + } + + // 格式化 + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < AreaTypeEnum.values().length; i++) { // 避免死循环 + sb.insert(0, area.getName()); + // “递归”父节点 + area = area.getParent(); + if (area == null + || ObjectUtils.equalsAny(area.getId(), Area.ID_GLOBAL, Area.ID_CHINA)) { // 跳过父节点为中国的情况 + break; + } + sb.insert(0, separator); + } + return sb.toString(); + } + + /** + * 获取指定类型的区域列表 + * + * @param type 区域类型 + * @param func 转换函数 + * @param 结果类型 + * @return 区域列表 + */ + public static List getByType(AreaTypeEnum type, Function func) { + return convertList(areas.values(), func, area -> type.getType().equals(area.getType())); + } + + /** + * 根据区域编号、上级区域类型,获取上级区域编号 + * + * @param id 区域编号 + * @param type 区域类型 + * @return 上级区域编号 + */ + public static Integer getParentIdByType(Integer id, @NonNull AreaTypeEnum type) { + for (int i = 0; i < Byte.MAX_VALUE; i++) { + Area area = AreaUtils.getArea(id); + if (area == null) { + return null; + } + // 情况一:匹配到,返回它 + if (type.getType().equals(area.getType())) { + return area.getId(); + } + // 情况二:找到根节点,返回空 + if (area.getParent() == null || area.getParent().getId() == null) { + return null; + } + // 其它:继续向上查找 + id = area.getParent().getId(); + } + return null; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java new file mode 100644 index 0000000..2bef970 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java @@ -0,0 +1,87 @@ +package com.win.framework.ip.core.utils; + +import cn.hutool.core.io.resource.ResourceUtil; +import com.win.framework.ip.core.Area; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.lionsoul.ip2region.xdb.Searcher; + +import java.io.IOException; + +/** + * IP 工具类 + * + * IP 数据源来自 ip2region.xdb 精简版,基于 项目 + * + * @author wanglhup + */ +@Slf4j +public class IPUtils { + + /** + * 初始化 SEARCHER + */ + @SuppressWarnings("InstantiationOfUtilityClass") + private final static IPUtils INSTANCE = new IPUtils(); + + /** + * IP 查询器,启动加载到内存中 + */ + private static Searcher SEARCHER; + + /** + * 私有化构造 + */ + private IPUtils() { + try { + long now = System.currentTimeMillis(); + byte[] bytes = ResourceUtil.readBytes("ip2region.xdb"); + SEARCHER = Searcher.newWithBuffer(bytes); + log.info("启动加载 IPUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now); + } catch (IOException e) { + log.error("启动加载 IPUtils 失败", e); + } + } + + /** + * 查询 IP 对应的地区编号 + * + * @param ip IP 地址,格式为 127.0.0.1 + * @return 地区id + */ + @SneakyThrows + public static Integer getAreaId(String ip) { + return Integer.parseInt(SEARCHER.search(ip.trim())); + } + + /** + * 查询 IP 对应的地区编号 + * + * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回 + * @return 地区编号 + */ + @SneakyThrows + public static Integer getAreaId(long ip) { + return Integer.parseInt(SEARCHER.search(ip)); + } + + /** + * 查询 IP 对应的地区 + * + * @param ip IP 地址,格式为 127.0.0.1 + * @return 地区 + */ + public static Area getArea(String ip) { + return AreaUtils.getArea(getAreaId(ip)); + } + + /** + * 查询 IP 对应的地区 + * + * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回 + * @return 地区 + */ + public static Area getArea(long ip) { + return AreaUtils.getArea(getAreaId(ip)); + } +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java new file mode 100644 index 0000000..5a89bd3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java @@ -0,0 +1,11 @@ +/** + * IP 拓展,支持如下功能: + * + * 1. IP 功能:查询 IP 对应的城市信息 + * 基于 https://gitee.com/lionsoul/ip2region 实现 + * 2. 城市功能:查询城市编码对应的城市信息 + * 基于 https://github.com/modood/Administrative-divisions-of-China 实现 + * + * @author 芋道源码 + */ +package com.win.framework.ip; diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv new file mode 100644 index 0000000..0dd830e --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv @@ -0,0 +1,3662 @@ +id,name,type,parentId +1,中国,1,0 +2,蒙古,1,0 +3,朝鲜,1,0 +4,韩国,1,0 +5,日本,1,0 +6,菲律宾,1,0 +7,越南,1,0 +8,老挝,1,0 +9,柬埔寨,1,0 +10,缅甸,1,0 +11,泰国,1,0 +12,马来西亚,1,0 +13,文莱,1,0 +14,新加坡,1,0 +15,印度尼西亚,1,0 +16,东帝汶,1,0 +17,尼泊尔,1,0 +18,不丹,1,0 +19,孟加拉国,1,0 +20,印度,1,0 +21,巴基斯坦,1,0 +22,斯里兰卡,1,0 +23,马尔代夫,1,0 +24,哈萨克斯坦,1,0 +25,吉尔吉斯斯坦,1,0 +26,塔吉克斯坦,1,0 +27,乌兹别克斯坦,1,0 +28,土库曼斯坦,1,0 +29,阿富汗,1,0 +30,伊拉克,1,0 +31,伊朗,1,0 +32,叙利亚,1,0 +33,约旦,1,0 +34,黎巴嫩,1,0 +35,以色列,1,0 +36,巴勒斯坦,1,0 +37,沙特阿拉伯,1,0 +38,巴林,1,0 +39,卡塔尔,1,0 +40,科威特,1,0 +41,阿拉伯联合酋长国,1,0 +42,阿曼,1,0 +43,也门,1,0 +44,格鲁吉亚,1,0 +45,亚美尼亚,1,0 +46,阿塞拜疆,1,0 +47,土耳其,1,0 +48,塞浦路斯,1,0 +49,芬兰,1,0 +50,瑞典,1,0 +51,挪威,1,0 +52,冰岛,1,0 +53,丹麦,1,0 +54,爱沙尼亚,1,0 +55,拉脱维亚,1,0 +56,立陶宛,1,0 +57,白俄罗斯,1,0 +58,俄罗斯,1,0 +59,乌克兰,1,0 +60,摩尔多瓦,1,0 +61,波兰,1,0 +62,捷克,1,0 +63,斯洛伐克,1,0 +64,匈牙利,1,0 +65,德国,1,0 +66,奥地利,1,0 +67,瑞士,1,0 +68,列支敦士登,1,0 +69,英国,1,0 +70,爱尔兰,1,0 +71,荷兰,1,0 +72,比利时,1,0 +73,卢森堡,1,0 +74,法国,1,0 +75,摩纳哥,1,0 +76,罗马尼亚,1,0 +77,保加利亚,1,0 +78,塞尔维亚,1,0 +79,马其顿,1,0 +80,阿尔巴尼亚,1,0 +81,希腊,1,0 +82,斯洛文尼亚,1,0 +83,克罗地亚,1,0 +84,波斯尼亚和墨塞哥维那,1,0 +85,意大利,1,0 +86,梵蒂冈,1,0 +87,圣马力诺,1,0 +88,马耳他,1,0 +89,西班牙,1,0 +90,葡萄牙,1,0 +91,安道尔共和国,1,0 +92,埃及,1,0 +93,利比亚,1,0 +94,苏丹,1,0 +95,突尼斯,1,0 +96,阿尔及利亚,1,0 +97,摩洛哥,1,0 +98,亚速尔群岛,1,0 +99,马德拉群岛,1,0 +100,埃塞俄比亚,1,0 +101,厄立特里亚,1,0 +102,索马里,1,0 +103,吉布提,1,0 +104,肯尼亚,1,0 +105,坦桑尼亚,1,0 +106,乌干达,1,0 +107,卢旺达,1,0 +108,布隆迪,1,0 +109,塞舌尔,1,0 +110,圣多美及普林西比,1,0 +111,塞内加尔,1,0 +112,冈比亚,1,0 +113,马里,1,0 +114,布基纳法索,1,0 +115,几内亚,1,0 +116,几内亚比绍,1,0 +117,佛得角,1,0 +118,塞拉利昂,1,0 +119,利比里亚,1,0 +120,科特迪瓦,1,0 +121,加纳,1,0 +122,多哥,1,0 +123,贝宁,1,0 +124,尼日尔,1,0 +125,加那利群岛,1,0 +126,赞比亚,1,0 +127,安哥拉,1,0 +128,津巴布韦,1,0 +129,马拉维,1,0 +130,莫桑比克,1,0 +131,博茨瓦纳,1,0 +132,纳米比亚,1,0 +133,南非,1,0 +134,斯威士兰,1,0 +135,莱索托,1,0 +136,马达加斯加,1,0 +137,科摩罗,1,0 +138,毛里求斯,1,0 +139,留尼旺,1,0 +140,圣赫勒拿,1,0 +141,澳大利亚,1,0 +142,新西兰,1,0 +143,巴布亚新几内亚,1,0 +144,所罗门群岛,1,0 +145,瓦努阿图共和国,1,0 +146,密克罗尼西亚,1,0 +147,马绍尔群岛,1,0 +148,帕劳,1,0 +149,瑙鲁,1,0 +150,基里巴斯,1,0 +151,图瓦卢,1,0 +152,萨摩亚,1,0 +153,斐济,1,0 +154,汤加,1,0 +155,库克群岛,1,0 +156,关岛,1,0 +157,新喀里多尼亚,1,0 +158,法属波利尼西亚,1,0 +159,皮特凯恩岛,1,0 +160,瓦利斯与富图纳,1,0 +161,纽埃,1,0 +162,托克劳,1,0 +163,美属萨摩亚,1,0 +164,北马里亚纳,1,0 +165,加拿大,1,0 +166,美国,1,0 +167,墨西哥,1,0 +168,格陵兰,1,0 +169,危地马拉,1,0 +170,伯利兹,1,0 +171,萨尔瓦多,1,0 +172,洪都拉斯,1,0 +173,尼加拉瓜,1,0 +174,哥斯达黎加,1,0 +175,巴拿马,1,0 +176,巴哈马,1,0 +177,古巴,1,0 +178,牙买加,1,0 +179,海地,1,0 +180,多米尼加共和国,1,0 +181,安提瓜和巴布达,1,0 +182,圣基茨和尼维斯,1,0 +183,多米尼克,1,0 +184,圣卢西亚,1,0 +185,圣文森特和格林纳丁斯,1,0 +186,格林纳达,1,0 +187,巴巴多斯,1,0 +188,特立尼达和多巴哥,1,0 +189,波多黎各,1,0 +190,英属维尔京群岛,1,0 +191,美属维尔京群岛,1,0 +192,安圭拉,1,0 +193,蒙特塞拉特岛,1,0 +194,瓜德罗普,1,0 +195,马提尼克,1,0 +196,荷属安的列斯,1,0 +197,阿鲁巴,1,0 +198,特克斯和凯科斯群岛,1,0 +199,开曼群岛,1,0 +200,百慕大,1,0 +201,哥伦比亚,1,0 +202,委内瑞拉,1,0 +203,圭亚那,1,0 +204,法属圭亚那,1,0 +205,苏里南,1,0 +206,厄瓜多尔,1,0 +207,秘鲁,1,0 +208,玻利维亚,1,0 +209,巴西,1,0 +210,智利,1,0 +211,阿根廷,1,0 +212,乌拉圭,1,0 +213,巴拉圭,1,0 +214,波黑,1,0 +215,直布罗陀,1,0 +216,新喀里多尼亚群岛,1,0 +217,瓦利斯和富图纳群岛,1,0 +218,泽西岛,1,0 +219,黑山,1,0 +220,英属马恩岛,1,0 +221,尼日利亚,1,0 +222,喀麦隆,1,0 +223,加蓬,1,0 +224,乍得,1,0 +225,刚果共和国,1,0 +226,中非共和国,1,0 +227,南苏丹,1,0 +228,赤道几内亚,1,0 +229,毛里塔尼亚,1,0 +230,刚果民主共和国,1,0 +231,留尼汪岛,1,0 +232,格陵兰岛,1,0 +233,法罗群岛,1,0 +234,根西岛,1,0 +235,百慕大群岛,1,0 +236,圣皮埃尔和密克隆群岛,1,0 +237,法属圣马丁,1,0 +238,奥兰群岛,1,0 +239,北马里亚纳群岛,1,0 +240,库拉索,1,0 +241,博内尔岛,1,0 +242,圣马丁岛,1,0 +243,圣巴泰勒米岛,1,0 +244,福克兰群岛,1,0 +245,圣多美和普林西比,1,0 +246,英属印度洋领地,1,0 +247,东萨摩亚,1,0 +248,诺福克岛,1,0 +110000,北京市,2,1 +120000,天津市,2,1 +130000,河北省,2,1 +140000,山西省,2,1 +150000,内蒙古自治区,2,1 +210000,辽宁省,2,1 +220000,吉林省,2,1 +230000,黑龙江省,2,1 +310000,上海市,2,1 +320000,江苏省,2,1 +330000,浙江省,2,1 +340000,安徽省,2,1 +350000,福建省,2,1 +360000,江西省,2,1 +370000,山东省,2,1 +410000,河南省,2,1 +420000,湖北省,2,1 +430000,湖南省,2,1 +440000,广东省,2,1 +450000,广西壮族自治区,2,1 +460000,海南省,2,1 +500000,重庆市,2,1 +510000,四川省,2,1 +520000,贵州省,2,1 +530000,云南省,2,1 +540000,西藏自治区,2,1 +610000,陕西省,2,1 +620000,甘肃省,2,1 +630000,青海省,2,1 +640000,宁夏回族自治区,2,1 +650000,新疆维吾尔自治区,2,1 +110100,北京市,3,110000 +120100,天津市,3,120000 +130100,石家庄市,3,130000 +130200,唐山市,3,130000 +130300,秦皇岛市,3,130000 +130400,邯郸市,3,130000 +130500,邢台市,3,130000 +130600,保定市,3,130000 +130700,张家口市,3,130000 +130800,承德市,3,130000 +130900,沧州市,3,130000 +131000,廊坊市,3,130000 +131100,衡水市,3,130000 +140100,太原市,3,140000 +140200,大同市,3,140000 +140300,阳泉市,3,140000 +140400,长治市,3,140000 +140500,晋城市,3,140000 +140600,朔州市,3,140000 +140700,晋中市,3,140000 +140800,运城市,3,140000 +140900,忻州市,3,140000 +141000,临汾市,3,140000 +141100,吕梁市,3,140000 +150100,呼和浩特市,3,150000 +150200,包头市,3,150000 +150300,乌海市,3,150000 +150400,赤峰市,3,150000 +150500,通辽市,3,150000 +150600,鄂尔多斯市,3,150000 +150700,呼伦贝尔市,3,150000 +150800,巴彦淖尔市,3,150000 +150900,乌兰察布市,3,150000 +152200,兴安盟,3,150000 +152500,锡林郭勒盟,3,150000 +152900,阿拉善盟,3,150000 +210100,沈阳市,3,210000 +210200,大连市,3,210000 +210300,鞍山市,3,210000 +210400,抚顺市,3,210000 +210500,本溪市,3,210000 +210600,丹东市,3,210000 +210700,锦州市,3,210000 +210800,营口市,3,210000 +210900,阜新市,3,210000 +211000,辽阳市,3,210000 +211100,盘锦市,3,210000 +211200,铁岭市,3,210000 +211300,朝阳市,3,210000 +211400,葫芦岛市,3,210000 +220100,长春市,3,220000 +220200,吉林市,3,220000 +220300,四平市,3,220000 +220400,辽源市,3,220000 +220500,通化市,3,220000 +220600,白山市,3,220000 +220700,松原市,3,220000 +220800,白城市,3,220000 +222400,延边朝鲜族自治州,3,220000 +230100,哈尔滨市,3,230000 +230200,齐齐哈尔市,3,230000 +230300,鸡西市,3,230000 +230400,鹤岗市,3,230000 +230500,双鸭山市,3,230000 +230600,大庆市,3,230000 +230700,伊春市,3,230000 +230800,佳木斯市,3,230000 +230900,七台河市,3,230000 +231000,牡丹江市,3,230000 +231100,黑河市,3,230000 +231200,绥化市,3,230000 +232700,大兴安岭地区,3,230000 +310100,上海市,3,310000 +320100,南京市,3,320000 +320200,无锡市,3,320000 +320300,徐州市,3,320000 +320400,常州市,3,320000 +320500,苏州市,3,320000 +320600,南通市,3,320000 +320700,连云港市,3,320000 +320800,淮安市,3,320000 +320900,盐城市,3,320000 +321000,扬州市,3,320000 +321100,镇江市,3,320000 +321200,泰州市,3,320000 +321300,宿迁市,3,320000 +330100,杭州市,3,330000 +330200,宁波市,3,330000 +330300,温州市,3,330000 +330400,嘉兴市,3,330000 +330500,湖州市,3,330000 +330600,绍兴市,3,330000 +330700,金华市,3,330000 +330800,衢州市,3,330000 +330900,舟山市,3,330000 +331000,台州市,3,330000 +331100,丽水市,3,330000 +340100,合肥市,3,340000 +340200,芜湖市,3,340000 +340300,蚌埠市,3,340000 +340400,淮南市,3,340000 +340500,马鞍山市,3,340000 +340600,淮北市,3,340000 +340700,铜陵市,3,340000 +340800,安庆市,3,340000 +341000,黄山市,3,340000 +341100,滁州市,3,340000 +341200,阜阳市,3,340000 +341300,宿州市,3,340000 +341500,六安市,3,340000 +341600,亳州市,3,340000 +341700,池州市,3,340000 +341800,宣城市,3,340000 +350100,福州市,3,350000 +350200,厦门市,3,350000 +350300,莆田市,3,350000 +350400,三明市,3,350000 +350500,泉州市,3,350000 +350600,漳州市,3,350000 +350700,南平市,3,350000 +350800,龙岩市,3,350000 +350900,宁德市,3,350000 +360100,南昌市,3,360000 +360200,景德镇市,3,360000 +360300,萍乡市,3,360000 +360400,九江市,3,360000 +360500,新余市,3,360000 +360600,鹰潭市,3,360000 +360700,赣州市,3,360000 +360800,吉安市,3,360000 +360900,宜春市,3,360000 +361000,抚州市,3,360000 +361100,上饶市,3,360000 +370100,济南市,3,370000 +370200,青岛市,3,370000 +370300,淄博市,3,370000 +370400,枣庄市,3,370000 +370500,东营市,3,370000 +370600,烟台市,3,370000 +370700,潍坊市,3,370000 +370800,济宁市,3,370000 +370900,泰安市,3,370000 +371000,威海市,3,370000 +371100,日照市,3,370000 +371300,临沂市,3,370000 +371400,德州市,3,370000 +371500,聊城市,3,370000 +371600,滨州市,3,370000 +371700,菏泽市,3,370000 +410100,郑州市,3,410000 +410200,开封市,3,410000 +410300,洛阳市,3,410000 +410400,平顶山市,3,410000 +410500,安阳市,3,410000 +410600,鹤壁市,3,410000 +410700,新乡市,3,410000 +410800,焦作市,3,410000 +410900,濮阳市,3,410000 +411000,许昌市,3,410000 +411100,漯河市,3,410000 +411200,三门峡市,3,410000 +411300,南阳市,3,410000 +411400,商丘市,3,410000 +411500,信阳市,3,410000 +411600,周口市,3,410000 +411700,驻马店市,3,410000 +419000,省直辖县级行政区划,3,410000 +420100,武汉市,3,420000 +420200,黄石市,3,420000 +420300,十堰市,3,420000 +420500,宜昌市,3,420000 +420600,襄阳市,3,420000 +420700,鄂州市,3,420000 +420800,荆门市,3,420000 +420900,孝感市,3,420000 +421000,荆州市,3,420000 +421100,黄冈市,3,420000 +421200,咸宁市,3,420000 +421300,随州市,3,420000 +422800,恩施土家族苗族自治州,3,420000 +429000,省直辖县级行政区划,3,420000 +430100,长沙市,3,430000 +430200,株洲市,3,430000 +430300,湘潭市,3,430000 +430400,衡阳市,3,430000 +430500,邵阳市,3,430000 +430600,岳阳市,3,430000 +430700,常德市,3,430000 +430800,张家界市,3,430000 +430900,益阳市,3,430000 +431000,郴州市,3,430000 +431100,永州市,3,430000 +431200,怀化市,3,430000 +431300,娄底市,3,430000 +433100,湘西土家族苗族自治州,3,430000 +440100,广州市,3,440000 +440200,韶关市,3,440000 +440300,深圳市,3,440000 +440400,珠海市,3,440000 +440500,汕头市,3,440000 +440600,佛山市,3,440000 +440700,江门市,3,440000 +440800,湛江市,3,440000 +440900,茂名市,3,440000 +441200,肇庆市,3,440000 +441300,惠州市,3,440000 +441400,梅州市,3,440000 +441500,汕尾市,3,440000 +441600,河源市,3,440000 +441700,阳江市,3,440000 +441800,清远市,3,440000 +441900,东莞市,3,440000 +441901,莞城区,4,441900 +441902,南城区,4,441900 +441904,万江区,4,441900 +441905,石碣镇,4,441900 +441906,石龙镇,4,441900 +441907,茶山镇,4,441900 +441908,石排镇,4,441900 +441909,企石镇,4,441900 +441910,横沥镇,4,441900 +441911,桥头镇,4,441900 +441912,谢岗镇,4,441900 +441913,东坑镇,4,441900 +441914,常平镇,4,441900 +441915,寮步镇,4,441900 +441916,大朗镇,4,441900 +441917,麻涌镇,4,441900 +441918,中堂镇,4,441900 +441919,高埗镇,4,441900 +441920,樟木头镇,4,441900 +441921,大岭山镇,4,441900 +441922,望牛墩镇,4,441900 +441923,黄江镇,4,441900 +441924,洪梅镇,4,441900 +441925,清溪镇,4,441900 +441926,沙田镇,4,441900 +441927,道滘镇,4,441900 +441928,塘厦镇,4,441900 +441929,虎门镇,4,441900 +441930,厚街镇,4,441900 +441931,凤岗镇,4,441900 +441932,长安镇,4,441900 +442000,中山市,3,440000 +442001,石岐街道,4,442000 +442002,东区街道,4,442000 +442003,中山港街道,4,442000 +442004,西区街道,4,442000 +442005,南区街道,4,442000 +442006,五桂山街道,4,442000 +442007,民众街道,4,442000 +442008,南朗街道,4,442000 +442009,黄圃镇,4,442000 +442010,东凤镇,4,442000 +442011,古镇镇,4,442000 +442012,沙溪镇,4,442000 +442013,坦洲镇,4,442000 +442014,港口镇,4,442000 +442015,三角镇,4,442000 +442016,横栏镇,4,442000 +442017,南头镇,4,442000 +442018,阜沙镇,4,442000 +442019,三乡镇,4,442000 +442020,板芙镇,4,442000 +442021,大涌镇,4,442000 +442022,神湾镇,4,442000 +442023,小榄镇,4,442000 +445100,潮州市,3,440000 +445200,揭阳市,3,440000 +445300,云浮市,3,440000 +450100,南宁市,3,450000 +450200,柳州市,3,450000 +450300,桂林市,3,450000 +450400,梧州市,3,450000 +450500,北海市,3,450000 +450600,防城港市,3,450000 +450700,钦州市,3,450000 +450800,贵港市,3,450000 +450900,玉林市,3,450000 +451000,百色市,3,450000 +451100,贺州市,3,450000 +451200,河池市,3,450000 +451300,来宾市,3,450000 +451400,崇左市,3,450000 +460100,海口市,3,460000 +460200,三亚市,3,460000 +460300,三沙市,3,460000 +460400,儋州市,3,460000 +469000,省直辖县级行政区划,3,460000 +500100,重庆市,3,500000 +510100,成都市,3,510000 +510300,自贡市,3,510000 +510400,攀枝花市,3,510000 +510500,泸州市,3,510000 +510600,德阳市,3,510000 +510700,绵阳市,3,510000 +510800,广元市,3,510000 +510900,遂宁市,3,510000 +511000,内江市,3,510000 +511100,乐山市,3,510000 +511300,南充市,3,510000 +511400,眉山市,3,510000 +511500,宜宾市,3,510000 +511600,广安市,3,510000 +511700,达州市,3,510000 +511800,雅安市,3,510000 +511900,巴中市,3,510000 +512000,资阳市,3,510000 +513200,阿坝藏族羌族自治州,3,510000 +513300,甘孜藏族自治州,3,510000 +513400,凉山彝族自治州,3,510000 +520100,贵阳市,3,520000 +520200,六盘水市,3,520000 +520300,遵义市,3,520000 +520400,安顺市,3,520000 +520500,毕节市,3,520000 +520600,铜仁市,3,520000 +522300,黔西南布依族苗族自治州,3,520000 +522600,黔东南苗族侗族自治州,3,520000 +522700,黔南布依族苗族自治州,3,520000 +530100,昆明市,3,530000 +530300,曲靖市,3,530000 +530400,玉溪市,3,530000 +530500,保山市,3,530000 +530600,昭通市,3,530000 +530700,丽江市,3,530000 +530800,普洱市,3,530000 +530900,临沧市,3,530000 +532300,楚雄彝族自治州,3,530000 +532500,红河哈尼族彝族自治州,3,530000 +532600,文山壮族苗族自治州,3,530000 +532800,西双版纳傣族自治州,3,530000 +532900,大理白族自治州,3,530000 +533100,德宏傣族景颇族自治州,3,530000 +533300,怒江傈僳族自治州,3,530000 +533400,迪庆藏族自治州,3,530000 +540100,拉萨市,3,540000 +540200,日喀则市,3,540000 +540300,昌都市,3,540000 +540400,林芝市,3,540000 +540500,山南市,3,540000 +540600,那曲市,3,540000 +542500,阿里地区,3,540000 +610100,西安市,3,610000 +610200,铜川市,3,610000 +610300,宝鸡市,3,610000 +610400,咸阳市,3,610000 +610500,渭南市,3,610000 +610600,延安市,3,610000 +610700,汉中市,3,610000 +610800,榆林市,3,610000 +610900,安康市,3,610000 +611000,商洛市,3,610000 +620100,兰州市,3,620000 +620200,嘉峪关市,3,620000 +620300,金昌市,3,620000 +620400,白银市,3,620000 +620500,天水市,3,620000 +620600,武威市,3,620000 +620700,张掖市,3,620000 +620800,平凉市,3,620000 +620900,酒泉市,3,620000 +621000,庆阳市,3,620000 +621100,定西市,3,620000 +621200,陇南市,3,620000 +622900,临夏回族自治州,3,620000 +623000,甘南藏族自治州,3,620000 +630100,西宁市,3,630000 +630200,海东市,3,630000 +632200,海北藏族自治州,3,630000 +632300,黄南藏族自治州,3,630000 +632500,海南藏族自治州,3,630000 +632600,果洛藏族自治州,3,630000 +632700,玉树藏族自治州,3,630000 +632800,海西蒙古族藏族自治州,3,630000 +640100,银川市,3,640000 +640200,石嘴山市,3,640000 +640300,吴忠市,3,640000 +640400,固原市,3,640000 +640500,中卫市,3,640000 +650100,乌鲁木齐市,3,650000 +650200,克拉玛依市,3,650000 +650400,吐鲁番市,3,650000 +650500,哈密市,3,650000 +652300,昌吉回族自治州,3,650000 +652700,博尔塔拉蒙古自治州,3,650000 +652800,巴音郭楞蒙古自治州,3,650000 +652900,阿克苏地区,3,650000 +653000,克孜勒苏柯尔克孜自治州,3,650000 +653100,喀什地区,3,650000 +653200,和田地区,3,650000 +654000,伊犁哈萨克自治州,3,650000 +654200,塔城地区,3,650000 +654300,阿勒泰地区,3,650000 +659000,自治区直辖县级行政区划,3,650000 +110101,东城区,4,110100 +110102,西城区,4,110100 +110105,朝阳区,4,110100 +110106,丰台区,4,110100 +110107,石景山区,4,110100 +110108,海淀区,4,110100 +110109,门头沟区,4,110100 +110111,房山区,4,110100 +110112,通州区,4,110100 +110113,顺义区,4,110100 +110114,昌平区,4,110100 +110115,大兴区,4,110100 +110116,怀柔区,4,110100 +110117,平谷区,4,110100 +110118,密云区,4,110100 +110119,延庆区,4,110100 +120101,和平区,4,120100 +120102,河东区,4,120100 +120103,河西区,4,120100 +120104,南开区,4,120100 +120105,河北区,4,120100 +120106,红桥区,4,120100 +120110,东丽区,4,120100 +120111,西青区,4,120100 +120112,津南区,4,120100 +120113,北辰区,4,120100 +120114,武清区,4,120100 +120115,宝坻区,4,120100 +120116,滨海新区,4,120100 +120117,宁河区,4,120100 +120118,静海区,4,120100 +120119,蓟州区,4,120100 +130102,长安区,4,130100 +130104,桥西区,4,130100 +130105,新华区,4,130100 +130107,井陉矿区,4,130100 +130108,裕华区,4,130100 +130109,藁城区,4,130100 +130110,鹿泉区,4,130100 +130111,栾城区,4,130100 +130121,井陉县,4,130100 +130123,正定县,4,130100 +130125,行唐县,4,130100 +130126,灵寿县,4,130100 +130127,高邑县,4,130100 +130128,深泽县,4,130100 +130129,赞皇县,4,130100 +130130,无极县,4,130100 +130131,平山县,4,130100 +130132,元氏县,4,130100 +130133,赵县,4,130100 +130171,石家庄高新技术产业开发区,4,130100 +130172,石家庄循环化工园区,4,130100 +130181,辛集市,4,130100 +130183,晋州市,4,130100 +130184,新乐市,4,130100 +130202,路南区,4,130200 +130203,路北区,4,130200 +130204,古冶区,4,130200 +130205,开平区,4,130200 +130207,丰南区,4,130200 +130208,丰润区,4,130200 +130209,曹妃甸区,4,130200 +130224,滦南县,4,130200 +130225,乐亭县,4,130200 +130227,迁西县,4,130200 +130229,玉田县,4,130200 +130271,河北唐山芦台经济开发区,4,130200 +130272,唐山市汉沽管理区,4,130200 +130273,唐山高新技术产业开发区,4,130200 +130274,河北唐山海港经济开发区,4,130200 +130281,遵化市,4,130200 +130283,迁安市,4,130200 +130284,滦州市,4,130200 +130302,海港区,4,130300 +130303,山海关区,4,130300 +130304,北戴河区,4,130300 +130306,抚宁区,4,130300 +130321,青龙满族自治县,4,130300 +130322,昌黎县,4,130300 +130324,卢龙县,4,130300 +130371,秦皇岛市经济技术开发区,4,130300 +130372,北戴河新区,4,130300 +130402,邯山区,4,130400 +130403,丛台区,4,130400 +130404,复兴区,4,130400 +130406,峰峰矿区,4,130400 +130407,肥乡区,4,130400 +130408,永年区,4,130400 +130423,临漳县,4,130400 +130424,成安县,4,130400 +130425,大名县,4,130400 +130426,涉县,4,130400 +130427,磁县,4,130400 +130430,邱县,4,130400 +130431,鸡泽县,4,130400 +130432,广平县,4,130400 +130433,馆陶县,4,130400 +130434,魏县,4,130400 +130435,曲周县,4,130400 +130471,邯郸经济技术开发区,4,130400 +130473,邯郸冀南新区,4,130400 +130481,武安市,4,130400 +130502,襄都区,4,130500 +130503,信都区,4,130500 +130505,任泽区,4,130500 +130506,南和区,4,130500 +130522,临城县,4,130500 +130523,内丘县,4,130500 +130524,柏乡县,4,130500 +130525,隆尧县,4,130500 +130528,宁晋县,4,130500 +130529,巨鹿县,4,130500 +130530,新河县,4,130500 +130531,广宗县,4,130500 +130532,平乡县,4,130500 +130533,威县,4,130500 +130534,清河县,4,130500 +130535,临西县,4,130500 +130571,河北邢台经济开发区,4,130500 +130581,南宫市,4,130500 +130582,沙河市,4,130500 +130602,竞秀区,4,130600 +130606,莲池区,4,130600 +130607,满城区,4,130600 +130608,清苑区,4,130600 +130609,徐水区,4,130600 +130623,涞水县,4,130600 +130624,阜平县,4,130600 +130626,定兴县,4,130600 +130627,唐县,4,130600 +130628,高阳县,4,130600 +130629,容城县,4,130600 +130630,涞源县,4,130600 +130631,望都县,4,130600 +130632,安新县,4,130600 +130633,易县,4,130600 +130634,曲阳县,4,130600 +130635,蠡县,4,130600 +130636,顺平县,4,130600 +130637,博野县,4,130600 +130638,雄县,4,130600 +130671,保定高新技术产业开发区,4,130600 +130672,保定白沟新城,4,130600 +130681,涿州市,4,130600 +130682,定州市,4,130600 +130683,安国市,4,130600 +130684,高碑店市,4,130600 +130702,桥东区,4,130700 +130703,桥西区,4,130700 +130705,宣化区,4,130700 +130706,下花园区,4,130700 +130708,万全区,4,130700 +130709,崇礼区,4,130700 +130722,张北县,4,130700 +130723,康保县,4,130700 +130724,沽源县,4,130700 +130725,尚义县,4,130700 +130726,蔚县,4,130700 +130727,阳原县,4,130700 +130728,怀安县,4,130700 +130730,怀来县,4,130700 +130731,涿鹿县,4,130700 +130732,赤城县,4,130700 +130771,张家口经济开发区,4,130700 +130772,张家口市察北管理区,4,130700 +130773,张家口市塞北管理区,4,130700 +130802,双桥区,4,130800 +130803,双滦区,4,130800 +130804,鹰手营子矿区,4,130800 +130821,承德县,4,130800 +130822,兴隆县,4,130800 +130824,滦平县,4,130800 +130825,隆化县,4,130800 +130826,丰宁满族自治县,4,130800 +130827,宽城满族自治县,4,130800 +130828,围场满族蒙古族自治县,4,130800 +130871,承德高新技术产业开发区,4,130800 +130881,平泉市,4,130800 +130902,新华区,4,130900 +130903,运河区,4,130900 +130921,沧县,4,130900 +130922,青县,4,130900 +130923,东光县,4,130900 +130924,海兴县,4,130900 +130925,盐山县,4,130900 +130926,肃宁县,4,130900 +130927,南皮县,4,130900 +130928,吴桥县,4,130900 +130929,献县,4,130900 +130930,孟村回族自治县,4,130900 +130971,河北沧州经济开发区,4,130900 +130972,沧州高新技术产业开发区,4,130900 +130973,沧州渤海新区,4,130900 +130981,泊头市,4,130900 +130982,任丘市,4,130900 +130983,黄骅市,4,130900 +130984,河间市,4,130900 +131002,安次区,4,131000 +131003,广阳区,4,131000 +131022,固安县,4,131000 +131023,永清县,4,131000 +131024,香河县,4,131000 +131025,大城县,4,131000 +131026,文安县,4,131000 +131028,大厂回族自治县,4,131000 +131071,廊坊经济技术开发区,4,131000 +131081,霸州市,4,131000 +131082,三河市,4,131000 +131102,桃城区,4,131100 +131103,冀州区,4,131100 +131121,枣强县,4,131100 +131122,武邑县,4,131100 +131123,武强县,4,131100 +131124,饶阳县,4,131100 +131125,安平县,4,131100 +131126,故城县,4,131100 +131127,景县,4,131100 +131128,阜城县,4,131100 +131171,河北衡水高新技术产业开发区,4,131100 +131172,衡水滨湖新区,4,131100 +131182,深州市,4,131100 +140105,小店区,4,140100 +140106,迎泽区,4,140100 +140107,杏花岭区,4,140100 +140108,尖草坪区,4,140100 +140109,万柏林区,4,140100 +140110,晋源区,4,140100 +140121,清徐县,4,140100 +140122,阳曲县,4,140100 +140123,娄烦县,4,140100 +140171,山西转型综合改革示范区,4,140100 +140181,古交市,4,140100 +140212,新荣区,4,140200 +140213,平城区,4,140200 +140214,云冈区,4,140200 +140215,云州区,4,140200 +140221,阳高县,4,140200 +140222,天镇县,4,140200 +140223,广灵县,4,140200 +140224,灵丘县,4,140200 +140225,浑源县,4,140200 +140226,左云县,4,140200 +140271,山西大同经济开发区,4,140200 +140302,城区,4,140300 +140303,矿区,4,140300 +140311,郊区,4,140300 +140321,平定县,4,140300 +140322,盂县,4,140300 +140403,潞州区,4,140400 +140404,上党区,4,140400 +140405,屯留区,4,140400 +140406,潞城区,4,140400 +140423,襄垣县,4,140400 +140425,平顺县,4,140400 +140426,黎城县,4,140400 +140427,壶关县,4,140400 +140428,长子县,4,140400 +140429,武乡县,4,140400 +140430,沁县,4,140400 +140431,沁源县,4,140400 +140471,山西长治高新技术产业园区,4,140400 +140502,城区,4,140500 +140521,沁水县,4,140500 +140522,阳城县,4,140500 +140524,陵川县,4,140500 +140525,泽州县,4,140500 +140581,高平市,4,140500 +140602,朔城区,4,140600 +140603,平鲁区,4,140600 +140621,山阴县,4,140600 +140622,应县,4,140600 +140623,右玉县,4,140600 +140671,山西朔州经济开发区,4,140600 +140681,怀仁市,4,140600 +140702,榆次区,4,140700 +140703,太谷区,4,140700 +140721,榆社县,4,140700 +140722,左权县,4,140700 +140723,和顺县,4,140700 +140724,昔阳县,4,140700 +140725,寿阳县,4,140700 +140727,祁县,4,140700 +140728,平遥县,4,140700 +140729,灵石县,4,140700 +140781,介休市,4,140700 +140802,盐湖区,4,140800 +140821,临猗县,4,140800 +140822,万荣县,4,140800 +140823,闻喜县,4,140800 +140824,稷山县,4,140800 +140825,新绛县,4,140800 +140826,绛县,4,140800 +140827,垣曲县,4,140800 +140828,夏县,4,140800 +140829,平陆县,4,140800 +140830,芮城县,4,140800 +140881,永济市,4,140800 +140882,河津市,4,140800 +140902,忻府区,4,140900 +140921,定襄县,4,140900 +140922,五台县,4,140900 +140923,代县,4,140900 +140924,繁峙县,4,140900 +140925,宁武县,4,140900 +140926,静乐县,4,140900 +140927,神池县,4,140900 +140928,五寨县,4,140900 +140929,岢岚县,4,140900 +140930,河曲县,4,140900 +140931,保德县,4,140900 +140932,偏关县,4,140900 +140971,五台山风景名胜区,4,140900 +140981,原平市,4,140900 +141002,尧都区,4,141000 +141021,曲沃县,4,141000 +141022,翼城县,4,141000 +141023,襄汾县,4,141000 +141024,洪洞县,4,141000 +141025,古县,4,141000 +141026,安泽县,4,141000 +141027,浮山县,4,141000 +141028,吉县,4,141000 +141029,乡宁县,4,141000 +141030,大宁县,4,141000 +141031,隰县,4,141000 +141032,永和县,4,141000 +141033,蒲县,4,141000 +141034,汾西县,4,141000 +141081,侯马市,4,141000 +141082,霍州市,4,141000 +141102,离石区,4,141100 +141121,文水县,4,141100 +141122,交城县,4,141100 +141123,兴县,4,141100 +141124,临县,4,141100 +141125,柳林县,4,141100 +141126,石楼县,4,141100 +141127,岚县,4,141100 +141128,方山县,4,141100 +141129,中阳县,4,141100 +141130,交口县,4,141100 +141181,孝义市,4,141100 +141182,汾阳市,4,141100 +150102,新城区,4,150100 +150103,回民区,4,150100 +150104,玉泉区,4,150100 +150105,赛罕区,4,150100 +150121,土默特左旗,4,150100 +150122,托克托县,4,150100 +150123,和林格尔县,4,150100 +150124,清水河县,4,150100 +150125,武川县,4,150100 +150172,呼和浩特经济技术开发区,4,150100 +150202,东河区,4,150200 +150203,昆都仑区,4,150200 +150204,青山区,4,150200 +150205,石拐区,4,150200 +150206,白云鄂博矿区,4,150200 +150207,九原区,4,150200 +150221,土默特右旗,4,150200 +150222,固阳县,4,150200 +150223,达尔罕茂明安联合旗,4,150200 +150271,包头稀土高新技术产业开发区,4,150200 +150302,海勃湾区,4,150300 +150303,海南区,4,150300 +150304,乌达区,4,150300 +150402,红山区,4,150400 +150403,元宝山区,4,150400 +150404,松山区,4,150400 +150421,阿鲁科尔沁旗,4,150400 +150422,巴林左旗,4,150400 +150423,巴林右旗,4,150400 +150424,林西县,4,150400 +150425,克什克腾旗,4,150400 +150426,翁牛特旗,4,150400 +150428,喀喇沁旗,4,150400 +150429,宁城县,4,150400 +150430,敖汉旗,4,150400 +150502,科尔沁区,4,150500 +150521,科尔沁左翼中旗,4,150500 +150522,科尔沁左翼后旗,4,150500 +150523,开鲁县,4,150500 +150524,库伦旗,4,150500 +150525,奈曼旗,4,150500 +150526,扎鲁特旗,4,150500 +150571,通辽经济技术开发区,4,150500 +150581,霍林郭勒市,4,150500 +150602,东胜区,4,150600 +150603,康巴什区,4,150600 +150621,达拉特旗,4,150600 +150622,准格尔旗,4,150600 +150623,鄂托克前旗,4,150600 +150624,鄂托克旗,4,150600 +150625,杭锦旗,4,150600 +150626,乌审旗,4,150600 +150627,伊金霍洛旗,4,150600 +150702,海拉尔区,4,150700 +150703,扎赉诺尔区,4,150700 +150721,阿荣旗,4,150700 +150722,莫力达瓦达斡尔族自治旗,4,150700 +150723,鄂伦春自治旗,4,150700 +150724,鄂温克族自治旗,4,150700 +150725,陈巴尔虎旗,4,150700 +150726,新巴尔虎左旗,4,150700 +150727,新巴尔虎右旗,4,150700 +150781,满洲里市,4,150700 +150782,牙克石市,4,150700 +150783,扎兰屯市,4,150700 +150784,额尔古纳市,4,150700 +150785,根河市,4,150700 +150802,临河区,4,150800 +150821,五原县,4,150800 +150822,磴口县,4,150800 +150823,乌拉特前旗,4,150800 +150824,乌拉特中旗,4,150800 +150825,乌拉特后旗,4,150800 +150826,杭锦后旗,4,150800 +150902,集宁区,4,150900 +150921,卓资县,4,150900 +150922,化德县,4,150900 +150923,商都县,4,150900 +150924,兴和县,4,150900 +150925,凉城县,4,150900 +150926,察哈尔右翼前旗,4,150900 +150927,察哈尔右翼中旗,4,150900 +150928,察哈尔右翼后旗,4,150900 +150929,四子王旗,4,150900 +150981,丰镇市,4,150900 +152201,乌兰浩特市,4,152200 +152202,阿尔山市,4,152200 +152221,科尔沁右翼前旗,4,152200 +152222,科尔沁右翼中旗,4,152200 +152223,扎赉特旗,4,152200 +152224,突泉县,4,152200 +152501,二连浩特市,4,152500 +152502,锡林浩特市,4,152500 +152522,阿巴嘎旗,4,152500 +152523,苏尼特左旗,4,152500 +152524,苏尼特右旗,4,152500 +152525,东乌珠穆沁旗,4,152500 +152526,西乌珠穆沁旗,4,152500 +152527,太仆寺旗,4,152500 +152528,镶黄旗,4,152500 +152529,正镶白旗,4,152500 +152530,正蓝旗,4,152500 +152531,多伦县,4,152500 +152571,乌拉盖管委会,4,152500 +152921,阿拉善左旗,4,152900 +152922,阿拉善右旗,4,152900 +152923,额济纳旗,4,152900 +152971,内蒙古阿拉善高新技术产业开发区,4,152900 +210102,和平区,4,210100 +210103,沈河区,4,210100 +210104,大东区,4,210100 +210105,皇姑区,4,210100 +210106,铁西区,4,210100 +210111,苏家屯区,4,210100 +210112,浑南区,4,210100 +210113,沈北新区,4,210100 +210114,于洪区,4,210100 +210115,辽中区,4,210100 +210123,康平县,4,210100 +210124,法库县,4,210100 +210181,新民市,4,210100 +210202,中山区,4,210200 +210203,西岗区,4,210200 +210204,沙河口区,4,210200 +210211,甘井子区,4,210200 +210212,旅顺口区,4,210200 +210213,金州区,4,210200 +210214,普兰店区,4,210200 +210224,长海县,4,210200 +210281,瓦房店市,4,210200 +210283,庄河市,4,210200 +210302,铁东区,4,210300 +210303,铁西区,4,210300 +210304,立山区,4,210300 +210311,千山区,4,210300 +210321,台安县,4,210300 +210323,岫岩满族自治县,4,210300 +210381,海城市,4,210300 +210402,新抚区,4,210400 +210403,东洲区,4,210400 +210404,望花区,4,210400 +210411,顺城区,4,210400 +210421,抚顺县,4,210400 +210422,新宾满族自治县,4,210400 +210423,清原满族自治县,4,210400 +210502,平山区,4,210500 +210503,溪湖区,4,210500 +210504,明山区,4,210500 +210505,南芬区,4,210500 +210521,本溪满族自治县,4,210500 +210522,桓仁满族自治县,4,210500 +210602,元宝区,4,210600 +210603,振兴区,4,210600 +210604,振安区,4,210600 +210624,宽甸满族自治县,4,210600 +210681,东港市,4,210600 +210682,凤城市,4,210600 +210702,古塔区,4,210700 +210703,凌河区,4,210700 +210711,太和区,4,210700 +210726,黑山县,4,210700 +210727,义县,4,210700 +210781,凌海市,4,210700 +210782,北镇市,4,210700 +210802,站前区,4,210800 +210803,西市区,4,210800 +210804,鲅鱼圈区,4,210800 +210811,老边区,4,210800 +210881,盖州市,4,210800 +210882,大石桥市,4,210800 +210902,海州区,4,210900 +210903,新邱区,4,210900 +210904,太平区,4,210900 +210905,清河门区,4,210900 +210911,细河区,4,210900 +210921,阜新蒙古族自治县,4,210900 +210922,彰武县,4,210900 +211002,白塔区,4,211000 +211003,文圣区,4,211000 +211004,宏伟区,4,211000 +211005,弓长岭区,4,211000 +211011,太子河区,4,211000 +211021,辽阳县,4,211000 +211081,灯塔市,4,211000 +211102,双台子区,4,211100 +211103,兴隆台区,4,211100 +211104,大洼区,4,211100 +211122,盘山县,4,211100 +211202,银州区,4,211200 +211204,清河区,4,211200 +211221,铁岭县,4,211200 +211223,西丰县,4,211200 +211224,昌图县,4,211200 +211281,调兵山市,4,211200 +211282,开原市,4,211200 +211302,双塔区,4,211300 +211303,龙城区,4,211300 +211321,朝阳县,4,211300 +211322,建平县,4,211300 +211324,喀喇沁左翼蒙古族自治县,4,211300 +211381,北票市,4,211300 +211382,凌源市,4,211300 +211402,连山区,4,211400 +211403,龙港区,4,211400 +211404,南票区,4,211400 +211421,绥中县,4,211400 +211422,建昌县,4,211400 +211481,兴城市,4,211400 +220102,南关区,4,220100 +220103,宽城区,4,220100 +220104,朝阳区,4,220100 +220105,二道区,4,220100 +220106,绿园区,4,220100 +220112,双阳区,4,220100 +220113,九台区,4,220100 +220122,农安县,4,220100 +220171,长春经济技术开发区,4,220100 +220172,长春净月高新技术产业开发区,4,220100 +220173,长春高新技术产业开发区,4,220100 +220174,长春汽车经济技术开发区,4,220100 +220182,榆树市,4,220100 +220183,德惠市,4,220100 +220184,公主岭市,4,220100 +220202,昌邑区,4,220200 +220203,龙潭区,4,220200 +220204,船营区,4,220200 +220211,丰满区,4,220200 +220221,永吉县,4,220200 +220271,吉林经济开发区,4,220200 +220272,吉林高新技术产业开发区,4,220200 +220273,吉林中国新加坡食品区,4,220200 +220281,蛟河市,4,220200 +220282,桦甸市,4,220200 +220283,舒兰市,4,220200 +220284,磐石市,4,220200 +220302,铁西区,4,220300 +220303,铁东区,4,220300 +220322,梨树县,4,220300 +220323,伊通满族自治县,4,220300 +220382,双辽市,4,220300 +220402,龙山区,4,220400 +220403,西安区,4,220400 +220421,东丰县,4,220400 +220422,东辽县,4,220400 +220502,东昌区,4,220500 +220503,二道江区,4,220500 +220521,通化县,4,220500 +220523,辉南县,4,220500 +220524,柳河县,4,220500 +220581,梅河口市,4,220500 +220582,集安市,4,220500 +220602,浑江区,4,220600 +220605,江源区,4,220600 +220621,抚松县,4,220600 +220622,靖宇县,4,220600 +220623,长白朝鲜族自治县,4,220600 +220681,临江市,4,220600 +220702,宁江区,4,220700 +220721,前郭尔罗斯蒙古族自治县,4,220700 +220722,长岭县,4,220700 +220723,乾安县,4,220700 +220771,吉林松原经济开发区,4,220700 +220781,扶余市,4,220700 +220802,洮北区,4,220800 +220821,镇赉县,4,220800 +220822,通榆县,4,220800 +220871,吉林白城经济开发区,4,220800 +220881,洮南市,4,220800 +220882,大安市,4,220800 +222401,延吉市,4,222400 +222402,图们市,4,222400 +222403,敦化市,4,222400 +222404,珲春市,4,222400 +222405,龙井市,4,222400 +222406,和龙市,4,222400 +222424,汪清县,4,222400 +222426,安图县,4,222400 +230102,道里区,4,230100 +230103,南岗区,4,230100 +230104,道外区,4,230100 +230108,平房区,4,230100 +230109,松北区,4,230100 +230110,香坊区,4,230100 +230111,呼兰区,4,230100 +230112,阿城区,4,230100 +230113,双城区,4,230100 +230123,依兰县,4,230100 +230124,方正县,4,230100 +230125,宾县,4,230100 +230126,巴彦县,4,230100 +230127,木兰县,4,230100 +230128,通河县,4,230100 +230129,延寿县,4,230100 +230183,尚志市,4,230100 +230184,五常市,4,230100 +230202,龙沙区,4,230200 +230203,建华区,4,230200 +230204,铁锋区,4,230200 +230205,昂昂溪区,4,230200 +230206,富拉尔基区,4,230200 +230207,碾子山区,4,230200 +230208,梅里斯达斡尔族区,4,230200 +230221,龙江县,4,230200 +230223,依安县,4,230200 +230224,泰来县,4,230200 +230225,甘南县,4,230200 +230227,富裕县,4,230200 +230229,克山县,4,230200 +230230,克东县,4,230200 +230231,拜泉县,4,230200 +230281,讷河市,4,230200 +230302,鸡冠区,4,230300 +230303,恒山区,4,230300 +230304,滴道区,4,230300 +230305,梨树区,4,230300 +230306,城子河区,4,230300 +230307,麻山区,4,230300 +230321,鸡东县,4,230300 +230381,虎林市,4,230300 +230382,密山市,4,230300 +230402,向阳区,4,230400 +230403,工农区,4,230400 +230404,南山区,4,230400 +230405,兴安区,4,230400 +230406,东山区,4,230400 +230407,兴山区,4,230400 +230421,萝北县,4,230400 +230422,绥滨县,4,230400 +230502,尖山区,4,230500 +230503,岭东区,4,230500 +230505,四方台区,4,230500 +230506,宝山区,4,230500 +230521,集贤县,4,230500 +230522,友谊县,4,230500 +230523,宝清县,4,230500 +230524,饶河县,4,230500 +230602,萨尔图区,4,230600 +230603,龙凤区,4,230600 +230604,让胡路区,4,230600 +230605,红岗区,4,230600 +230606,大同区,4,230600 +230621,肇州县,4,230600 +230622,肇源县,4,230600 +230623,林甸县,4,230600 +230624,杜尔伯特蒙古族自治县,4,230600 +230671,大庆高新技术产业开发区,4,230600 +230717,伊美区,4,230700 +230718,乌翠区,4,230700 +230719,友好区,4,230700 +230722,嘉荫县,4,230700 +230723,汤旺县,4,230700 +230724,丰林县,4,230700 +230725,大箐山县,4,230700 +230726,南岔县,4,230700 +230751,金林区,4,230700 +230781,铁力市,4,230700 +230803,向阳区,4,230800 +230804,前进区,4,230800 +230805,东风区,4,230800 +230811,郊区,4,230800 +230822,桦南县,4,230800 +230826,桦川县,4,230800 +230828,汤原县,4,230800 +230881,同江市,4,230800 +230882,富锦市,4,230800 +230883,抚远市,4,230800 +230902,新兴区,4,230900 +230903,桃山区,4,230900 +230904,茄子河区,4,230900 +230921,勃利县,4,230900 +231002,东安区,4,231000 +231003,阳明区,4,231000 +231004,爱民区,4,231000 +231005,西安区,4,231000 +231025,林口县,4,231000 +231071,牡丹江经济技术开发区,4,231000 +231081,绥芬河市,4,231000 +231083,海林市,4,231000 +231084,宁安市,4,231000 +231085,穆棱市,4,231000 +231086,东宁市,4,231000 +231102,爱辉区,4,231100 +231123,逊克县,4,231100 +231124,孙吴县,4,231100 +231181,北安市,4,231100 +231182,五大连池市,4,231100 +231183,嫩江市,4,231100 +231202,北林区,4,231200 +231221,望奎县,4,231200 +231222,兰西县,4,231200 +231223,青冈县,4,231200 +231224,庆安县,4,231200 +231225,明水县,4,231200 +231226,绥棱县,4,231200 +231281,安达市,4,231200 +231282,肇东市,4,231200 +231283,海伦市,4,231200 +232701,漠河市,4,232700 +232721,呼玛县,4,232700 +232722,塔河县,4,232700 +232761,加格达奇区,4,232700 +232762,松岭区,4,232700 +232763,新林区,4,232700 +232764,呼中区,4,232700 +310101,黄浦区,4,310100 +310104,徐汇区,4,310100 +310105,长宁区,4,310100 +310106,静安区,4,310100 +310107,普陀区,4,310100 +310109,虹口区,4,310100 +310110,杨浦区,4,310100 +310112,闵行区,4,310100 +310113,宝山区,4,310100 +310114,嘉定区,4,310100 +310115,浦东新区,4,310100 +310116,金山区,4,310100 +310117,松江区,4,310100 +310118,青浦区,4,310100 +310120,奉贤区,4,310100 +310151,崇明区,4,310100 +320102,玄武区,4,320100 +320104,秦淮区,4,320100 +320105,建邺区,4,320100 +320106,鼓楼区,4,320100 +320111,浦口区,4,320100 +320113,栖霞区,4,320100 +320114,雨花台区,4,320100 +320115,江宁区,4,320100 +320116,六合区,4,320100 +320117,溧水区,4,320100 +320118,高淳区,4,320100 +320205,锡山区,4,320200 +320206,惠山区,4,320200 +320211,滨湖区,4,320200 +320213,梁溪区,4,320200 +320214,新吴区,4,320200 +320281,江阴市,4,320200 +320282,宜兴市,4,320200 +320302,鼓楼区,4,320300 +320303,云龙区,4,320300 +320305,贾汪区,4,320300 +320311,泉山区,4,320300 +320312,铜山区,4,320300 +320321,丰县,4,320300 +320322,沛县,4,320300 +320324,睢宁县,4,320300 +320371,徐州经济技术开发区,4,320300 +320381,新沂市,4,320300 +320382,邳州市,4,320300 +320402,天宁区,4,320400 +320404,钟楼区,4,320400 +320411,新北区,4,320400 +320412,武进区,4,320400 +320413,金坛区,4,320400 +320481,溧阳市,4,320400 +320505,虎丘区,4,320500 +320506,吴中区,4,320500 +320507,相城区,4,320500 +320508,姑苏区,4,320500 +320509,吴江区,4,320500 +320571,苏州工业园区,4,320500 +320581,常熟市,4,320500 +320582,张家港市,4,320500 +320583,昆山市,4,320500 +320585,太仓市,4,320500 +320612,通州区,4,320600 +320613,崇川区,4,320600 +320614,海门区,4,320600 +320623,如东县,4,320600 +320671,南通经济技术开发区,4,320600 +320681,启东市,4,320600 +320682,如皋市,4,320600 +320685,海安市,4,320600 +320703,连云区,4,320700 +320706,海州区,4,320700 +320707,赣榆区,4,320700 +320722,东海县,4,320700 +320723,灌云县,4,320700 +320724,灌南县,4,320700 +320771,连云港经济技术开发区,4,320700 +320772,连云港高新技术产业开发区,4,320700 +320803,淮安区,4,320800 +320804,淮阴区,4,320800 +320812,清江浦区,4,320800 +320813,洪泽区,4,320800 +320826,涟水县,4,320800 +320830,盱眙县,4,320800 +320831,金湖县,4,320800 +320871,淮安经济技术开发区,4,320800 +320902,亭湖区,4,320900 +320903,盐都区,4,320900 +320904,大丰区,4,320900 +320921,响水县,4,320900 +320922,滨海县,4,320900 +320923,阜宁县,4,320900 +320924,射阳县,4,320900 +320925,建湖县,4,320900 +320971,盐城经济技术开发区,4,320900 +320981,东台市,4,320900 +321002,广陵区,4,321000 +321003,邗江区,4,321000 +321012,江都区,4,321000 +321023,宝应县,4,321000 +321071,扬州经济技术开发区,4,321000 +321081,仪征市,4,321000 +321084,高邮市,4,321000 +321102,京口区,4,321100 +321111,润州区,4,321100 +321112,丹徒区,4,321100 +321171,镇江新区,4,321100 +321181,丹阳市,4,321100 +321182,扬中市,4,321100 +321183,句容市,4,321100 +321202,海陵区,4,321200 +321203,高港区,4,321200 +321204,姜堰区,4,321200 +321271,泰州医药高新技术产业开发区,4,321200 +321281,兴化市,4,321200 +321282,靖江市,4,321200 +321283,泰兴市,4,321200 +321302,宿城区,4,321300 +321311,宿豫区,4,321300 +321322,沭阳县,4,321300 +321323,泗阳县,4,321300 +321324,泗洪县,4,321300 +321371,宿迁经济技术开发区,4,321300 +330102,上城区,4,330100 +330105,拱墅区,4,330100 +330106,西湖区,4,330100 +330108,滨江区,4,330100 +330109,萧山区,4,330100 +330110,余杭区,4,330100 +330111,富阳区,4,330100 +330112,临安区,4,330100 +330113,临平区,4,330100 +330114,钱塘区,4,330100 +330122,桐庐县,4,330100 +330127,淳安县,4,330100 +330182,建德市,4,330100 +330203,海曙区,4,330200 +330205,江北区,4,330200 +330206,北仑区,4,330200 +330211,镇海区,4,330200 +330212,鄞州区,4,330200 +330213,奉化区,4,330200 +330225,象山县,4,330200 +330226,宁海县,4,330200 +330281,余姚市,4,330200 +330282,慈溪市,4,330200 +330302,鹿城区,4,330300 +330303,龙湾区,4,330300 +330304,瓯海区,4,330300 +330305,洞头区,4,330300 +330324,永嘉县,4,330300 +330326,平阳县,4,330300 +330327,苍南县,4,330300 +330328,文成县,4,330300 +330329,泰顺县,4,330300 +330371,温州经济技术开发区,4,330300 +330381,瑞安市,4,330300 +330382,乐清市,4,330300 +330383,龙港市,4,330300 +330402,南湖区,4,330400 +330411,秀洲区,4,330400 +330421,嘉善县,4,330400 +330424,海盐县,4,330400 +330481,海宁市,4,330400 +330482,平湖市,4,330400 +330483,桐乡市,4,330400 +330502,吴兴区,4,330500 +330503,南浔区,4,330500 +330521,德清县,4,330500 +330522,长兴县,4,330500 +330523,安吉县,4,330500 +330602,越城区,4,330600 +330603,柯桥区,4,330600 +330604,上虞区,4,330600 +330624,新昌县,4,330600 +330681,诸暨市,4,330600 +330683,嵊州市,4,330600 +330702,婺城区,4,330700 +330703,金东区,4,330700 +330723,武义县,4,330700 +330726,浦江县,4,330700 +330727,磐安县,4,330700 +330781,兰溪市,4,330700 +330782,义乌市,4,330700 +330783,东阳市,4,330700 +330784,永康市,4,330700 +330802,柯城区,4,330800 +330803,衢江区,4,330800 +330822,常山县,4,330800 +330824,开化县,4,330800 +330825,龙游县,4,330800 +330881,江山市,4,330800 +330902,定海区,4,330900 +330903,普陀区,4,330900 +330921,岱山县,4,330900 +330922,嵊泗县,4,330900 +331002,椒江区,4,331000 +331003,黄岩区,4,331000 +331004,路桥区,4,331000 +331022,三门县,4,331000 +331023,天台县,4,331000 +331024,仙居县,4,331000 +331081,温岭市,4,331000 +331082,临海市,4,331000 +331083,玉环市,4,331000 +331102,莲都区,4,331100 +331121,青田县,4,331100 +331122,缙云县,4,331100 +331123,遂昌县,4,331100 +331124,松阳县,4,331100 +331125,云和县,4,331100 +331126,庆元县,4,331100 +331127,景宁畲族自治县,4,331100 +331181,龙泉市,4,331100 +340102,瑶海区,4,340100 +340103,庐阳区,4,340100 +340104,蜀山区,4,340100 +340111,包河区,4,340100 +340121,长丰县,4,340100 +340122,肥东县,4,340100 +340123,肥西县,4,340100 +340124,庐江县,4,340100 +340171,合肥高新技术产业开发区,4,340100 +340172,合肥经济技术开发区,4,340100 +340173,合肥新站高新技术产业开发区,4,340100 +340181,巢湖市,4,340100 +340202,镜湖区,4,340200 +340207,鸠江区,4,340200 +340209,弋江区,4,340200 +340210,湾沚区,4,340200 +340212,繁昌区,4,340200 +340223,南陵县,4,340200 +340271,芜湖经济技术开发区,4,340200 +340272,安徽芜湖三山经济开发区,4,340200 +340281,无为市,4,340200 +340302,龙子湖区,4,340300 +340303,蚌山区,4,340300 +340304,禹会区,4,340300 +340311,淮上区,4,340300 +340321,怀远县,4,340300 +340322,五河县,4,340300 +340323,固镇县,4,340300 +340371,蚌埠市高新技术开发区,4,340300 +340372,蚌埠市经济开发区,4,340300 +340402,大通区,4,340400 +340403,田家庵区,4,340400 +340404,谢家集区,4,340400 +340405,八公山区,4,340400 +340406,潘集区,4,340400 +340421,凤台县,4,340400 +340422,寿县,4,340400 +340503,花山区,4,340500 +340504,雨山区,4,340500 +340506,博望区,4,340500 +340521,当涂县,4,340500 +340522,含山县,4,340500 +340523,和县,4,340500 +340602,杜集区,4,340600 +340603,相山区,4,340600 +340604,烈山区,4,340600 +340621,濉溪县,4,340600 +340705,铜官区,4,340700 +340706,义安区,4,340700 +340711,郊区,4,340700 +340722,枞阳县,4,340700 +340802,迎江区,4,340800 +340803,大观区,4,340800 +340811,宜秀区,4,340800 +340822,怀宁县,4,340800 +340825,太湖县,4,340800 +340826,宿松县,4,340800 +340827,望江县,4,340800 +340828,岳西县,4,340800 +340871,安徽安庆经济开发区,4,340800 +340881,桐城市,4,340800 +340882,潜山市,4,340800 +341002,屯溪区,4,341000 +341003,黄山区,4,341000 +341004,徽州区,4,341000 +341021,歙县,4,341000 +341022,休宁县,4,341000 +341023,黟县,4,341000 +341024,祁门县,4,341000 +341102,琅琊区,4,341100 +341103,南谯区,4,341100 +341122,来安县,4,341100 +341124,全椒县,4,341100 +341125,定远县,4,341100 +341126,凤阳县,4,341100 +341171,中新苏滁高新技术产业开发区,4,341100 +341172,滁州经济技术开发区,4,341100 +341181,天长市,4,341100 +341182,明光市,4,341100 +341202,颍州区,4,341200 +341203,颍东区,4,341200 +341204,颍泉区,4,341200 +341221,临泉县,4,341200 +341222,太和县,4,341200 +341225,阜南县,4,341200 +341226,颍上县,4,341200 +341271,阜阳合肥现代产业园区,4,341200 +341272,阜阳经济技术开发区,4,341200 +341282,界首市,4,341200 +341302,埇桥区,4,341300 +341321,砀山县,4,341300 +341322,萧县,4,341300 +341323,灵璧县,4,341300 +341324,泗县,4,341300 +341371,宿州马鞍山现代产业园区,4,341300 +341372,宿州经济技术开发区,4,341300 +341502,金安区,4,341500 +341503,裕安区,4,341500 +341504,叶集区,4,341500 +341522,霍邱县,4,341500 +341523,舒城县,4,341500 +341524,金寨县,4,341500 +341525,霍山县,4,341500 +341602,谯城区,4,341600 +341621,涡阳县,4,341600 +341622,蒙城县,4,341600 +341623,利辛县,4,341600 +341702,贵池区,4,341700 +341721,东至县,4,341700 +341722,石台县,4,341700 +341723,青阳县,4,341700 +341802,宣州区,4,341800 +341821,郎溪县,4,341800 +341823,泾县,4,341800 +341824,绩溪县,4,341800 +341825,旌德县,4,341800 +341871,宣城市经济开发区,4,341800 +341881,宁国市,4,341800 +341882,广德市,4,341800 +350102,鼓楼区,4,350100 +350103,台江区,4,350100 +350104,仓山区,4,350100 +350105,马尾区,4,350100 +350111,晋安区,4,350100 +350112,长乐区,4,350100 +350121,闽侯县,4,350100 +350122,连江县,4,350100 +350123,罗源县,4,350100 +350124,闽清县,4,350100 +350125,永泰县,4,350100 +350128,平潭县,4,350100 +350181,福清市,4,350100 +350203,思明区,4,350200 +350205,海沧区,4,350200 +350206,湖里区,4,350200 +350211,集美区,4,350200 +350212,同安区,4,350200 +350213,翔安区,4,350200 +350302,城厢区,4,350300 +350303,涵江区,4,350300 +350304,荔城区,4,350300 +350305,秀屿区,4,350300 +350322,仙游县,4,350300 +350404,三元区,4,350400 +350405,沙县区,4,350400 +350421,明溪县,4,350400 +350423,清流县,4,350400 +350424,宁化县,4,350400 +350425,大田县,4,350400 +350426,尤溪县,4,350400 +350428,将乐县,4,350400 +350429,泰宁县,4,350400 +350430,建宁县,4,350400 +350481,永安市,4,350400 +350502,鲤城区,4,350500 +350503,丰泽区,4,350500 +350504,洛江区,4,350500 +350505,泉港区,4,350500 +350521,惠安县,4,350500 +350524,安溪县,4,350500 +350525,永春县,4,350500 +350526,德化县,4,350500 +350527,金门县,4,350500 +350581,石狮市,4,350500 +350582,晋江市,4,350500 +350583,南安市,4,350500 +350602,芗城区,4,350600 +350603,龙文区,4,350600 +350604,龙海区,4,350600 +350605,长泰区,4,350600 +350622,云霄县,4,350600 +350623,漳浦县,4,350600 +350624,诏安县,4,350600 +350626,东山县,4,350600 +350627,南靖县,4,350600 +350628,平和县,4,350600 +350629,华安县,4,350600 +350702,延平区,4,350700 +350703,建阳区,4,350700 +350721,顺昌县,4,350700 +350722,浦城县,4,350700 +350723,光泽县,4,350700 +350724,松溪县,4,350700 +350725,政和县,4,350700 +350781,邵武市,4,350700 +350782,武夷山市,4,350700 +350783,建瓯市,4,350700 +350802,新罗区,4,350800 +350803,永定区,4,350800 +350821,长汀县,4,350800 +350823,上杭县,4,350800 +350824,武平县,4,350800 +350825,连城县,4,350800 +350881,漳平市,4,350800 +350902,蕉城区,4,350900 +350921,霞浦县,4,350900 +350922,古田县,4,350900 +350923,屏南县,4,350900 +350924,寿宁县,4,350900 +350925,周宁县,4,350900 +350926,柘荣县,4,350900 +350981,福安市,4,350900 +350982,福鼎市,4,350900 +360102,东湖区,4,360100 +360103,西湖区,4,360100 +360104,青云谱区,4,360100 +360111,青山湖区,4,360100 +360112,新建区,4,360100 +360113,红谷滩区,4,360100 +360121,南昌县,4,360100 +360123,安义县,4,360100 +360124,进贤县,4,360100 +360202,昌江区,4,360200 +360203,珠山区,4,360200 +360222,浮梁县,4,360200 +360281,乐平市,4,360200 +360302,安源区,4,360300 +360313,湘东区,4,360300 +360321,莲花县,4,360300 +360322,上栗县,4,360300 +360323,芦溪县,4,360300 +360402,濂溪区,4,360400 +360403,浔阳区,4,360400 +360404,柴桑区,4,360400 +360423,武宁县,4,360400 +360424,修水县,4,360400 +360425,永修县,4,360400 +360426,德安县,4,360400 +360428,都昌县,4,360400 +360429,湖口县,4,360400 +360430,彭泽县,4,360400 +360481,瑞昌市,4,360400 +360482,共青城市,4,360400 +360483,庐山市,4,360400 +360502,渝水区,4,360500 +360521,分宜县,4,360500 +360602,月湖区,4,360600 +360603,余江区,4,360600 +360681,贵溪市,4,360600 +360702,章贡区,4,360700 +360703,南康区,4,360700 +360704,赣县区,4,360700 +360722,信丰县,4,360700 +360723,大余县,4,360700 +360724,上犹县,4,360700 +360725,崇义县,4,360700 +360726,安远县,4,360700 +360728,定南县,4,360700 +360729,全南县,4,360700 +360730,宁都县,4,360700 +360731,于都县,4,360700 +360732,兴国县,4,360700 +360733,会昌县,4,360700 +360734,寻乌县,4,360700 +360735,石城县,4,360700 +360781,瑞金市,4,360700 +360783,龙南市,4,360700 +360802,吉州区,4,360800 +360803,青原区,4,360800 +360821,吉安县,4,360800 +360822,吉水县,4,360800 +360823,峡江县,4,360800 +360824,新干县,4,360800 +360825,永丰县,4,360800 +360826,泰和县,4,360800 +360827,遂川县,4,360800 +360828,万安县,4,360800 +360829,安福县,4,360800 +360830,永新县,4,360800 +360881,井冈山市,4,360800 +360902,袁州区,4,360900 +360921,奉新县,4,360900 +360922,万载县,4,360900 +360923,上高县,4,360900 +360924,宜丰县,4,360900 +360925,靖安县,4,360900 +360926,铜鼓县,4,360900 +360981,丰城市,4,360900 +360982,樟树市,4,360900 +360983,高安市,4,360900 +361002,临川区,4,361000 +361003,东乡区,4,361000 +361021,南城县,4,361000 +361022,黎川县,4,361000 +361023,南丰县,4,361000 +361024,崇仁县,4,361000 +361025,乐安县,4,361000 +361026,宜黄县,4,361000 +361027,金溪县,4,361000 +361028,资溪县,4,361000 +361030,广昌县,4,361000 +361102,信州区,4,361100 +361103,广丰区,4,361100 +361104,广信区,4,361100 +361123,玉山县,4,361100 +361124,铅山县,4,361100 +361125,横峰县,4,361100 +361126,弋阳县,4,361100 +361127,余干县,4,361100 +361128,鄱阳县,4,361100 +361129,万年县,4,361100 +361130,婺源县,4,361100 +361181,德兴市,4,361100 +370102,历下区,4,370100 +370103,市中区,4,370100 +370104,槐荫区,4,370100 +370105,天桥区,4,370100 +370112,历城区,4,370100 +370113,长清区,4,370100 +370114,章丘区,4,370100 +370115,济阳区,4,370100 +370116,莱芜区,4,370100 +370117,钢城区,4,370100 +370124,平阴县,4,370100 +370126,商河县,4,370100 +370171,济南高新技术产业开发区,4,370100 +370202,市南区,4,370200 +370203,市北区,4,370200 +370211,黄岛区,4,370200 +370212,崂山区,4,370200 +370213,李沧区,4,370200 +370214,城阳区,4,370200 +370215,即墨区,4,370200 +370271,青岛高新技术产业开发区,4,370200 +370281,胶州市,4,370200 +370283,平度市,4,370200 +370285,莱西市,4,370200 +370302,淄川区,4,370300 +370303,张店区,4,370300 +370304,博山区,4,370300 +370305,临淄区,4,370300 +370306,周村区,4,370300 +370321,桓台县,4,370300 +370322,高青县,4,370300 +370323,沂源县,4,370300 +370402,市中区,4,370400 +370403,薛城区,4,370400 +370404,峄城区,4,370400 +370405,台儿庄区,4,370400 +370406,山亭区,4,370400 +370481,滕州市,4,370400 +370502,东营区,4,370500 +370503,河口区,4,370500 +370505,垦利区,4,370500 +370522,利津县,4,370500 +370523,广饶县,4,370500 +370571,东营经济技术开发区,4,370500 +370572,东营港经济开发区,4,370500 +370602,芝罘区,4,370600 +370611,福山区,4,370600 +370612,牟平区,4,370600 +370613,莱山区,4,370600 +370614,蓬莱区,4,370600 +370671,烟台高新技术产业开发区,4,370600 +370672,烟台经济技术开发区,4,370600 +370681,龙口市,4,370600 +370682,莱阳市,4,370600 +370683,莱州市,4,370600 +370685,招远市,4,370600 +370686,栖霞市,4,370600 +370687,海阳市,4,370600 +370702,潍城区,4,370700 +370703,寒亭区,4,370700 +370704,坊子区,4,370700 +370705,奎文区,4,370700 +370724,临朐县,4,370700 +370725,昌乐县,4,370700 +370772,潍坊滨海经济技术开发区,4,370700 +370781,青州市,4,370700 +370782,诸城市,4,370700 +370783,寿光市,4,370700 +370784,安丘市,4,370700 +370785,高密市,4,370700 +370786,昌邑市,4,370700 +370811,任城区,4,370800 +370812,兖州区,4,370800 +370826,微山县,4,370800 +370827,鱼台县,4,370800 +370828,金乡县,4,370800 +370829,嘉祥县,4,370800 +370830,汶上县,4,370800 +370831,泗水县,4,370800 +370832,梁山县,4,370800 +370871,济宁高新技术产业开发区,4,370800 +370881,曲阜市,4,370800 +370883,邹城市,4,370800 +370902,泰山区,4,370900 +370911,岱岳区,4,370900 +370921,宁阳县,4,370900 +370923,东平县,4,370900 +370982,新泰市,4,370900 +370983,肥城市,4,370900 +371002,环翠区,4,371000 +371003,文登区,4,371000 +371071,威海火炬高技术产业开发区,4,371000 +371072,威海经济技术开发区,4,371000 +371073,威海临港经济技术开发区,4,371000 +371082,荣成市,4,371000 +371083,乳山市,4,371000 +371102,东港区,4,371100 +371103,岚山区,4,371100 +371121,五莲县,4,371100 +371122,莒县,4,371100 +371171,日照经济技术开发区,4,371100 +371302,兰山区,4,371300 +371311,罗庄区,4,371300 +371312,河东区,4,371300 +371321,沂南县,4,371300 +371322,郯城县,4,371300 +371323,沂水县,4,371300 +371324,兰陵县,4,371300 +371325,费县,4,371300 +371326,平邑县,4,371300 +371327,莒南县,4,371300 +371328,蒙阴县,4,371300 +371329,临沭县,4,371300 +371371,临沂高新技术产业开发区,4,371300 +371402,德城区,4,371400 +371403,陵城区,4,371400 +371422,宁津县,4,371400 +371423,庆云县,4,371400 +371424,临邑县,4,371400 +371425,齐河县,4,371400 +371426,平原县,4,371400 +371427,夏津县,4,371400 +371428,武城县,4,371400 +371471,德州经济技术开发区,4,371400 +371472,德州运河经济开发区,4,371400 +371481,乐陵市,4,371400 +371482,禹城市,4,371400 +371502,东昌府区,4,371500 +371503,茌平区,4,371500 +371521,阳谷县,4,371500 +371522,莘县,4,371500 +371524,东阿县,4,371500 +371525,冠县,4,371500 +371526,高唐县,4,371500 +371581,临清市,4,371500 +371602,滨城区,4,371600 +371603,沾化区,4,371600 +371621,惠民县,4,371600 +371622,阳信县,4,371600 +371623,无棣县,4,371600 +371625,博兴县,4,371600 +371681,邹平市,4,371600 +371702,牡丹区,4,371700 +371703,定陶区,4,371700 +371721,曹县,4,371700 +371722,单县,4,371700 +371723,成武县,4,371700 +371724,巨野县,4,371700 +371725,郓城县,4,371700 +371726,鄄城县,4,371700 +371728,东明县,4,371700 +371771,菏泽经济技术开发区,4,371700 +371772,菏泽高新技术开发区,4,371700 +410102,中原区,4,410100 +410103,二七区,4,410100 +410104,管城回族区,4,410100 +410105,金水区,4,410100 +410106,上街区,4,410100 +410108,惠济区,4,410100 +410122,中牟县,4,410100 +410171,郑州经济技术开发区,4,410100 +410172,郑州高新技术产业开发区,4,410100 +410173,郑州航空港经济综合实验区,4,410100 +410181,巩义市,4,410100 +410182,荥阳市,4,410100 +410183,新密市,4,410100 +410184,新郑市,4,410100 +410185,登封市,4,410100 +410202,龙亭区,4,410200 +410203,顺河回族区,4,410200 +410204,鼓楼区,4,410200 +410205,禹王台区,4,410200 +410212,祥符区,4,410200 +410221,杞县,4,410200 +410222,通许县,4,410200 +410223,尉氏县,4,410200 +410225,兰考县,4,410200 +410302,老城区,4,410300 +410303,西工区,4,410300 +410304,瀍河回族区,4,410300 +410305,涧西区,4,410300 +410307,偃师区,4,410300 +410308,孟津区,4,410300 +410311,洛龙区,4,410300 +410323,新安县,4,410300 +410324,栾川县,4,410300 +410325,嵩县,4,410300 +410326,汝阳县,4,410300 +410327,宜阳县,4,410300 +410328,洛宁县,4,410300 +410329,伊川县,4,410300 +410371,洛阳高新技术产业开发区,4,410300 +410402,新华区,4,410400 +410403,卫东区,4,410400 +410404,石龙区,4,410400 +410411,湛河区,4,410400 +410421,宝丰县,4,410400 +410422,叶县,4,410400 +410423,鲁山县,4,410400 +410425,郏县,4,410400 +410471,平顶山高新技术产业开发区,4,410400 +410472,平顶山市城乡一体化示范区,4,410400 +410481,舞钢市,4,410400 +410482,汝州市,4,410400 +410502,文峰区,4,410500 +410503,北关区,4,410500 +410505,殷都区,4,410500 +410506,龙安区,4,410500 +410522,安阳县,4,410500 +410523,汤阴县,4,410500 +410526,滑县,4,410500 +410527,内黄县,4,410500 +410571,安阳高新技术产业开发区,4,410500 +410581,林州市,4,410500 +410602,鹤山区,4,410600 +410603,山城区,4,410600 +410611,淇滨区,4,410600 +410621,浚县,4,410600 +410622,淇县,4,410600 +410671,鹤壁经济技术开发区,4,410600 +410702,红旗区,4,410700 +410703,卫滨区,4,410700 +410704,凤泉区,4,410700 +410711,牧野区,4,410700 +410721,新乡县,4,410700 +410724,获嘉县,4,410700 +410725,原阳县,4,410700 +410726,延津县,4,410700 +410727,封丘县,4,410700 +410771,新乡高新技术产业开发区,4,410700 +410772,新乡经济技术开发区,4,410700 +410773,新乡市平原城乡一体化示范区,4,410700 +410781,卫辉市,4,410700 +410782,辉县市,4,410700 +410783,长垣市,4,410700 +410802,解放区,4,410800 +410803,中站区,4,410800 +410804,马村区,4,410800 +410811,山阳区,4,410800 +410821,修武县,4,410800 +410822,博爱县,4,410800 +410823,武陟县,4,410800 +410825,温县,4,410800 +410871,焦作城乡一体化示范区,4,410800 +410882,沁阳市,4,410800 +410883,孟州市,4,410800 +410902,华龙区,4,410900 +410922,清丰县,4,410900 +410923,南乐县,4,410900 +410926,范县,4,410900 +410927,台前县,4,410900 +410928,濮阳县,4,410900 +410971,河南濮阳工业园区,4,410900 +410972,濮阳经济技术开发区,4,410900 +411002,魏都区,4,411000 +411003,建安区,4,411000 +411024,鄢陵县,4,411000 +411025,襄城县,4,411000 +411071,许昌经济技术开发区,4,411000 +411081,禹州市,4,411000 +411082,长葛市,4,411000 +411102,源汇区,4,411100 +411103,郾城区,4,411100 +411104,召陵区,4,411100 +411121,舞阳县,4,411100 +411122,临颍县,4,411100 +411171,漯河经济技术开发区,4,411100 +411202,湖滨区,4,411200 +411203,陕州区,4,411200 +411221,渑池县,4,411200 +411224,卢氏县,4,411200 +411271,河南三门峡经济开发区,4,411200 +411281,义马市,4,411200 +411282,灵宝市,4,411200 +411302,宛城区,4,411300 +411303,卧龙区,4,411300 +411321,南召县,4,411300 +411322,方城县,4,411300 +411323,西峡县,4,411300 +411324,镇平县,4,411300 +411325,内乡县,4,411300 +411326,淅川县,4,411300 +411327,社旗县,4,411300 +411328,唐河县,4,411300 +411329,新野县,4,411300 +411330,桐柏县,4,411300 +411371,南阳高新技术产业开发区,4,411300 +411372,南阳市城乡一体化示范区,4,411300 +411381,邓州市,4,411300 +411402,梁园区,4,411400 +411403,睢阳区,4,411400 +411421,民权县,4,411400 +411422,睢县,4,411400 +411423,宁陵县,4,411400 +411424,柘城县,4,411400 +411425,虞城县,4,411400 +411426,夏邑县,4,411400 +411471,豫东综合物流产业聚集区,4,411400 +411472,河南商丘经济开发区,4,411400 +411481,永城市,4,411400 +411502,浉河区,4,411500 +411503,平桥区,4,411500 +411521,罗山县,4,411500 +411522,光山县,4,411500 +411523,新县,4,411500 +411524,商城县,4,411500 +411525,固始县,4,411500 +411526,潢川县,4,411500 +411527,淮滨县,4,411500 +411528,息县,4,411500 +411571,信阳高新技术产业开发区,4,411500 +411602,川汇区,4,411600 +411603,淮阳区,4,411600 +411621,扶沟县,4,411600 +411622,西华县,4,411600 +411623,商水县,4,411600 +411624,沈丘县,4,411600 +411625,郸城县,4,411600 +411627,太康县,4,411600 +411628,鹿邑县,4,411600 +411671,河南周口经济开发区,4,411600 +411681,项城市,4,411600 +411702,驿城区,4,411700 +411721,西平县,4,411700 +411722,上蔡县,4,411700 +411723,平舆县,4,411700 +411724,正阳县,4,411700 +411725,确山县,4,411700 +411726,泌阳县,4,411700 +411727,汝南县,4,411700 +411728,遂平县,4,411700 +411729,新蔡县,4,411700 +411771,河南驻马店经济开发区,4,411700 +419001,济源市,4,419000 +420102,江岸区,4,420100 +420103,江汉区,4,420100 +420104,硚口区,4,420100 +420105,汉阳区,4,420100 +420106,武昌区,4,420100 +420107,青山区,4,420100 +420111,洪山区,4,420100 +420112,东西湖区,4,420100 +420113,汉南区,4,420100 +420114,蔡甸区,4,420100 +420115,江夏区,4,420100 +420116,黄陂区,4,420100 +420117,新洲区,4,420100 +420202,黄石港区,4,420200 +420203,西塞山区,4,420200 +420204,下陆区,4,420200 +420205,铁山区,4,420200 +420222,阳新县,4,420200 +420281,大冶市,4,420200 +420302,茅箭区,4,420300 +420303,张湾区,4,420300 +420304,郧阳区,4,420300 +420322,郧西县,4,420300 +420323,竹山县,4,420300 +420324,竹溪县,4,420300 +420325,房县,4,420300 +420381,丹江口市,4,420300 +420502,西陵区,4,420500 +420503,伍家岗区,4,420500 +420504,点军区,4,420500 +420505,猇亭区,4,420500 +420506,夷陵区,4,420500 +420525,远安县,4,420500 +420526,兴山县,4,420500 +420527,秭归县,4,420500 +420528,长阳土家族自治县,4,420500 +420529,五峰土家族自治县,4,420500 +420581,宜都市,4,420500 +420582,当阳市,4,420500 +420583,枝江市,4,420500 +420602,襄城区,4,420600 +420606,樊城区,4,420600 +420607,襄州区,4,420600 +420624,南漳县,4,420600 +420625,谷城县,4,420600 +420626,保康县,4,420600 +420682,老河口市,4,420600 +420683,枣阳市,4,420600 +420684,宜城市,4,420600 +420702,梁子湖区,4,420700 +420703,华容区,4,420700 +420704,鄂城区,4,420700 +420802,东宝区,4,420800 +420804,掇刀区,4,420800 +420822,沙洋县,4,420800 +420881,钟祥市,4,420800 +420882,京山市,4,420800 +420902,孝南区,4,420900 +420921,孝昌县,4,420900 +420922,大悟县,4,420900 +420923,云梦县,4,420900 +420981,应城市,4,420900 +420982,安陆市,4,420900 +420984,汉川市,4,420900 +421002,沙市区,4,421000 +421003,荆州区,4,421000 +421022,公安县,4,421000 +421024,江陵县,4,421000 +421071,荆州经济技术开发区,4,421000 +421081,石首市,4,421000 +421083,洪湖市,4,421000 +421087,松滋市,4,421000 +421088,监利市,4,421000 +421102,黄州区,4,421100 +421121,团风县,4,421100 +421122,红安县,4,421100 +421123,罗田县,4,421100 +421124,英山县,4,421100 +421125,浠水县,4,421100 +421126,蕲春县,4,421100 +421127,黄梅县,4,421100 +421171,龙感湖管理区,4,421100 +421181,麻城市,4,421100 +421182,武穴市,4,421100 +421202,咸安区,4,421200 +421221,嘉鱼县,4,421200 +421222,通城县,4,421200 +421223,崇阳县,4,421200 +421224,通山县,4,421200 +421281,赤壁市,4,421200 +421303,曾都区,4,421300 +421321,随县,4,421300 +421381,广水市,4,421300 +422801,恩施市,4,422800 +422802,利川市,4,422800 +422822,建始县,4,422800 +422823,巴东县,4,422800 +422825,宣恩县,4,422800 +422826,咸丰县,4,422800 +422827,来凤县,4,422800 +422828,鹤峰县,4,422800 +429004,仙桃市,4,429000 +429005,潜江市,4,429000 +429006,天门市,4,429000 +429021,神农架林区,4,429000 +430102,芙蓉区,4,430100 +430103,天心区,4,430100 +430104,岳麓区,4,430100 +430105,开福区,4,430100 +430111,雨花区,4,430100 +430112,望城区,4,430100 +430121,长沙县,4,430100 +430181,浏阳市,4,430100 +430182,宁乡市,4,430100 +430202,荷塘区,4,430200 +430203,芦淞区,4,430200 +430204,石峰区,4,430200 +430211,天元区,4,430200 +430212,渌口区,4,430200 +430223,攸县,4,430200 +430224,茶陵县,4,430200 +430225,炎陵县,4,430200 +430271,云龙示范区,4,430200 +430281,醴陵市,4,430200 +430302,雨湖区,4,430300 +430304,岳塘区,4,430300 +430321,湘潭县,4,430300 +430371,湖南湘潭高新技术产业园区,4,430300 +430372,湘潭昭山示范区,4,430300 +430373,湘潭九华示范区,4,430300 +430381,湘乡市,4,430300 +430382,韶山市,4,430300 +430405,珠晖区,4,430400 +430406,雁峰区,4,430400 +430407,石鼓区,4,430400 +430408,蒸湘区,4,430400 +430412,南岳区,4,430400 +430421,衡阳县,4,430400 +430422,衡南县,4,430400 +430423,衡山县,4,430400 +430424,衡东县,4,430400 +430426,祁东县,4,430400 +430471,衡阳综合保税区,4,430400 +430472,湖南衡阳高新技术产业园区,4,430400 +430473,湖南衡阳松木经济开发区,4,430400 +430481,耒阳市,4,430400 +430482,常宁市,4,430400 +430502,双清区,4,430500 +430503,大祥区,4,430500 +430511,北塔区,4,430500 +430522,新邵县,4,430500 +430523,邵阳县,4,430500 +430524,隆回县,4,430500 +430525,洞口县,4,430500 +430527,绥宁县,4,430500 +430528,新宁县,4,430500 +430529,城步苗族自治县,4,430500 +430581,武冈市,4,430500 +430582,邵东市,4,430500 +430602,岳阳楼区,4,430600 +430603,云溪区,4,430600 +430611,君山区,4,430600 +430621,岳阳县,4,430600 +430623,华容县,4,430600 +430624,湘阴县,4,430600 +430626,平江县,4,430600 +430671,岳阳市屈原管理区,4,430600 +430681,汨罗市,4,430600 +430682,临湘市,4,430600 +430702,武陵区,4,430700 +430703,鼎城区,4,430700 +430721,安乡县,4,430700 +430722,汉寿县,4,430700 +430723,澧县,4,430700 +430724,临澧县,4,430700 +430725,桃源县,4,430700 +430726,石门县,4,430700 +430771,常德市西洞庭管理区,4,430700 +430781,津市市,4,430700 +430802,永定区,4,430800 +430811,武陵源区,4,430800 +430821,慈利县,4,430800 +430822,桑植县,4,430800 +430902,资阳区,4,430900 +430903,赫山区,4,430900 +430921,南县,4,430900 +430922,桃江县,4,430900 +430923,安化县,4,430900 +430971,益阳市大通湖管理区,4,430900 +430972,湖南益阳高新技术产业园区,4,430900 +430981,沅江市,4,430900 +431002,北湖区,4,431000 +431003,苏仙区,4,431000 +431021,桂阳县,4,431000 +431022,宜章县,4,431000 +431023,永兴县,4,431000 +431024,嘉禾县,4,431000 +431025,临武县,4,431000 +431026,汝城县,4,431000 +431027,桂东县,4,431000 +431028,安仁县,4,431000 +431081,资兴市,4,431000 +431102,零陵区,4,431100 +431103,冷水滩区,4,431100 +431122,东安县,4,431100 +431123,双牌县,4,431100 +431124,道县,4,431100 +431125,江永县,4,431100 +431126,宁远县,4,431100 +431127,蓝山县,4,431100 +431128,新田县,4,431100 +431129,江华瑶族自治县,4,431100 +431171,永州经济技术开发区,4,431100 +431173,永州市回龙圩管理区,4,431100 +431181,祁阳市,4,431100 +431202,鹤城区,4,431200 +431221,中方县,4,431200 +431222,沅陵县,4,431200 +431223,辰溪县,4,431200 +431224,溆浦县,4,431200 +431225,会同县,4,431200 +431226,麻阳苗族自治县,4,431200 +431227,新晃侗族自治县,4,431200 +431228,芷江侗族自治县,4,431200 +431229,靖州苗族侗族自治县,4,431200 +431230,通道侗族自治县,4,431200 +431271,怀化市洪江管理区,4,431200 +431281,洪江市,4,431200 +431302,娄星区,4,431300 +431321,双峰县,4,431300 +431322,新化县,4,431300 +431381,冷水江市,4,431300 +431382,涟源市,4,431300 +433101,吉首市,4,433100 +433122,泸溪县,4,433100 +433123,凤凰县,4,433100 +433124,花垣县,4,433100 +433125,保靖县,4,433100 +433126,古丈县,4,433100 +433127,永顺县,4,433100 +433130,龙山县,4,433100 +440103,荔湾区,4,440100 +440104,越秀区,4,440100 +440105,海珠区,4,440100 +440106,天河区,4,440100 +440111,白云区,4,440100 +440112,黄埔区,4,440100 +440113,番禺区,4,440100 +440114,花都区,4,440100 +440115,南沙区,4,440100 +440117,从化区,4,440100 +440118,增城区,4,440100 +440203,武江区,4,440200 +440204,浈江区,4,440200 +440205,曲江区,4,440200 +440222,始兴县,4,440200 +440224,仁化县,4,440200 +440229,翁源县,4,440200 +440232,乳源瑶族自治县,4,440200 +440233,新丰县,4,440200 +440281,乐昌市,4,440200 +440282,南雄市,4,440200 +440303,罗湖区,4,440300 +440304,福田区,4,440300 +440305,南山区,4,440300 +440306,宝安区,4,440300 +440307,龙岗区,4,440300 +440308,盐田区,4,440300 +440309,龙华区,4,440300 +440310,坪山区,4,440300 +440311,光明区,4,440300 +440402,香洲区,4,440400 +440403,斗门区,4,440400 +440404,金湾区,4,440400 +440507,龙湖区,4,440500 +440511,金平区,4,440500 +440512,濠江区,4,440500 +440513,潮阳区,4,440500 +440514,潮南区,4,440500 +440515,澄海区,4,440500 +440523,南澳县,4,440500 +440604,禅城区,4,440600 +440605,南海区,4,440600 +440606,顺德区,4,440600 +440607,三水区,4,440600 +440608,高明区,4,440600 +440703,蓬江区,4,440700 +440704,江海区,4,440700 +440705,新会区,4,440700 +440781,台山市,4,440700 +440783,开平市,4,440700 +440784,鹤山市,4,440700 +440785,恩平市,4,440700 +440802,赤坎区,4,440800 +440803,霞山区,4,440800 +440804,坡头区,4,440800 +440811,麻章区,4,440800 +440823,遂溪县,4,440800 +440825,徐闻县,4,440800 +440881,廉江市,4,440800 +440882,雷州市,4,440800 +440883,吴川市,4,440800 +440902,茂南区,4,440900 +440904,电白区,4,440900 +440981,高州市,4,440900 +440982,化州市,4,440900 +440983,信宜市,4,440900 +441202,端州区,4,441200 +441203,鼎湖区,4,441200 +441204,高要区,4,441200 +441223,广宁县,4,441200 +441224,怀集县,4,441200 +441225,封开县,4,441200 +441226,德庆县,4,441200 +441284,四会市,4,441200 +441302,惠城区,4,441300 +441303,惠阳区,4,441300 +441322,博罗县,4,441300 +441323,惠东县,4,441300 +441324,龙门县,4,441300 +441402,梅江区,4,441400 +441403,梅县区,4,441400 +441422,大埔县,4,441400 +441423,丰顺县,4,441400 +441424,五华县,4,441400 +441426,平远县,4,441400 +441427,蕉岭县,4,441400 +441481,兴宁市,4,441400 +441502,城区,4,441500 +441521,海丰县,4,441500 +441523,陆河县,4,441500 +441581,陆丰市,4,441500 +441602,源城区,4,441600 +441621,紫金县,4,441600 +441622,龙川县,4,441600 +441623,连平县,4,441600 +441624,和平县,4,441600 +441625,东源县,4,441600 +441702,江城区,4,441700 +441704,阳东区,4,441700 +441721,阳西县,4,441700 +441781,阳春市,4,441700 +441802,清城区,4,441800 +441803,清新区,4,441800 +441821,佛冈县,4,441800 +441823,阳山县,4,441800 +441825,连山壮族瑶族自治县,4,441800 +441826,连南瑶族自治县,4,441800 +441881,英德市,4,441800 +441882,连州市,4,441800 +445102,湘桥区,4,445100 +445103,潮安区,4,445100 +445122,饶平县,4,445100 +445202,榕城区,4,445200 +445203,揭东区,4,445200 +445222,揭西县,4,445200 +445224,惠来县,4,445200 +445281,普宁市,4,445200 +445302,云城区,4,445300 +445303,云安区,4,445300 +445321,新兴县,4,445300 +445322,郁南县,4,445300 +445381,罗定市,4,445300 +450102,兴宁区,4,450100 +450103,青秀区,4,450100 +450105,江南区,4,450100 +450107,西乡塘区,4,450100 +450108,良庆区,4,450100 +450109,邕宁区,4,450100 +450110,武鸣区,4,450100 +450123,隆安县,4,450100 +450124,马山县,4,450100 +450125,上林县,4,450100 +450126,宾阳县,4,450100 +450181,横州市,4,450100 +450202,城中区,4,450200 +450203,鱼峰区,4,450200 +450204,柳南区,4,450200 +450205,柳北区,4,450200 +450206,柳江区,4,450200 +450222,柳城县,4,450200 +450223,鹿寨县,4,450200 +450224,融安县,4,450200 +450225,融水苗族自治县,4,450200 +450226,三江侗族自治县,4,450200 +450302,秀峰区,4,450300 +450303,叠彩区,4,450300 +450304,象山区,4,450300 +450305,七星区,4,450300 +450311,雁山区,4,450300 +450312,临桂区,4,450300 +450321,阳朔县,4,450300 +450323,灵川县,4,450300 +450324,全州县,4,450300 +450325,兴安县,4,450300 +450326,永福县,4,450300 +450327,灌阳县,4,450300 +450328,龙胜各族自治县,4,450300 +450329,资源县,4,450300 +450330,平乐县,4,450300 +450332,恭城瑶族自治县,4,450300 +450381,荔浦市,4,450300 +450403,万秀区,4,450400 +450405,长洲区,4,450400 +450406,龙圩区,4,450400 +450421,苍梧县,4,450400 +450422,藤县,4,450400 +450423,蒙山县,4,450400 +450481,岑溪市,4,450400 +450502,海城区,4,450500 +450503,银海区,4,450500 +450512,铁山港区,4,450500 +450521,合浦县,4,450500 +450602,港口区,4,450600 +450603,防城区,4,450600 +450621,上思县,4,450600 +450681,东兴市,4,450600 +450702,钦南区,4,450700 +450703,钦北区,4,450700 +450721,灵山县,4,450700 +450722,浦北县,4,450700 +450802,港北区,4,450800 +450803,港南区,4,450800 +450804,覃塘区,4,450800 +450821,平南县,4,450800 +450881,桂平市,4,450800 +450902,玉州区,4,450900 +450903,福绵区,4,450900 +450921,容县,4,450900 +450922,陆川县,4,450900 +450923,博白县,4,450900 +450924,兴业县,4,450900 +450981,北流市,4,450900 +451002,右江区,4,451000 +451003,田阳区,4,451000 +451022,田东县,4,451000 +451024,德保县,4,451000 +451026,那坡县,4,451000 +451027,凌云县,4,451000 +451028,乐业县,4,451000 +451029,田林县,4,451000 +451030,西林县,4,451000 +451031,隆林各族自治县,4,451000 +451081,靖西市,4,451000 +451082,平果市,4,451000 +451102,八步区,4,451100 +451103,平桂区,4,451100 +451121,昭平县,4,451100 +451122,钟山县,4,451100 +451123,富川瑶族自治县,4,451100 +451202,金城江区,4,451200 +451203,宜州区,4,451200 +451221,南丹县,4,451200 +451222,天峨县,4,451200 +451223,凤山县,4,451200 +451224,东兰县,4,451200 +451225,罗城仫佬族自治县,4,451200 +451226,环江毛南族自治县,4,451200 +451227,巴马瑶族自治县,4,451200 +451228,都安瑶族自治县,4,451200 +451229,大化瑶族自治县,4,451200 +451302,兴宾区,4,451300 +451321,忻城县,4,451300 +451322,象州县,4,451300 +451323,武宣县,4,451300 +451324,金秀瑶族自治县,4,451300 +451381,合山市,4,451300 +451402,江州区,4,451400 +451421,扶绥县,4,451400 +451422,宁明县,4,451400 +451423,龙州县,4,451400 +451424,大新县,4,451400 +451425,天等县,4,451400 +451481,凭祥市,4,451400 +460105,秀英区,4,460100 +460106,龙华区,4,460100 +460107,琼山区,4,460100 +460108,美兰区,4,460100 +460202,海棠区,4,460200 +460203,吉阳区,4,460200 +460204,天涯区,4,460200 +460205,崖州区,4,460200 +460321,西沙群岛,4,460300 +460322,南沙群岛,4,460300 +460323,中沙群岛的岛礁及其海域,4,460300 +469001,五指山市,4,469000 +469002,琼海市,4,469000 +469005,文昌市,4,469000 +469006,万宁市,4,469000 +469007,东方市,4,469000 +469021,定安县,4,469000 +469022,屯昌县,4,469000 +469023,澄迈县,4,469000 +469024,临高县,4,469000 +469025,白沙黎族自治县,4,469000 +469026,昌江黎族自治县,4,469000 +469027,乐东黎族自治县,4,469000 +469028,陵水黎族自治县,4,469000 +469029,保亭黎族苗族自治县,4,469000 +469030,琼中黎族苗族自治县,4,469000 +500101,万州区,4,500100 +500102,涪陵区,4,500100 +500103,渝中区,4,500100 +500104,大渡口区,4,500100 +500105,江北区,4,500100 +500106,沙坪坝区,4,500100 +500107,九龙坡区,4,500100 +500108,南岸区,4,500100 +500109,北碚区,4,500100 +500110,綦江区,4,500100 +500111,大足区,4,500100 +500112,渝北区,4,500100 +500113,巴南区,4,500100 +500114,黔江区,4,500100 +500115,长寿区,4,500100 +500116,江津区,4,500100 +500117,合川区,4,500100 +500118,永川区,4,500100 +500119,南川区,4,500100 +500120,璧山区,4,500100 +500151,铜梁区,4,500100 +500152,潼南区,4,500100 +500153,荣昌区,4,500100 +500154,开州区,4,500100 +500155,梁平区,4,500100 +500156,武隆区,4,500100 +500229,城口县,4,500100 +500230,丰都县,4,500100 +500231,垫江县,4,500100 +500233,忠县,4,500100 +500235,云阳县,4,500100 +500236,奉节县,4,500100 +500237,巫山县,4,500100 +500238,巫溪县,4,500100 +500240,石柱土家族自治县,4,500100 +500241,秀山土家族苗族自治县,4,500100 +500242,酉阳土家族苗族自治县,4,500100 +500243,彭水苗族土家族自治县,4,500100 +510104,锦江区,4,510100 +510105,青羊区,4,510100 +510106,金牛区,4,510100 +510107,武侯区,4,510100 +510108,成华区,4,510100 +510112,龙泉驿区,4,510100 +510113,青白江区,4,510100 +510114,新都区,4,510100 +510115,温江区,4,510100 +510116,双流区,4,510100 +510117,郫都区,4,510100 +510118,新津区,4,510100 +510121,金堂县,4,510100 +510129,大邑县,4,510100 +510131,蒲江县,4,510100 +510181,都江堰市,4,510100 +510182,彭州市,4,510100 +510183,邛崃市,4,510100 +510184,崇州市,4,510100 +510185,简阳市,4,510100 +510302,自流井区,4,510300 +510303,贡井区,4,510300 +510304,大安区,4,510300 +510311,沿滩区,4,510300 +510321,荣县,4,510300 +510322,富顺县,4,510300 +510402,东区,4,510400 +510403,西区,4,510400 +510411,仁和区,4,510400 +510421,米易县,4,510400 +510422,盐边县,4,510400 +510502,江阳区,4,510500 +510503,纳溪区,4,510500 +510504,龙马潭区,4,510500 +510521,泸县,4,510500 +510522,合江县,4,510500 +510524,叙永县,4,510500 +510525,古蔺县,4,510500 +510603,旌阳区,4,510600 +510604,罗江区,4,510600 +510623,中江县,4,510600 +510681,广汉市,4,510600 +510682,什邡市,4,510600 +510683,绵竹市,4,510600 +510703,涪城区,4,510700 +510704,游仙区,4,510700 +510705,安州区,4,510700 +510722,三台县,4,510700 +510723,盐亭县,4,510700 +510725,梓潼县,4,510700 +510726,北川羌族自治县,4,510700 +510727,平武县,4,510700 +510781,江油市,4,510700 +510802,利州区,4,510800 +510811,昭化区,4,510800 +510812,朝天区,4,510800 +510821,旺苍县,4,510800 +510822,青川县,4,510800 +510823,剑阁县,4,510800 +510824,苍溪县,4,510800 +510903,船山区,4,510900 +510904,安居区,4,510900 +510921,蓬溪县,4,510900 +510923,大英县,4,510900 +510981,射洪市,4,510900 +511002,市中区,4,511000 +511011,东兴区,4,511000 +511024,威远县,4,511000 +511025,资中县,4,511000 +511071,内江经济开发区,4,511000 +511083,隆昌市,4,511000 +511102,市中区,4,511100 +511111,沙湾区,4,511100 +511112,五通桥区,4,511100 +511113,金口河区,4,511100 +511123,犍为县,4,511100 +511124,井研县,4,511100 +511126,夹江县,4,511100 +511129,沐川县,4,511100 +511132,峨边彝族自治县,4,511100 +511133,马边彝族自治县,4,511100 +511181,峨眉山市,4,511100 +511302,顺庆区,4,511300 +511303,高坪区,4,511300 +511304,嘉陵区,4,511300 +511321,南部县,4,511300 +511322,营山县,4,511300 +511323,蓬安县,4,511300 +511324,仪陇县,4,511300 +511325,西充县,4,511300 +511381,阆中市,4,511300 +511402,东坡区,4,511400 +511403,彭山区,4,511400 +511421,仁寿县,4,511400 +511423,洪雅县,4,511400 +511424,丹棱县,4,511400 +511425,青神县,4,511400 +511502,翠屏区,4,511500 +511503,南溪区,4,511500 +511504,叙州区,4,511500 +511523,江安县,4,511500 +511524,长宁县,4,511500 +511525,高县,4,511500 +511526,珙县,4,511500 +511527,筠连县,4,511500 +511528,兴文县,4,511500 +511529,屏山县,4,511500 +511602,广安区,4,511600 +511603,前锋区,4,511600 +511621,岳池县,4,511600 +511622,武胜县,4,511600 +511623,邻水县,4,511600 +511681,华蓥市,4,511600 +511702,通川区,4,511700 +511703,达川区,4,511700 +511722,宣汉县,4,511700 +511723,开江县,4,511700 +511724,大竹县,4,511700 +511725,渠县,4,511700 +511771,达州经济开发区,4,511700 +511781,万源市,4,511700 +511802,雨城区,4,511800 +511803,名山区,4,511800 +511822,荥经县,4,511800 +511823,汉源县,4,511800 +511824,石棉县,4,511800 +511825,天全县,4,511800 +511826,芦山县,4,511800 +511827,宝兴县,4,511800 +511902,巴州区,4,511900 +511903,恩阳区,4,511900 +511921,通江县,4,511900 +511922,南江县,4,511900 +511923,平昌县,4,511900 +511971,巴中经济开发区,4,511900 +512002,雁江区,4,512000 +512021,安岳县,4,512000 +512022,乐至县,4,512000 +513201,马尔康市,4,513200 +513221,汶川县,4,513200 +513222,理县,4,513200 +513223,茂县,4,513200 +513224,松潘县,4,513200 +513225,九寨沟县,4,513200 +513226,金川县,4,513200 +513227,小金县,4,513200 +513228,黑水县,4,513200 +513230,壤塘县,4,513200 +513231,阿坝县,4,513200 +513232,若尔盖县,4,513200 +513233,红原县,4,513200 +513301,康定市,4,513300 +513322,泸定县,4,513300 +513323,丹巴县,4,513300 +513324,九龙县,4,513300 +513325,雅江县,4,513300 +513326,道孚县,4,513300 +513327,炉霍县,4,513300 +513328,甘孜县,4,513300 +513329,新龙县,4,513300 +513330,德格县,4,513300 +513331,白玉县,4,513300 +513332,石渠县,4,513300 +513333,色达县,4,513300 +513334,理塘县,4,513300 +513335,巴塘县,4,513300 +513336,乡城县,4,513300 +513337,稻城县,4,513300 +513338,得荣县,4,513300 +513401,西昌市,4,513400 +513402,会理市,4,513400 +513422,木里藏族自治县,4,513400 +513423,盐源县,4,513400 +513424,德昌县,4,513400 +513426,会东县,4,513400 +513427,宁南县,4,513400 +513428,普格县,4,513400 +513429,布拖县,4,513400 +513430,金阳县,4,513400 +513431,昭觉县,4,513400 +513432,喜德县,4,513400 +513433,冕宁县,4,513400 +513434,越西县,4,513400 +513435,甘洛县,4,513400 +513436,美姑县,4,513400 +513437,雷波县,4,513400 +520102,南明区,4,520100 +520103,云岩区,4,520100 +520111,花溪区,4,520100 +520112,乌当区,4,520100 +520113,白云区,4,520100 +520115,观山湖区,4,520100 +520121,开阳县,4,520100 +520122,息烽县,4,520100 +520123,修文县,4,520100 +520181,清镇市,4,520100 +520201,钟山区,4,520200 +520203,六枝特区,4,520200 +520204,水城区,4,520200 +520281,盘州市,4,520200 +520302,红花岗区,4,520300 +520303,汇川区,4,520300 +520304,播州区,4,520300 +520322,桐梓县,4,520300 +520323,绥阳县,4,520300 +520324,正安县,4,520300 +520325,道真仡佬族苗族自治县,4,520300 +520326,务川仡佬族苗族自治县,4,520300 +520327,凤冈县,4,520300 +520328,湄潭县,4,520300 +520329,余庆县,4,520300 +520330,习水县,4,520300 +520381,赤水市,4,520300 +520382,仁怀市,4,520300 +520402,西秀区,4,520400 +520403,平坝区,4,520400 +520422,普定县,4,520400 +520423,镇宁布依族苗族自治县,4,520400 +520424,关岭布依族苗族自治县,4,520400 +520425,紫云苗族布依族自治县,4,520400 +520502,七星关区,4,520500 +520521,大方县,4,520500 +520523,金沙县,4,520500 +520524,织金县,4,520500 +520525,纳雍县,4,520500 +520526,威宁彝族回族苗族自治县,4,520500 +520527,赫章县,4,520500 +520581,黔西市,4,520500 +520602,碧江区,4,520600 +520603,万山区,4,520600 +520621,江口县,4,520600 +520622,玉屏侗族自治县,4,520600 +520623,石阡县,4,520600 +520624,思南县,4,520600 +520625,印江土家族苗族自治县,4,520600 +520626,德江县,4,520600 +520627,沿河土家族自治县,4,520600 +520628,松桃苗族自治县,4,520600 +522301,兴义市,4,522300 +522302,兴仁市,4,522300 +522323,普安县,4,522300 +522324,晴隆县,4,522300 +522325,贞丰县,4,522300 +522326,望谟县,4,522300 +522327,册亨县,4,522300 +522328,安龙县,4,522300 +522601,凯里市,4,522600 +522622,黄平县,4,522600 +522623,施秉县,4,522600 +522624,三穗县,4,522600 +522625,镇远县,4,522600 +522626,岑巩县,4,522600 +522627,天柱县,4,522600 +522628,锦屏县,4,522600 +522629,剑河县,4,522600 +522630,台江县,4,522600 +522631,黎平县,4,522600 +522632,榕江县,4,522600 +522633,从江县,4,522600 +522634,雷山县,4,522600 +522635,麻江县,4,522600 +522636,丹寨县,4,522600 +522701,都匀市,4,522700 +522702,福泉市,4,522700 +522722,荔波县,4,522700 +522723,贵定县,4,522700 +522725,瓮安县,4,522700 +522726,独山县,4,522700 +522727,平塘县,4,522700 +522728,罗甸县,4,522700 +522729,长顺县,4,522700 +522730,龙里县,4,522700 +522731,惠水县,4,522700 +522732,三都水族自治县,4,522700 +530102,五华区,4,530100 +530103,盘龙区,4,530100 +530111,官渡区,4,530100 +530112,西山区,4,530100 +530113,东川区,4,530100 +530114,呈贡区,4,530100 +530115,晋宁区,4,530100 +530124,富民县,4,530100 +530125,宜良县,4,530100 +530126,石林彝族自治县,4,530100 +530127,嵩明县,4,530100 +530128,禄劝彝族苗族自治县,4,530100 +530129,寻甸回族彝族自治县,4,530100 +530181,安宁市,4,530100 +530302,麒麟区,4,530300 +530303,沾益区,4,530300 +530304,马龙区,4,530300 +530322,陆良县,4,530300 +530323,师宗县,4,530300 +530324,罗平县,4,530300 +530325,富源县,4,530300 +530326,会泽县,4,530300 +530381,宣威市,4,530300 +530402,红塔区,4,530400 +530403,江川区,4,530400 +530423,通海县,4,530400 +530424,华宁县,4,530400 +530425,易门县,4,530400 +530426,峨山彝族自治县,4,530400 +530427,新平彝族傣族自治县,4,530400 +530428,元江哈尼族彝族傣族自治县,4,530400 +530481,澄江市,4,530400 +530502,隆阳区,4,530500 +530521,施甸县,4,530500 +530523,龙陵县,4,530500 +530524,昌宁县,4,530500 +530581,腾冲市,4,530500 +530602,昭阳区,4,530600 +530621,鲁甸县,4,530600 +530622,巧家县,4,530600 +530623,盐津县,4,530600 +530624,大关县,4,530600 +530625,永善县,4,530600 +530626,绥江县,4,530600 +530627,镇雄县,4,530600 +530628,彝良县,4,530600 +530629,威信县,4,530600 +530681,水富市,4,530600 +530702,古城区,4,530700 +530721,玉龙纳西族自治县,4,530700 +530722,永胜县,4,530700 +530723,华坪县,4,530700 +530724,宁蒗彝族自治县,4,530700 +530802,思茅区,4,530800 +530821,宁洱哈尼族彝族自治县,4,530800 +530822,墨江哈尼族自治县,4,530800 +530823,景东彝族自治县,4,530800 +530824,景谷傣族彝族自治县,4,530800 +530825,镇沅彝族哈尼族拉祜族自治县,4,530800 +530826,江城哈尼族彝族自治县,4,530800 +530827,孟连傣族拉祜族佤族自治县,4,530800 +530828,澜沧拉祜族自治县,4,530800 +530829,西盟佤族自治县,4,530800 +530902,临翔区,4,530900 +530921,凤庆县,4,530900 +530922,云县,4,530900 +530923,永德县,4,530900 +530924,镇康县,4,530900 +530925,双江拉祜族佤族布朗族傣族自治县,4,530900 +530926,耿马傣族佤族自治县,4,530900 +530927,沧源佤族自治县,4,530900 +532301,楚雄市,4,532300 +532302,禄丰市,4,532300 +532322,双柏县,4,532300 +532323,牟定县,4,532300 +532324,南华县,4,532300 +532325,姚安县,4,532300 +532326,大姚县,4,532300 +532327,永仁县,4,532300 +532328,元谋县,4,532300 +532329,武定县,4,532300 +532501,个旧市,4,532500 +532502,开远市,4,532500 +532503,蒙自市,4,532500 +532504,弥勒市,4,532500 +532523,屏边苗族自治县,4,532500 +532524,建水县,4,532500 +532525,石屏县,4,532500 +532527,泸西县,4,532500 +532528,元阳县,4,532500 +532529,红河县,4,532500 +532530,金平苗族瑶族傣族自治县,4,532500 +532531,绿春县,4,532500 +532532,河口瑶族自治县,4,532500 +532601,文山市,4,532600 +532622,砚山县,4,532600 +532623,西畴县,4,532600 +532624,麻栗坡县,4,532600 +532625,马关县,4,532600 +532626,丘北县,4,532600 +532627,广南县,4,532600 +532628,富宁县,4,532600 +532801,景洪市,4,532800 +532822,勐海县,4,532800 +532823,勐腊县,4,532800 +532901,大理市,4,532900 +532922,漾濞彝族自治县,4,532900 +532923,祥云县,4,532900 +532924,宾川县,4,532900 +532925,弥渡县,4,532900 +532926,南涧彝族自治县,4,532900 +532927,巍山彝族回族自治县,4,532900 +532928,永平县,4,532900 +532929,云龙县,4,532900 +532930,洱源县,4,532900 +532931,剑川县,4,532900 +532932,鹤庆县,4,532900 +533102,瑞丽市,4,533100 +533103,芒市,4,533100 +533122,梁河县,4,533100 +533123,盈江县,4,533100 +533124,陇川县,4,533100 +533301,泸水市,4,533300 +533323,福贡县,4,533300 +533324,贡山独龙族怒族自治县,4,533300 +533325,兰坪白族普米族自治县,4,533300 +533401,香格里拉市,4,533400 +533422,德钦县,4,533400 +533423,维西傈僳族自治县,4,533400 +540102,城关区,4,540100 +540103,堆龙德庆区,4,540100 +540104,达孜区,4,540100 +540121,林周县,4,540100 +540122,当雄县,4,540100 +540123,尼木县,4,540100 +540124,曲水县,4,540100 +540127,墨竹工卡县,4,540100 +540171,格尔木藏青工业园区,4,540100 +540172,拉萨经济技术开发区,4,540100 +540173,西藏文化旅游创意园区,4,540100 +540174,达孜工业园区,4,540100 +540202,桑珠孜区,4,540200 +540221,南木林县,4,540200 +540222,江孜县,4,540200 +540223,定日县,4,540200 +540224,萨迦县,4,540200 +540225,拉孜县,4,540200 +540226,昂仁县,4,540200 +540227,谢通门县,4,540200 +540228,白朗县,4,540200 +540229,仁布县,4,540200 +540230,康马县,4,540200 +540231,定结县,4,540200 +540232,仲巴县,4,540200 +540233,亚东县,4,540200 +540234,吉隆县,4,540200 +540235,聂拉木县,4,540200 +540236,萨嘎县,4,540200 +540237,岗巴县,4,540200 +540302,卡若区,4,540300 +540321,江达县,4,540300 +540322,贡觉县,4,540300 +540323,类乌齐县,4,540300 +540324,丁青县,4,540300 +540325,察雅县,4,540300 +540326,八宿县,4,540300 +540327,左贡县,4,540300 +540328,芒康县,4,540300 +540329,洛隆县,4,540300 +540330,边坝县,4,540300 +540402,巴宜区,4,540400 +540421,工布江达县,4,540400 +540422,米林县,4,540400 +540423,墨脱县,4,540400 +540424,波密县,4,540400 +540425,察隅县,4,540400 +540426,朗县,4,540400 +540502,乃东区,4,540500 +540521,扎囊县,4,540500 +540522,贡嘎县,4,540500 +540523,桑日县,4,540500 +540524,琼结县,4,540500 +540525,曲松县,4,540500 +540526,措美县,4,540500 +540527,洛扎县,4,540500 +540528,加查县,4,540500 +540529,隆子县,4,540500 +540530,错那县,4,540500 +540531,浪卡子县,4,540500 +540602,色尼区,4,540600 +540621,嘉黎县,4,540600 +540622,比如县,4,540600 +540623,聂荣县,4,540600 +540624,安多县,4,540600 +540625,申扎县,4,540600 +540626,索县,4,540600 +540627,班戈县,4,540600 +540628,巴青县,4,540600 +540629,尼玛县,4,540600 +540630,双湖县,4,540600 +542521,普兰县,4,542500 +542522,札达县,4,542500 +542523,噶尔县,4,542500 +542524,日土县,4,542500 +542525,革吉县,4,542500 +542526,改则县,4,542500 +542527,措勤县,4,542500 +610102,新城区,4,610100 +610103,碑林区,4,610100 +610104,莲湖区,4,610100 +610111,灞桥区,4,610100 +610112,未央区,4,610100 +610113,雁塔区,4,610100 +610114,阎良区,4,610100 +610115,临潼区,4,610100 +610116,长安区,4,610100 +610117,高陵区,4,610100 +610118,鄠邑区,4,610100 +610122,蓝田县,4,610100 +610124,周至县,4,610100 +610202,王益区,4,610200 +610203,印台区,4,610200 +610204,耀州区,4,610200 +610222,宜君县,4,610200 +610302,渭滨区,4,610300 +610303,金台区,4,610300 +610304,陈仓区,4,610300 +610305,凤翔区,4,610300 +610323,岐山县,4,610300 +610324,扶风县,4,610300 +610326,眉县,4,610300 +610327,陇县,4,610300 +610328,千阳县,4,610300 +610329,麟游县,4,610300 +610330,凤县,4,610300 +610331,太白县,4,610300 +610402,秦都区,4,610400 +610403,杨陵区,4,610400 +610404,渭城区,4,610400 +610422,三原县,4,610400 +610423,泾阳县,4,610400 +610424,乾县,4,610400 +610425,礼泉县,4,610400 +610426,永寿县,4,610400 +610428,长武县,4,610400 +610429,旬邑县,4,610400 +610430,淳化县,4,610400 +610431,武功县,4,610400 +610481,兴平市,4,610400 +610482,彬州市,4,610400 +610502,临渭区,4,610500 +610503,华州区,4,610500 +610522,潼关县,4,610500 +610523,大荔县,4,610500 +610524,合阳县,4,610500 +610525,澄城县,4,610500 +610526,蒲城县,4,610500 +610527,白水县,4,610500 +610528,富平县,4,610500 +610581,韩城市,4,610500 +610582,华阴市,4,610500 +610602,宝塔区,4,610600 +610603,安塞区,4,610600 +610621,延长县,4,610600 +610622,延川县,4,610600 +610625,志丹县,4,610600 +610626,吴起县,4,610600 +610627,甘泉县,4,610600 +610628,富县,4,610600 +610629,洛川县,4,610600 +610630,宜川县,4,610600 +610631,黄龙县,4,610600 +610632,黄陵县,4,610600 +610681,子长市,4,610600 +610702,汉台区,4,610700 +610703,南郑区,4,610700 +610722,城固县,4,610700 +610723,洋县,4,610700 +610724,西乡县,4,610700 +610725,勉县,4,610700 +610726,宁强县,4,610700 +610727,略阳县,4,610700 +610728,镇巴县,4,610700 +610729,留坝县,4,610700 +610730,佛坪县,4,610700 +610802,榆阳区,4,610800 +610803,横山区,4,610800 +610822,府谷县,4,610800 +610824,靖边县,4,610800 +610825,定边县,4,610800 +610826,绥德县,4,610800 +610827,米脂县,4,610800 +610828,佳县,4,610800 +610829,吴堡县,4,610800 +610830,清涧县,4,610800 +610831,子洲县,4,610800 +610881,神木市,4,610800 +610902,汉滨区,4,610900 +610921,汉阴县,4,610900 +610922,石泉县,4,610900 +610923,宁陕县,4,610900 +610924,紫阳县,4,610900 +610925,岚皋县,4,610900 +610926,平利县,4,610900 +610927,镇坪县,4,610900 +610929,白河县,4,610900 +610981,旬阳市,4,610900 +611002,商州区,4,611000 +611021,洛南县,4,611000 +611022,丹凤县,4,611000 +611023,商南县,4,611000 +611024,山阳县,4,611000 +611025,镇安县,4,611000 +611026,柞水县,4,611000 +620102,城关区,4,620100 +620103,七里河区,4,620100 +620104,西固区,4,620100 +620105,安宁区,4,620100 +620111,红古区,4,620100 +620121,永登县,4,620100 +620122,皋兰县,4,620100 +620123,榆中县,4,620100 +620171,兰州新区,4,620100 +620201,嘉峪关市,4,620200 +620302,金川区,4,620300 +620321,永昌县,4,620300 +620402,白银区,4,620400 +620403,平川区,4,620400 +620421,靖远县,4,620400 +620422,会宁县,4,620400 +620423,景泰县,4,620400 +620502,秦州区,4,620500 +620503,麦积区,4,620500 +620521,清水县,4,620500 +620522,秦安县,4,620500 +620523,甘谷县,4,620500 +620524,武山县,4,620500 +620525,张家川回族自治县,4,620500 +620602,凉州区,4,620600 +620621,民勤县,4,620600 +620622,古浪县,4,620600 +620623,天祝藏族自治县,4,620600 +620702,甘州区,4,620700 +620721,肃南裕固族自治县,4,620700 +620722,民乐县,4,620700 +620723,临泽县,4,620700 +620724,高台县,4,620700 +620725,山丹县,4,620700 +620802,崆峒区,4,620800 +620821,泾川县,4,620800 +620822,灵台县,4,620800 +620823,崇信县,4,620800 +620825,庄浪县,4,620800 +620826,静宁县,4,620800 +620881,华亭市,4,620800 +620902,肃州区,4,620900 +620921,金塔县,4,620900 +620922,瓜州县,4,620900 +620923,肃北蒙古族自治县,4,620900 +620924,阿克塞哈萨克族自治县,4,620900 +620981,玉门市,4,620900 +620982,敦煌市,4,620900 +621002,西峰区,4,621000 +621021,庆城县,4,621000 +621022,环县,4,621000 +621023,华池县,4,621000 +621024,合水县,4,621000 +621025,正宁县,4,621000 +621026,宁县,4,621000 +621027,镇原县,4,621000 +621102,安定区,4,621100 +621121,通渭县,4,621100 +621122,陇西县,4,621100 +621123,渭源县,4,621100 +621124,临洮县,4,621100 +621125,漳县,4,621100 +621126,岷县,4,621100 +621202,武都区,4,621200 +621221,成县,4,621200 +621222,文县,4,621200 +621223,宕昌县,4,621200 +621224,康县,4,621200 +621225,西和县,4,621200 +621226,礼县,4,621200 +621227,徽县,4,621200 +621228,两当县,4,621200 +622901,临夏市,4,622900 +622921,临夏县,4,622900 +622922,康乐县,4,622900 +622923,永靖县,4,622900 +622924,广河县,4,622900 +622925,和政县,4,622900 +622926,东乡族自治县,4,622900 +622927,积石山保安族东乡族撒拉族自治县,4,622900 +623001,合作市,4,623000 +623021,临潭县,4,623000 +623022,卓尼县,4,623000 +623023,舟曲县,4,623000 +623024,迭部县,4,623000 +623025,玛曲县,4,623000 +623026,碌曲县,4,623000 +623027,夏河县,4,623000 +630102,城东区,4,630100 +630103,城中区,4,630100 +630104,城西区,4,630100 +630105,城北区,4,630100 +630106,湟中区,4,630100 +630121,大通回族土族自治县,4,630100 +630123,湟源县,4,630100 +630202,乐都区,4,630200 +630203,平安区,4,630200 +630222,民和回族土族自治县,4,630200 +630223,互助土族自治县,4,630200 +630224,化隆回族自治县,4,630200 +630225,循化撒拉族自治县,4,630200 +632221,门源回族自治县,4,632200 +632222,祁连县,4,632200 +632223,海晏县,4,632200 +632224,刚察县,4,632200 +632301,同仁市,4,632300 +632322,尖扎县,4,632300 +632323,泽库县,4,632300 +632324,河南蒙古族自治县,4,632300 +632521,共和县,4,632500 +632522,同德县,4,632500 +632523,贵德县,4,632500 +632524,兴海县,4,632500 +632525,贵南县,4,632500 +632621,玛沁县,4,632600 +632622,班玛县,4,632600 +632623,甘德县,4,632600 +632624,达日县,4,632600 +632625,久治县,4,632600 +632626,玛多县,4,632600 +632701,玉树市,4,632700 +632722,杂多县,4,632700 +632723,称多县,4,632700 +632724,治多县,4,632700 +632725,囊谦县,4,632700 +632726,曲麻莱县,4,632700 +632801,格尔木市,4,632800 +632802,德令哈市,4,632800 +632803,茫崖市,4,632800 +632821,乌兰县,4,632800 +632822,都兰县,4,632800 +632823,天峻县,4,632800 +632857,大柴旦行政委员会,4,632800 +640104,兴庆区,4,640100 +640105,西夏区,4,640100 +640106,金凤区,4,640100 +640121,永宁县,4,640100 +640122,贺兰县,4,640100 +640181,灵武市,4,640100 +640202,大武口区,4,640200 +640205,惠农区,4,640200 +640221,平罗县,4,640200 +640302,利通区,4,640300 +640303,红寺堡区,4,640300 +640323,盐池县,4,640300 +640324,同心县,4,640300 +640381,青铜峡市,4,640300 +640402,原州区,4,640400 +640422,西吉县,4,640400 +640423,隆德县,4,640400 +640424,泾源县,4,640400 +640425,彭阳县,4,640400 +640502,沙坡头区,4,640500 +640521,中宁县,4,640500 +640522,海原县,4,640500 +650102,天山区,4,650100 +650103,沙依巴克区,4,650100 +650104,新市区,4,650100 +650105,水磨沟区,4,650100 +650106,头屯河区,4,650100 +650107,达坂城区,4,650100 +650109,米东区,4,650100 +650121,乌鲁木齐县,4,650100 +650202,独山子区,4,650200 +650203,克拉玛依区,4,650200 +650204,白碱滩区,4,650200 +650205,乌尔禾区,4,650200 +650402,高昌区,4,650400 +650421,鄯善县,4,650400 +650422,托克逊县,4,650400 +650502,伊州区,4,650500 +650521,巴里坤哈萨克自治县,4,650500 +650522,伊吾县,4,650500 +652301,昌吉市,4,652300 +652302,阜康市,4,652300 +652323,呼图壁县,4,652300 +652324,玛纳斯县,4,652300 +652325,奇台县,4,652300 +652327,吉木萨尔县,4,652300 +652328,木垒哈萨克自治县,4,652300 +652701,博乐市,4,652700 +652702,阿拉山口市,4,652700 +652722,精河县,4,652700 +652723,温泉县,4,652700 +652801,库尔勒市,4,652800 +652822,轮台县,4,652800 +652823,尉犁县,4,652800 +652824,若羌县,4,652800 +652825,且末县,4,652800 +652826,焉耆回族自治县,4,652800 +652827,和静县,4,652800 +652828,和硕县,4,652800 +652829,博湖县,4,652800 +652871,库尔勒经济技术开发区,4,652800 +652901,阿克苏市,4,652900 +652902,库车市,4,652900 +652922,温宿县,4,652900 +652924,沙雅县,4,652900 +652925,新和县,4,652900 +652926,拜城县,4,652900 +652927,乌什县,4,652900 +652928,阿瓦提县,4,652900 +652929,柯坪县,4,652900 +653001,阿图什市,4,653000 +653022,阿克陶县,4,653000 +653023,阿合奇县,4,653000 +653024,乌恰县,4,653000 +653101,喀什市,4,653100 +653121,疏附县,4,653100 +653122,疏勒县,4,653100 +653123,英吉沙县,4,653100 +653124,泽普县,4,653100 +653125,莎车县,4,653100 +653126,叶城县,4,653100 +653127,麦盖提县,4,653100 +653128,岳普湖县,4,653100 +653129,伽师县,4,653100 +653130,巴楚县,4,653100 +653131,塔什库尔干塔吉克自治县,4,653100 +653201,和田市,4,653200 +653221,和田县,4,653200 +653222,墨玉县,4,653200 +653223,皮山县,4,653200 +653224,洛浦县,4,653200 +653225,策勒县,4,653200 +653226,于田县,4,653200 +653227,民丰县,4,653200 +654002,伊宁市,4,654000 +654003,奎屯市,4,654000 +654004,霍尔果斯市,4,654000 +654021,伊宁县,4,654000 +654022,察布查尔锡伯自治县,4,654000 +654023,霍城县,4,654000 +654024,巩留县,4,654000 +654025,新源县,4,654000 +654026,昭苏县,4,654000 +654027,特克斯县,4,654000 +654028,尼勒克县,4,654000 +654201,塔城市,4,654200 +654202,乌苏市,4,654200 +654203,沙湾市,4,654200 +654221,额敏县,4,654200 +654224,托里县,4,654200 +654225,裕民县,4,654200 +654226,和布克赛尔蒙古自治县,4,654200 +654301,阿勒泰市,4,654300 +654321,布尔津县,4,654300 +654322,富蕴县,4,654300 +654323,福海县,4,654300 +654324,哈巴河县,4,654300 +654325,青河县,4,654300 +654326,吉木乃县,4,654300 +659001,石河子市,4,659000 +659002,阿拉尔市,4,659000 +659003,图木舒克市,4,659000 +659004,五家渠市,4,659000 +659005,北屯市,4,659000 +659006,铁门关市,4,659000 +659007,双河市,4,659000 +659008,可克达拉市,4,659000 +659009,昆玉市,4,659000 +659010,胡杨河市,4,659000 +659011,新星市,4,659000 \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb new file mode 100644 index 0000000000000000000000000000000000000000..25522736d3f97c8b375be159b0690dbafbcd9bb8 GIT binary patch literal 6428681 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

!Q+^rEg29Zw~)D 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 z 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

Dc2j6^=a}EBx}~!XpKJ6^@kR9uJ}o_juCB zkB$|^6pj`h1ES$5m`23<^5l%7@8pb8&5GU18AtrKn2sR!Q|Sn*ni*EIqPHI~zbi^q z`>L9+?0YMw__g)(9(7f9vwfvmLl)+Y-bdN%rT0;_G_1r8#P3lz)f$aD>o1Kt+Z{$+ zqstKrqZ{``#SvPyW>l?Y;fL}Ro!7wjN#z+VGy@a7>Nq#kig{5LQFV!`BmE(BvNW3P z`O;`wo#@Xno*FquSQS83cB*Mr8bYyOLwU;;YNd{4!AR*gf|xS79-{;oQz9(W|= zLH5L2HPY!7U0-W1je)sEd&4LcM+#`@@s{@u?(&EJz1BmoL)lAr$88H9K=9HrWLr4r z3rA5g8Wm@Pn;!hUfw_}^ZSfedE>khGiYo1`y39|hr@Bl<4_Hu$AdH%~v*(VfQ`^9t zTVO3NyF9ZrJW?L)wIaTRE6L%=;ut;fY#@21^(U7Iv1o35UETjb+|c zFZWWZJhL=kpU|tpi_VU0AMOr@^P_RM1q~~vK8eUSyaN`WCSV)Rk&3e+(C}%(io&x- zFvK8QdM>p1nhxR(U(@MFc^-?P15oxF?4d)V{G8^tTSfJW#uPk+&os>aef)jdGItN0 z!?s6rSsub{X708h$iqj--S5Yu#p;9@42o-u_Q@|2JaF#+v=XIJcwh~Pwq&oTVSje& zeOB^Jjw_HqmDkYMdJMO&es3Vx{A-G}kn5|DA}WuAWGxY|DabBnSc{-X@lmS?a~s}uZQavoOM7ym2+UJL(KaV~gbS`k#+znVP1 zsg5Vz-t^p*moR@;pbh#-!If$cR~fZ3tTAhHJO0bewX);7BY$Dl;q@bx4cCu`qdG=Z zme-VI*KRd1xO;watoIlsNAo>TliQjHAhgnBIu$3*t zYQ18aY5pkIO6q=S{&3a+^%`jY;MQ8|L1-(7_6?B?gYYN2MyNNthb`1KX#Rv(oqE*m z$EbHhGlD(T4d36SZb83@_wF`z7g`ZmM#fyVlvw!ZII*2dXUow8jpd>KCUqA&{KOcE z8G)%3l_jF#hsR>e@I&V@V+%@Un>r(j?buT#JCl08Ft*%>(%A~OVTHxVl1=I(&>Y31 z)NlL#cc_m+GxFoqmiA?g=3Qz_)d%lUpMYkoPEt=ovuCHMTW;T`?m~y3Un8+5fH7un zTOyXS3%webWe;X6(cYaa%@^;RK1;m|ns+TnsV&w1G3w`_dDroI>fLU?hx!F*^NXYN zMUrulIp_)M{m`uO0CfYJ_dT1`N1%C6_$c);Xx{ZcPW_(mKS6y8n*QFWo`hBeQzRdN z@E-n$)Th0~8S0OH|5<8F74bRh7BnMjQ%^%Pq8Vzd41_UckD*sTc+9lr_;mLn$!QQi zA9aTMBWOO=^fC2WXg+;)j{1|x!>1(YBXWV{A_$+D`i!~-&1aI@)RuY_mq;vi@;S-n zh+HB0A|hXsOh;sf#8UTjm827qSrSX#=4%p5oqR)b3xut{O>L=K^ewfeUgA3vOYI9c z_-sE%ZK+$#lUS;r{hqoTSzuaVe3;8miJ8=A^4M~>o=c0FEVDj%?C&e$7$6x0;phxe z4@VXwB%47vC$>=6pxL%Mbt5X#BstrtjH4u*Vb?Oc@TRTgAD=KlDWDbNqI8S{i zvbamqjff3GUk9g>1#42_6sce)s6!rRPtYL`9EWk?7tt)vE5x8<{Z=qDk zLsYrt!zkwgeJ-%f`f&s{`favYj-$6payBC8NIDUjC7FxJJV`eq=8lZHd#7rMVFow3 zjkcmJjz`<13VA3SbjSlofvTF8VjE(xGS&~FWXN?ine6At6fF%FAur}tVTpAm><@Ww z{12<0Yn>G>e40qc$#r5;mRvy=Wf`8z?dK|iwqs3eMrHH)Y=A7}p^ZU@{K3}wh=y5W zWptE3e3Zje#Sgd4z2-HAs6w=lLW^;FnAh;W_)}voMz5%;82f^SqyORcgeS!xZn^k= zE@n;%+ksfVfZ;i&eEh;KmGv+AUa<&+U>>SA@5I)KGIrTMY zJ}-BjdJdXTs?AfQIYz?saWTU#o2#_2M3&)cwuf7$%Rf2|&)LNhpeM_bhG+X8W~Yd< zRhS)(Rn{Ap#7IYn~XEzVGX5?OpoVyS$br?!-} z!p8*?OYK|``XaTZZt)q3rA}HTmfHI_%CxDcBa0c54hY*aOMMHPZMjW7=lkcWe~<_C z#vKw%z1F)V_adA7Bwdj3-Fg!1P%zfSZA-)~gZG6L?N}^LcnII&kLzDbUHqYhh4m+D zTD+yXTS}`Ewy7RWwKV*2L#g!%kB=TxYNXR%Q_-g_MYGj7CL!`!hu+WDfLY3Uh^t1+ zNGv6R&2kb;-DU-erA}6o^hc!zNLEEQtJie8_6mLx2yNCxHfu=+BQiwtWJI1KvD9lH zCb2a5&PLXB`t6nfgP;N18lCB=s7jy(Z%eh zEOlbtNyeNM$M3&L+Wi;XG8?W$+x`&kEv^*)k!B56hJ~~7XQa5+RU8i{9#Gq0k1ZbG zuy^zxhDRpW@VZptvq?7DV>dS1lF#l>T$v<`VVo`Vi~6|Wq}pRs4lG34WT*KpA{ z_o(tT#Co4>as5y+H?p;z?uxbfDwkiEG-YlB!x{EUk|zqQY(2>a5!h@b8IEj5NGxTv zu-QbiEwZVRSn4))5=)&tLt-fjt~PBau{79NyuA#co_Em7(qNVCBpHi5Jx5}x+dNNV zDGB`SCb5(R_3t5hA+mXqWIVE&AlVDTr=j;z?~g1Fkh~Uod7Y#Y*)&PsjBMT_ITG0% zC3zc!|NQ+O8_`q6e(M`kdFrivpTtrplO&dUE2l_4h{%T|pG4$S5=*_*c@j(A^97Pt zWYZ?G)NL-U?KJE~ZGGOfZHqV%%$?6kE=OLjkXY(oz96wQ_{qK`vD9s*Nh~G7XwHyW z>NZzNEOkF$kz9*PU0>T7zfo9B*tSI+2qL~oVyR|8huTuFd6wjBkPRsDjg6eWLLBDL zl%=<#GPg-A4OZE=B$m40??^0F&2!Y2(gJgOo}?Rjv1-Ve(@xKq{8XBuo=5kZtwRsk z-#WC0&&WOwGWfV@{tD3$^)NJl0c(W12K_zW>+95`&{hr}#z@9N@?RXI-Ve>+$~r*Z zfadQyHK~t5^EaA~Q%^$k*Ndj8yU?n^GBW0>rNqMT9>sQxFP*kzdrS3%U;m2h$$vR( zko`DlQS+CfhNy?3FQMN?sB6&t-LE=z16s8=Nlds8Zd)QoKP47^Lo6<9CVECTri>~Z zVw6KxD_b%|U4v#1)~OrNY*mxG1I@9WrS3w9-^C)aD#5~UZpEyKCZ?euW5ycj$r5=C z;~LwsZ1x0N(s;sZrA?E%1#KMdZ_1k@A zmnxfzFy${*Hq{I1s2AHesbe5@{G@AHZ0W@weX1o}k2P@rdRx8teX9f14QS&y8*7pr zi^y@36A?K{@_s}nNzO*(9LXmj_u%(a>hqDs1(FsBV`)=QL(lQNkosCw;yOtuBC{m7 zB66E#E+X?JcOr6^#V~izc5|JmV!5&_Gu8nI-dH4fbW*aac zEL9tqZRo79SC|beZTm55^i!X0^+$ULY#Xn9yjI!PYATH88rxdy`_|bOUU@B#+ZJAV zxk1~)E8jO{TkEOvp4ed9Pe%GF+a8Yeh;5r?e<+^~P+O{5w2Jy^-@lpK($L0i3yG!b zgRRt-YIba+wp9CT)Rwx3I?1?OOi=HK<}5it-H1vwNsdM2ILV2KoFtiy$P~%xh@2rg z8oN>T8k3b&^g*W=U>Ef{-cF%XP`#bn!g>Nd}9?9}X)_f_4t8dQ1wP1|l! zqkV1L>PCCb##EjLe~-el=jqK-jmd86J<#mm7pPzK{o~Y@hT5|Ul7kUBL^A1Rrl>!R zEKZZ0iO5GJXCrcs0Ux4sP`I34Dnr*&neg0M0 zYrSjRc^W*VSa!|E(O$u(Y1`dMTNzV%8f;Q5yG|=hbu8VW?i8N0S(3RBVKz^FC$hLp z(v65!MaEq1EHRTf;(m6@6=6|cIT|HPj!21_{DVZg6u*zws&q{$pQ%1cmwt4*__`j= zGBu`)_qddH(rfl4j=S2EdTuhSQ#YOr$A6Rh7&Ie0PCW^&x~53ZM&ukxD4?mb zbRsfKaw{UYNvs;MF#a(sTKmVKj~YQ3*@wp(#`~vO7H7_J=?BD~J%t%C_>}c={v0j! z6VS$SMRh&N{)ikPIT(>cBn=QgIoYH>0-Zl=Nj>TNr>I-de6q4l-GSz_iL=ym(0s0P zp4tKeQCw7(h=!*sA8wg0&p1my)0W{$$+)KQq-4y}rI$h(Q#Q;I8n%|_BSifKw0x~6 zu~ehKfqEk>I2unyGWh`VcVal-VMzj-$Om_`zNShf@ZBRQ}6Zt`>6LrE6xKX z2ff50>dVk<`4wtQ5N_~98?p^xxWFTM&FZ&AjFIP}o+Lz5jucYpG`vGc8IrgwvMY7E;YEO5%_Ug;7 z*j}s4wk&V`wwzMz%4*TDswp49C zMt$7v-=((HJ-$bB(o3A8{s5XDKcxQ7_s>yVstD$(Ema%7r?ymW_<`C|ukj9vrB3dW zSnA{+iKU9-KDDKN*`}>JsCuEU}bb zD#}#ZR0~sfR%N1vsai0P7uOT1(u=P2aN82G&%bS+Pa$NL%tzz;hGXRd^$ zjL0)iwuAI|4fi}BZW->P#+Kn8Y|Q8}+lkm~J1r9SM4h?;Z5$)lB$)(ZpH5MC zB8yp)E=cG(5_13+?w7|*zG-2JEWt);e9tzJhx z7(8Y})El6!9A?2rlBYm8O2gEay2S{|CJ@eor>Qqb7F$TRf^e>Fqpn33b&^Iznj{?% z&g)s~E_65|NG!~#6qO~Si?BD>mdfLY)Tg0$ zz{45pPu%`f>Wk3w_!-G1kXKORbLualpMajGz6yO1`YY-i(BsfIslSGP4*DDFZ=qGg zcO>6~tbxT3)Rwx%9TH2`s=L(P$iiHaF;`nlj6GIjCN+|AY4%LXlKo#|>C)__k|kSS zV(HTCfs!Tr`Tu9{U7w_?)-~VB#i|m}Dg^`u$y87f&?*H11MF7uLe&YW3c?Ar=s|5q62QH7bTX?30D!sGtsd$%s0MYXzk z4qMZ*=X_o*r?ylx^8xBXX!Xbt$%C=P3hI^69D`NV!&!+DlGV{-4Yj4(TGmppgXXMS zPu+lKk2R?`Lo0?YB+o>PXQ{VAa}GX7y*;kqLH#B)d+Z>!rLsRnZK-NJOl@hb@huWd z72^?VOVx&>)Rx8)Z!z|s9{U^579Jj>1nFa!<%h+3pGaM8C$}?NA|2O<3H59)t0tV zVdgz&OWWhR9kzu35b;i1GXE#NWLS0*YVKtitzLpXMVQJ;_NFHm2M>n~By zLUT;#s4qwRE7adZGv<=oQu(()Nti3j3iFxvbL`X)6^}mqa*uVj_z^0%^I4j+y0Y~( z*LhsH z=c!w9eVh6Ow0hLV za36W+?A{)R*X!@(cgmApo2;%5ThUV*K`pL*_ww-bdhK3bZT+t}^1p6v_v*2hg;O2d z$sRUEg-s{f%~4s>LtT6Bv(mNa{W+p_E6@8|n?)SAFxT96iLJ8joT;;=R3UYS=R$VQ z;>UYZ+wkK(J7@7j8i_qf6;dy|f(*}zB)hd#A$7aQ$eKNN_?e8Ivmtdm{9MM)*_}Oh z&r^-|u&|BSZKrs`B*lU!Om@zO)ay7*7E)(#ky*mrY3R?o*-^E0?YVn!?fIXd-);63 z#q*fLE1$Q0C4Zf774>(|`_bSgb&2)<8R@^9$C`d;`9@Bw?;M`&XF%?s{%lSJr=R zJ-72;i_ckIS*ud-B$;Pfj3VO3s7KtS9);%b5R6gpg=Pf%s9Vsiy-j@tn!l8Al=>L7 zYCTRe4#M9Zn4mr}>htv^^(5BcL6lR}r=i(5XQ(^S{GEX=^;u}uaE@d;BQqq|K^WBy z>RZt4pWD=yYW*E*OI7Fh)MZ?66_GGcW1CpoG7?jdRmw7+3Nxwk$xE}hdMxW}VXyVr zsi!Keu9kX_?B_~ppKE!9?8{;dGib?}_w7>Z!7(4-A!;*;7F@Q3d5YlfcBwa$U42>K zQj%R7vBc`jqD3B==V7M1@;vx-<$3D)F+PQfHskj`aC9A;-O4n~bNpCTeKdG$kN1@= z_Sp4{1tV5(3tX+oEl0U7v;;@vF`gl#ZftpNl5yEsW^95A=iolRT`pq^pd98R&Z)-u z9483&A_mAj4_lop&wYD#?fK%`jIG8?dLHJEE6@Aa$6shEUPPnH7p)DJ>slb0Nl_h1 zE41GB&q<4y5bLs+Qmo5K1~W25vLYiZNk&D`mNAkSGn*(Naje&j9A0TnA1+9QlaYq`=Iylx4(yC7e>(jcBQsb z{VG&({faRZyV2eUc3W#t*d2#rfcin`H=tKgx1h}q??7sk9L&felIh)kq?w_%)b?NS z@fEeDw!eY?n)*C6>$pH|X{_TSiKVvBL5WM$mMY3wYD;ZDkM(oZmf9W$`ZBep1H}x^ z5wB2N8f&;pVyW$QQQ{i)H_(jfTWU*ViR&bm%I6JgOXcA^YD*QvO=?RO^DSyi74vOs zOV!3Z)RwB3zNfY{Mo^Mis(!TrAz`k#D~xTcF!oS|&9_U(<-88|W>49AJC1YlGUnFk z%if|f>erx+V=lc;(t6ovPMdlX7K~_$dIp-~{1x?Vw4bBCh4pOJZR#?vw`xe3YuqY~ z^Q(uY7UgBRb@bS&$BRAMW9;!(6njPXMzU|VT(Zxi++}+|b7IRO9Vp(PM_^MdwG#F} zP_)8&TecD;pJ4s6eY0Ebf1o&QYMU*MQladaEltLCQ?^vbb>_pCLpo5r5`1TbbuYIP z_CHX36V}_Zl^~flQaoVm?SG({4C`&#){}gN^#jzF4it=aklNDFnqr9B(t(2h9;CK3 z)L5*bwlvgGtfaPdprHR%)FaUJ{|L3Ep?`}+ zca-`VG)B8PPW^5y{~q-?H2qIdpWNrO??Y-!wf@w;*}=2EcF2~7?LVv=v88oXm>cVD zsX>K)Z`zWLv!&WX&Y2(k52G?uvD zPE(=&Gq!Y=>a3}Awsf8fqk6%Xu2NwOx@JqasL%tqZOI~~M&x1H3Hr2`XdBB)Y364H zt?Df`-?O&mtQ1<-j=FKHvt!J~E7*PpU-7v&L_G}6c8*Z5gXUPRr*1$qo+kBXX!hwA z>aEZmi*3|9pgFEPsYjt1(-`$GXtsGb^~=zVZx8ieXpZAP>iy81iwCG%(5$abeFU2R zk5Z3Av;GO{4mA6zOFbRS&rr|C@^jSJq1hidsLNR1I*)|8+E8IWUvfL2lR5KkA!k13 zIrFj1nQt>W^LdanpI15aZ6;@R_4+oG+trn2dy7{&uU@r&v+lqd;1J1!8CgLxEP`v$ zBP6RuaJIgNWL;KjJ;{cw)J76ZSrTL zvSt6xx2!4O#}d6TzkH;)Hkev&;x4wnmaY9Ww2O0Re*N_|#TN8LRYUvqOHB`&r~10? z-?rWZqAm7gPqJ=*+Pc@1Y!E?28%efiHrq(HXEr-XERFkwog||f86(-1k=-QwLD)|R zs9Tvun`9h><1<0skp)`NC7I63%#h5ApapXzWmd`>O~yRNJfCVra$CN8e7>c|KDRU@ z^?Zfac>QzP`mEm1E7+-*tiHRn0r!`aZJP?)YU)7~)Sl=2ph|1&d#0W)rf2H=wubsP zSc$8~(ps|^+P@9O0c=rA|O z4e<@X7PeP-8zI@8ku4-!GqR0je?|_FjEms9>jX&$WC^|%)TKU~l{rUpJtH?rETD{0 zS#nqUl&g%E2Z+}|6u37YY7$-zfw7{0N5?M|%C<1RoBr7wr ziexw=BP6Rq*f(pa*FkgK)>CiDN^B%)WTZ*5IU`$0wq|4-$&QTdBpJ=f7>T9ai=dS+ zl2}TDHoZi$H?!GCVyRm23iWtqF+nof@+&P<)Yg5O4V5K{YCI~oHI)4{zr5y2UcQfI zjZdGad1wjlI5OmsExxA&v>KQ8B!%zO7qY7!*!nTv_=&{0cajjXrNeLwp#cN!)M9i{(q$6#S zEqJahd}c3v{?u8ro}#V&e%tn3Be=p=ya7_aF}t+5r7LbE2H!B7XKNVCalIwXmlZE+ zB=WMhiZ#5cI^VQ$UE zi}i8nF7+%*>_Mz^)MfNw#YmX@7#vm)9kw1}PZn>9yycM8lpXE3UZj+QCPw4qP5?c-Sa1FCnpvBwt^|o0pg>F-q&`p&hF>|mrHS8oJDBgje z#ye(1-K1_o57966G&Ft8P?ykN4~aPevrK3AIc0>jutb*6Dx%!3zO?sDZpm0H9@$&P zF|=p+n8iYy5$Xms<84xpLbH8i)GcV1Z&M$HRy2o5j({-cqtxTjjBJ8>GAl7fa#{rK zJVVj}VJ~*6r=i(5Gt{%0k2#X7vBWj%>(Gqi2KBAD{x)?9?fpe!jQ~?ys4Nln5zH-p zTyn;qs+9E+$nDHTqn}fs#W|}h&031%oY%)KX4myJo|7 zcBxC~yg*`UtZ9_QQu!UD-kn*zOk$}l_E7K5EcTID8oj~oUa!ldg5s4dmm%K){dIy)VtUK8!tQd_#LXka8BqqbE3*HK%l_3NpviP55% zQcP2R##VeJ@{xNfJ_ad2c5Q-$xz1U8m}>7~ON*y9S5jG>zgFyc9$uVgou@4-FGpgw zr!5XYFHdZs*skMXV)bRsg(69o>Ti0tM74x5I>SiLWRZ}V4H(aIxg5%Y@hrWEEi2aQ z6GAGhv;TYAX}?*q<9PS5)GMiu^rCKus3pOFJ3t&FruPG{r{ zNhc#+lG%*RkzCKn4U#e=77Q749!)f_D^y$9f@yIX?d)7m?d+0FXJm$?%!m~sV;+xf zzb-AVAo3$uEb_~^Z*i2m1AQI3OKm36qPU6@t*fD}xR&2083);fz1ReGM;7?bXP4x9 zw75ZCW)|j>j5+%Pp6`$9+ori+wz0T|7TDi4i#WW;@*B448`J#Gdz-q1eqM8d#L9qK zrg@XoYdSa2S-oYb^IOzeerwx`9}h?jg83dTv9!lcEFB{ftFuejc#>VZvXWR`*@f1T z_SVT?I+o^)S8Lc#OPJrK-r_p?$x_9!gnID0?_-9jS6=t)QLCtjqx}f=Bhmg*YD<@5 z9C2Q_n#5Aou!h=FMZcDM9W*0fPu+;?o763N#I?gViMhWXW{d6!CYp}CIpeuPaf5U5 zMktBd*Cr`5VxGyE=X;JCT71WO_MQ3jb6XNC3uc*S_&+wvv)1A!qVL>Hk#g5ysqMur)Uowes$&~T3xs{vrYJ~K1w5dDLAs*^!Xg--ZLp=-4CkyAOOK7&o;v`|7;?0>qX_zzCjnQFr z$OnptaBOXg;l`b@K_1D)@VXFVJHYTl5|kYejCS~fBp6;jVRjAJ;l&eR;m_!5P^p|h z-iJTahtqqFAGV@~Gs49G$3L@JSm$5;GsO3MX!`sE_1{A?)_44b zE!QbnD%}UeAQte(;YA-tc}9jCsc?*2sK)rFBfRtj3_lKIjBiQ8%~i1Bz%0eKkK3!D zxUp)Me8146V)z*uKeFSNE9~$R5VNxsrPqnB50q~}dRz=QWX+QAoWku`lxD6ssNv=; z7<0XW@kue}db1mD*usu^tQog%L7D6AT1_$Bu(g``&NAG#g&n?nZH(_;!fjhH+?X}S z_dDUXEZAsZY{{4yeip~Uwa4HXw8h4Q9ml};4xPX(<^ETe z@L(P}26JN91G5yCH$=-o*|)YR`omvZY0ils{}R6b7MiX5J8DbS1OJoSQf+qsi~8@e z-pZk-e<1k@#NV-{T98Gv9_BB$Lfzrd3|YTa;`N(*Wdn>p!gUCfJ)Sq?_;Pv7~}RmSd5U7yX7$Aw=+#2X(<)5z^i8>|K3~pSN|UM z1S4-^BJ|a3{`)97b%By0p1%HhFb+Nj6-U)W>w65&n(|dnTOnt#VGbE}d z&CMF_!&9|qKPUSi{-f0w=KFs{?LR?RY~Vr-Pu`69FrZxcGkDi}eI96A;FCJOcNq@V zypAKui0aW%z!a`c_;H{SEN{ZnXOYe`J_oCuXS@UE#{r#Z@NHavo}tm+2Rk3_y`c_E zK{@uetZj~#zRhWDCt&CE7cWgi2jK{Wm!+YHbhMd)ogZzE1v^VYkIQnrhx&GWqKBT8 z?PQ?WP<~3xvOp~bmkwE2!zgMv`>KZbvp3T|HJs|h`<(#9#j>>szCk6Myrc z(6@gC;i&wH`tPARlm3C)OhOR_g);rwrFmAIRwz(YF5%#jVaP6Ifm;f{2pn!SiERnZ zXo}WNMNKfXK>4;THJv!{KAkj07{5=D4(taCwxFxB(}7tEk29j@1LYLBAa*q{OJR9U zR3|l}ep+J^>j#Q{L%-lj^!xuDMhiXjhyTn01_=X99V$`)5cc1n`G6+FV9QSN0nt9m z)}X0FvRxT0*(s~Uh6A${mcFmjr#8`^&us$*%db)St)V=-X`9$+VCb{dCYC zhtr|5$1!h+(c{_rcz%MOKb1m& za;dm`f=;YbfkKE4^a(L+E6hXP0f{?yKOE^~m$S2Svdb`=@MHfvMA;I$v2u_S_35C) z)EQX%VQLh9Vw65fG#z*-ZNtL;wQpcMeb{xVVQVS}8bd@YT zWqogfx-CMsdQNurdywnF(o&4r4cXpfzcPQ&gBMPETa*_q)lHIM&$iXr_d5V_v}^1+ zIyJoF|EK@k`=rM<4W(i9oYv|A<{n#E#F4LA!=CYZ8~xOOR9^tq4vM!SeMWwT81%vY zYb@Kp=723>6nz#jXSARfWy@UUFNs}79xbnkS{69#mkJrUe9Ys~Pt6+MB%a6TdHUhM zrf7cruV~><8R;pX3=M1aeifF2?wK>}t6y#gsI7f30^yd&{M!DJQr)}4s|fD!)~s0CBZB&wmg>4wdvQ&# zc2ylAgEwv;`3R|X{xVV3sB(JwYNgNgbx^1B;9uUXdf@9-E4KcX(5kKJn%Mk>yj5$) zT=Cp*l=uQww`Ct|6Kcz=TH#-G75(AAr5^k7zx8Zu^|6XtCJ$N)FCFcjCwjeZjcr|@ z`72<1{iYp3FHc|D?dARL*>m1Qib*#`?@rZoRz&Ary)|m@A&()0#ohMQy!7C;-qU~O zqR3zWck|85S%352t0RU8-LE35-zx8)_T6h@d#%Lqo2~B)7jRypapU}{?MpNGrFhMJ ziSu^e7+SrHuwUE^<6~Eq8g-nhP(60wbkL%*hlO_IGsF;ZQdt4UQks#{DLZT)w^GI z%w=~#tc6_dXp4;p#v`SF!a+ZHEdD9wR%X|8lueI|$)jahTJT(025UY1v0OelGU{C) znUy_WSIKfXQarLaBDy+K%sRiU!0}N{K0fRdJ>2YlQlfOfb}cQo;W%t2s!L1i*LgfW z>e6ek*3Gl;cZSr@Uh@b6Vcg`8y^neAoNXeljb2}}pBK&DN|Ya}Lwr z&pp>HxOMX6_9pGm=4jvBvbB3Fer}!T!#u%SK0_9~TZ%DQ)S9|F7PmhPUl>3H_RslU z+2)U7owkGHvKvP(JKqm<0<#pyjIJ!xOsZ{lzxm$(?8+Z5lYh&w)X%=(cG<69wNqY0 zb~pd&kt|px`+nPB+|LEmg_h_uFL;cv@x(r=%)I-U6{?}12ObUP)%F{;Zu5D$sNUhP z3^a;4&J`S|nj|d|Y+Y@VPG-|3DM8-QewM_70DDhgG|HK+S}ZM=;0WJXlEp^S5@Bp4 zWk#$B8S~hx3iSwcOK(ZetQev$mLihDr6Cg3J4CWl1U9QkhBGokvJQmxt*35e7EO|^ zBJjJ7WHgo;qu!g9*+@{#yszp`=E%oScaY%US@4%|BX;LppBzn znk21^v`I=4crjBl=CR~`P#@olS4O-X5x177v22rcKv=FzUCKhUmdpxf<)|!4w8qwF zRi%85rMX!wEgs;!e83{-BM?K>!_d6HKSJGt<|7Sl>Lbwnq|(DXk;JqyjpH|D6X$MQF*%edZ}NWwfls*p2(pe1L1r66bim_yF|8J3*Y z`Kv4YOWW1OQdjSMyL5Jux5FRJcwp{y)_Z5TjFTbsG1}1O^0WxN&u|&1MzBE)wn*i9 zDCx@c#oNMhin+cW{@lsE?ATYu0OogNz~bJEN7S0sqtM?$k5TV}Hal$HyGdRHIfO4u zy-sbZJ%5bznijRC1I63$(560|d3cND2ng#qN_{+*c$fP9ti%T-CqTyG^Ca~o^g-w; zYD))-tI!`&pND3vE>K^DW{j7pEtS7nYD;4)=SaSdC9YFjsv2%k-^@zfBC%Ahx=me1 z57vDo%m<3s5NCz4zbcIFsW7&o!c1yEpVz|HS1jvFe^wJsy+@9D#Uo1>gWT&6TKmJe zQ_n(k%;u=AB*;b8mox8?oN;tn#uAlfj}$|kw?pR3Fk0RuX@P|LsXNdt(WNe-8IKhs zVV=e#XI^{GK2+p6<1DWDQ&h!+jPpUOl|9#_wv`}05;;>jT38}WpBc$AZTpF-D@9fsd0O8P$l0rr;c^VDwi&_2n3Z$8MBr&Rms=v18EaD= z5qrVP9py4Urn;vIF5`AQh-J1f!VUR621Z(8jH_6M=*v}#3dKp7(;N0=#Y3=aJY-gg zp=eUKppC<#O;Un*T_m;|Y@_-hXWlP4t1H`HU|H|`+@GRj6qYEOx>^`v@i5xide|dw zQaJ&sZD&paF;IR?TOAE!PaJzSu^1f-Zi(Zt0in{k76tuk6Pa^!OMu7)O(?ggX|+2&&UKxCnH^wG9y-)jJbUh z(Tk3ACjS*nlWNm1YkNr}T=BZ#y84u_Z`Xpo*7rf9#%rJYQB$!RV>rAzj2XxXNfTrT zd_6^NY24zUCb2Y*^JWrDBiTY?X(Z2(SZbdY;rCf;OQXeB5=-sVAuP60w=#=1$!tdE zNURANqq0PlbF;$OvI_HgwtB9il9pK<&5E5#jnTd94j!;MRBUTJ_$XB@(G&B_*V7uW zeIuyxut0rV-kl9gLl4!jxXz>_peazd@q;5f5aagoTN)W%QLt?8lD=JG8 z)hC~O+p_;)Cfr<5nFF6qyxnk^jed86gJ0kUN}bGg8r1}iPQ(5@UcAf#9V3rb`8tcnkQSf z^l-F)i`vqGVk%f<4s~VZ16UlRg{AasqhPi4GQ@M7R+f70#k(Yy#&%|e?R<|Gmd18wMC}}>jiv6_ z_&ioj(5eF~w4&%z&q8AqiaF}iYeEx9n0vdbl%5u3X-2yGac{5nwj7H}U8#OtK~)cg z{;yb??8j^3!mO*dmE%FLxZ;rNYFBE)d<{$BL%eV0meHq-w- zBhtR6GMX`>dzO!usdig}*J1IO=61G9Ev-ji-}ISqGgx@BK ziHsEu?%f*6YJ_AR2)B#%)D38kb(4B8G`EL+)Gc{H>)Rx=BB*(eq|As#LB>4ozj9`) z)RzmQsHfs}F&=!INp+9C) zPEeD2EA%u*dmHsAH1BndQMaJY58Bu!83*BAtqJN`Xx`D9qb{Le)BGW^;+dD?8OHUD zS%tW$N1=H~Z;ZMX*SD!V(2Ao=Vgk(XujNd3w6H{$bu`Viyu9Cw%UQT%_$*>?JZtsx z{$G=N96Iy}bqAVl=~9=_e)o;UoPc>R<&0y&^_Ixa+nC$gD$cvDh-lqb^TroPucsb` zK7;G0W7Ol&d@bn&^(?fN!_jb%omL00EH+oe7meVn5{pOv^k zGAn|5=SZ%{GB>Eptc(Rn#yrMbp?(dzVyQV%p}I1gQ@^U8Gx{u^N6!sEpL%M9WL-wq zlQc5YBpC%^Z;ny#g=SCfqi$s-+9aKfbV*7PwS>$90_9bHE?XitsJ7*He$_c=W?tj5 zk7bR|`tn9=Y!~iz;g+hYcmbpH<_p#v{Lbz{YC|u?qvxo$uTit%Gk3+9$e0m6Wmdc> z@}iOOoYPAngD;t0jpN%8bqo4&=r;8@ba+mW`om~{iuyD(pA$PnUB2W|nR626s-wa} z9J>%lW0(1%Zc=ZBX1&{}N1@r0G3ve0jC&t-3p&J2eGr<@2Ogq6vdiN-N~9LNoqL)U&a^IqK`t-wo;#n(eX1lQ36I6~=Z| zm_MJGm-W|KC6>+z67%ujtr@Y~d!~39r1i2zW;wpi&?d2z1V`vMNG#Q}I&V^28Z8cz zSgI$@4pCdGvxdXemg=nIEow`3265!&xzhf_d7H&y%OUk=<81v=tT$>AS!ybzI&XQ~ zEbKp=$JrWN4(UL_=d#|h_4XgmYHW=yhjgGgjhTPU*4ux0KFQYDa!7SwQULd3u;U06D7VRu{4rt5=(7+M41_COQXeC zB$h_76OZl)Rx*-1bvCx(pX}a#8TUiVKGN-sXb``eVN+Q zSmFwarIB1Eu{4rvBxOcyNXeMf4kO${(^i;U`aO)q>g~*x&X0bMqR%uHs&DQj+IPOO?LSm^t zy)LD;RG;ydQCm7t@N@HWYD?|?a2VeQs4b;OkO2})_33+%+ERU99-_8%px~#}2dOQM z9#)W8s?WA7sV&ttfmPI&>YBhq)RyX+z{AwTd;GXKLj4HVTkFy4M@iOYWIf5_8F_-l zQrib%&TgRIlvy-LELHC|sYhYK^T09c*Hr??%GRE_Vf$wswnrbaWsArO_GxVrOKF2L zZ;)83v;Q~u%njPVy${6J4%w1)RsnzF3DLCJ|%dL zdRi8!WrpN@MlO(88h-e>xJW&lSPwi33 z48zX9ADc7(NsOGCx%M+TUASd^`8t~R=Xp(LiP>yfPWdAa6=o9SJD+MVpO-hId9-i+ zHD3Lx)a0|iwEvK4va9cT|KX9`&SIR`^YyiunY&SMP48wv`8Bnb+jyH7B+ zjG|4^QhhBiRkTIgDemG8u{SdICfM+sMlepr2z3K`6?Bu@Oh7DC)H$UcEtd4yEv2#~ ztP4Nn)WiCDWF*BwMAkT%>TQy=Kv-v+x&zG;U1}?ol_?IX&4;XK!rK-OiyV&REs?h( zIU;f-lA|EQM@^4m3`VG1(0r#&o4SNHJ8e~DCZkpHHoUanHmf_ZX;Z)Pc4#BWnx3oBn&ydA&k>eg?@vg|bk-P^o{9cNBgrot&2%FTS z@0nNrNaYyyuB^mvl0C7+UTRDA)~$Wiow&YBJsmyHP+yAcXQ?e!`8nzm>;2~?Ni6W_ zgUgmMueS?75<0FP7`OI>pZ=O)4@`uf#0ZR#G(h+%xJkV^v)Dq?iWY5Zt2?tP-iP1v zefMI5gt?x;EIy#k2cd3kZMK$-Ikyf(RGgsQi5@#Lv%4oPPO|jLp3-Di`ku7-5T$27 zOr_^Y3}%eVl3rSzV$G+ltY1$cF)J|3*t$trH6~LHO_Hq{*+#M#gr4?Mk7pJWB%O?O zNlFm^>`!8qML)$9>bAcrvkGr>`3Pk6BiCcpFF_l}mcNU{QkB?Ey*IPiN3tJ;Z(??%JZZ)bC7FAB5&xTMtpc1#NX=>pntasY)EBJ_gPAxgMt;hvpG!g8Bn!zSs2x zwWTV5lKK=hU)(%NZK>8zQJ;q9dw0)Je+sQ$=#W^d5?$)gGmEn%mdfHB^_S3mz5Fz_ zrCL8j{WUaSWqqF7Qmwy0eF>WH?wzH!RO{!cuR!w^*;lD8)%t7H*P+#h8zeU~a*M=L zmAOq_Li_uANz6gCDL%%G8UEPIj8HeA*|$yV&2jw}YD?qjK0~rKT5O{pl?CS97)c9+ z2Uaf74;@plfBSYyEa{lPi2Rq#y#lBf1`EI%oX~f;<27`JFZyzJMVL!?3aq2zg#`HtFNV=hIbdAo?BO( zRv)gnrL9z<#5P+VrH1X8E$yYk80@p9{Z#0K1GZ#kmckR;w2XQ=G`RK010DVyU*=hp8=%7Q-Z#MlwRu z00~JD_+;;5&gHCJXxW-~HJavg*|Z%~)ezD<&t12Eqv zbEcU<3rl3_+hlI(+hopso6MPSlR5KkGG|tmw#j=_?(r)z`Zk%D_H8m}zD?$AF?EM+ z^32?_;*9kn#&)?ajZy_aW48QaT>FwO;orw?mo2{?*S=#*_z$zp}Cd3M7;}|TikBym!Y|3?V;Wa%~`mQ zx&_UM+ti&{zDr#~`?gME;eh!*A!mw|7M94;x7XZ~5f-0dzBWEFZ(+YnT|)c*fy9i! zxIGr1qKy50YJ~g7q9f8VVko#rbx1s6z9qQS*evaBwt-nldE}{jOEfMqh z=GhgW*|zg~=gz1=ypV(9BiX>WIKSy$TIo!c?S;vCvN zc+O)UqJ9vXqrHN9CA1<~Me+~`d*NZ~VQ7x_2=yabiAPCRgRr%0sMkU>*2k#VWhK^= zJPyJZK0&d@|Kk?BZgL}rYHx0QY+@>L{Xi+mlg6`mJ4AISxg3z1v|8NTS(>PD#7UG%Gm z>!}-YeUrKc9j>BMPhPbB`HMLIPEmKTUj5Z2DdCaV?+lYL*Hds6=0ChR&#t(n_%FG) zViu$|YrVkxq;2XBG@r-oQkT$t{?3d^n5Uo4%$Yy;mNS25E@yncub5Lrb5?^nMIRKG z8PnxN+9V~&YTa!iu>zSDl_kBjxI%ANGH)bhMyv!GbKPUEutC&YTvfDJlegj;{a;I@ zO;TpWe33D?XQb4IoV|nliN!ba|4s5%d@J^?&51kMf{N=R*CV+hawC%OKpNkf<~(as zk3!SO7EhMf=^Z^mt1};KNY-U!J;{dXWg~SXvuKiR1>v(r+o(sO z8T%OZUTDU(kGhq4Xp@YCgn2{V$t=1g(;)OYLp_^W%#oBCu?{0+p3kJ5`ZvXL=HFJ$ znU7-5>g@bEtlZ85(7gOLsL#v1E}xe0?1J0f?C zgm1EaFY>#jWsl)kCcyA36UNwM_>Bp$ zhXS({{qV5paG)$bBGw3urJG_~1G5x$Zxh9X3|0@fm@zSY**-;cO%%U4Xq2-Wzc+}|Wnh+S28dhs^Vj%xvv6Pj z%;LgJm}Q@ceG8SZAO1z^i68$3+Kd%(s>rI!da!R@DjaM%T(+1j17CdOxuIg}X8wDA zBqZa01G?8*KUq@oQK1~_bep@^gX(h+ocj9VoDo?zkoygOF-~&%923Kj+F1XF%i&`8 zsN1ZxTavwHSn3z8elkZ^Aq)0AS*qdjCo{6Xly`5lN>ykp_+|MvmhE4yxochW7BZCU zKcaj@qQ>4ITtMmMr{`xdGT!sE89m%T^7Q(tjJWET_e!7WWOYHb-tTYJXLLB7U&vVe z)@Q%PL=O!2Qbi}9Gk<1-$u9uwt$SYN5}{cs2C?D7rly0V)M z%u-P72l3B6c6w>5sAX7+bxDWpUTge|Jh014_?Ky_+%zHzradKo&Kmz3&%$e2d#jTmDgNgD;G2utQ=ypOdhlpJ=d)Hb;i~z zUUXzuX3?|jXOC}9&-B|G{LA51WZ`rEzUGR0qOBS=Ti8~gE80hJt{^J>YY(B)mWgZW zZnL6)8GpgSFX5|yEx+uVelg!=w%mQTViU{8K3#(E?Swx>FdM=9SHqDsqTF7qw4ddzDaY#sgRYq&Hw&z6zTqy6gprFea<^^`9Sn-^g{ z<=mTR+e5V#@Ks~h9Q(_TgL<`xdyp-AuEzFiZIANBW9~tv;@tVUT#@*XAXTIOE{{aE zjIJi?@S{=kuo&Ce7WUn|melofzj*nj-gzE+#$S=KWi_qn>H7v+6Z^QSw&|LuDQr9V zDQ}E)3%Opg(iZCk#&&hZEDO}qKKreHvGr?pe^1;)&Fhc5(c-dsyIx$@qain_OK3ju zVk=3Q`{N@^P-b|E*;tM?jgT}z_-IO#x&_S#UE0(gXg+Aur7ofU@fH%eGv<%h-SK%pjmI5x&zG-=u(%_ z-s&b{u2HBklbWBoC8J%Cr9Xg_m#+8ez4yRnY@CP@wbIwZf!2TQX{u-ffL34(+ zsXNe$p-WQ65{5~br#Y81daBs@!(6$Yk9^KTl!J(}HE23wq%UO5Mpi&c~3T}ThN@DZR&AoK3+CK-GSx|=u(%^z8#a8Q?L|cPJQm= z%v+r^_I~joBDB8;&0px}73}8~mv#2vrY=`pPWMentPE`Kpy!K~C{wO9o89`1OJWer z@7v^zUl`?jOZwWSdpLR7EgJ2_(wFiROP`+;Td2Qf#XemnN@e}??<%x)$*R!*uv$ve z5W&O4O_IHt%|4Qr2)>NkCNWo8x#A)CUj0z;4Nq%GS{Z4ROoBX)+NY>bL$8KDLv3!N z1(z)mvrG>-FThe?o1JG_Jd8*O9`+~(sfVE%#R&E4xPA?FBd%{!x1beIo1`Oxdb=cN zGn;cHrHDp|%$#I)RF)*Fc2sN^<6*(JJ6Brl_a8wqj2?bsIQ7s55=+@2&B=1FwacWCh3w%tF%w}cgNXm>@sASCJn9ir_#foh`)tFUm zYbblX7(ssxkEH$@AsH1x9b+WBGMn8bdo!DTB$JuV6iG(}^><0itdvzv#yoF-g{q|$ zs_n5t>uuHk1=-g7t@qH^)|xcGb@j3J^?~i75;1IxM=)lMN79ULl340}XzP0!YJQ4V zmS$GH%&e?rFS8owu|?PwPqWtXRBJIoG6}-%Z;EpAM{nZ*r~Qbc1z zX2F8eGnXw9qpu1xi5llqjY{s*jB08!djGZyjsb138Y}UlwHft}b1Ux<*UZ(o6=sri z>`~0I!AGqp`Ox_g^)NJF!a73Ti0hlwPeJpc@u#V`#P!cmKO5I?rM6W5w^5Hm^F^&= z)VrYhVES(Az0iEfeINCHXg&mgfckZ4KHT1-o`Yumm#MEqGrk+tmdgKk)RxNrCUptz z56hESr$ierTO#H!r@fb*zle68U9lQ{Zhx!o?2k{?6l=J5UUOMzU?bG4*ZBH1)a%yx z8RdHF4bgrhbp!T1n`~0Iu->Y{BkpaIPDZ*UC48EV&Kb!}M$cTfgn7DNne5W}YhrbF z=^3nKx3qW{FN>+v5uUMH%YENkKhJJbkFNC|8l!GueR!sddVH<-*aYEiu&|g z8)rULe}>vpt^b6&6W4dCOVnrK=}Q7+CQ*x@p(iHKTyF{U)Dy{0_bqzt(kFvtr)S@K z>}(cmq>`PDfHAMp^AMpc&x0+DQ+a<>D$E;7x0QD5>z{+)rm?UGa=jV#`v|4X{ z`-b+ABxVCOCIe{_JtJ;&H3_1j!R3Po!9i4UBk$5%*7Gj=|W9 zVk2ypZ8SZD_?J@~+URqpcoG)FPnzZ&9HDMJ>2tJ6J&N_5gJaZ|YWBQH-GY4sz1^lB zkLxF>KZxZ|PWx%+r0*#M0-z#L{+}SeosLrJ0>G-p}f(x2|k` zz29qQ=l?|MLF9!WrAT&(?22SJ$nb98Dn_UqyFK0}bqm_; zxE+v`ARK?gB+S#?NvzH;&6Q+VS2i8L>g{md&?B+Mo>B21qQm z7rMe?klIqsg&}H7?S-&d{~)!c1H~86E2u4v9#@iBI#8U4#VTq`2a4;^4^cl1{Vwz{ zwWVt12=(f?ehu{oXhyh^x&cjpP3j%c)?4tnlVlWxF^^Fngl3J0sK=q%PZQLqq1mQ0 z)YH*^hWb3TYPdjhHCkMwE}T}MSWmOP#j7BVSHsxgUTBk~1rlB`No_`%4V5LL{_@LvTk;i^ zmC`184|YEy8Qh;D86sH+!W!07H=yaKNo}dtKSlj==3x)XE79Ur>iwC;0g_gUdS!wAP_$&(N@HzB|B2C}jb0dTTOaT>MRNWd3k?XSskvAhbC~`28Ln4PFIV^J62w&Y)ye0Bh zBu7M!L~>N*Xe4ioylsSiR=fjJzGK>7b4OwjOnp!sqt&rQYy}zfWOrQtkGsF(U6FT< zgco4FC-Pn-<09jcOo&WG^1jIXM)5`Nn z{-RD2a|Pxt%$cpynCG<4()TsFosW6W!oKAT#{Y%Y%KcH3x&>`DqCIVr4hXk_E_Dg* zFBBy)^Q;t=C89pF?`_Ggy!aAPm0wyN-ajM;!7Ni>r$IO~&rp}pJ_AY2VOEOD5>anmZs}Wf&dgj}NlxqP@#A@JS6|wShnn8g<`Qg<$dk-?n#o}>iv{WOW0f%*29v#<}l2v7ER(XEP0AgxQm zH~P0tQi6Ejl9-vSxQ))r(`@uKCo&hwW%|DCx=noqn*Dy1x&zI2cB!Z1`Wfn3X!idc z^>t{r<_2{c%Ugsb%+(9U6-9N$O0i#xt0Gq;xh8VWh!tl0z5y%02}JXb%rI!!hQ3wF zZ?lru#jYC*HQoSe-3T_kCPY$#_;-d#%nXd*IpMM;V*DmUg_-1?g74`6J1fcWMzpC* zX#YkDiJ61>w+3=HjcbZrZ;9+IqxYNie$z_wyAW;a5}H3RYi1u<{9RfBPn5C#|N)+D{ zvGSY;U9t0lSqjSwq89^YPh1ka9+;)D#LJ#g(|3V#3~!2A7O17Ll@3{0<1+{<=RR+% z+;ksL{nz+>zo)O?|8wgV*8GQmj%a>>mfs&q{uYG({*L;8W)}a8 zKsBh61E&kKZ7~j)E(mwUGzh#2=tFP|>+~SWZP}H`mlS>*UDUF`<5x|y&i6~ty|(&| zM31w9wd@@1&YH5t*K&>C0mIjF;dL}HOF{9)+}O@ozNe*;dRy5ByBUS@R$Lym6s^;m z-~UUC;WDiM@Gnu<573r_{7CXsv`D426fIE#rSVQT_lI}7fei=7c8-WCO4e&gR7=t8 zLe~87ud;am73%vV2tEIa8qRZvsyj0UA6utn(?nwj6eQs#PU-{Or|=` zkbT($u{t)=!^W4ljWWCmIq39Qc17_%JGaF9>=1y)$d>xdr3KG1a{-?*KIxG4S@XkR zm_6J1<6oo^yGKuZ!y7$Ln^5+zQKXNyn7V@%d1uV_l*ac57t|eQ*QcZAt@-IMy|ZnV z{A($8lDDNU>Jnw5Wq%(vYuM7nfA}}a&yW8G?feO(VkP^^Zmpg+414P;J#TB!L*Dnj z<)uPqX^JbY`QhIt`s2T4v>8cup}0>L*afnnW~sxiL>_D>^XU`ip2Oe~psfA>@VhMh z-+}xQgjRo|{wcGt)hdT9A8j=#V3zjDqKGQ>%9D-?Zma#WtwcM0&)n##tO;fRI#$WH za)oxJOCGJi4;ueionko3hhxn|76*b`y5K)7~5EuoU0g*{9NMkA9Hc+jA^fK7rE5 zWj7v}r6@fi+6iL9?@%s&XAycxkb ztB5`GTz207%vCSm(}X&h>yiQ9(*(v`c6d({7<1X-eNA9TkS{CVz_Y_g#ok4(_P!^^ zZAsti>DiJhmo&}>fBc!1b1M5K@_5$6ZOsUC?NfZ4)AcJ}5b>*5+z$1;oo|Jld5Z8G z)xuogTlrRudpY%jAyF;$JEQ2ioI(%%_LEC7NAO%7a`fgh8ndKT;t`E#o)c?5XlY#Pte3MusFiT!I6aYgyp^PXBG~ywm4U;@4X9>qNHrTKbjvvtHt`PXBd#zyB!z zitYDpcu8nGdw409?VsDSw(AGPv|ZoHw`y*Ovh$;Ywn-}mOW!KF9mehV3HjWBTvs_Z ziq&tG_1oWQC~qn1@?%RYQ1)e8UUj}COFv`cosRk&{n@&QT9Y&0y<=2O}`msYvCuD_LTT_ zwzb9AviK7H+xT6V0*xrE@sv z+}d~+q;Gq}Di~vFX>p_v=XtJs2?c_8od5pPocq7Zc{I&K<1MGwVoPyGi1(bLJolIK`MwzQ*lQn%oEyI$&=Q6LSdFEZA{$2214;9Kjme;l{*`N9bwD%|b zPW|pZ$77Ms(kn+IevhT+IHZ>M9EbEN!h7R1>eqOmQ7k+LsSZB^O=F#6o{`=8tSpaE zrg==#DEJYngkAa;kV;#ICDknzGVp%({XU_j_YR&K`$Z=&9-m3{ z%RupE?jzEE*2WjLAACN)G7-J^P;H-Mh{Lx}oogKh^LZUhzX>W8GE1!`2m0{O`&`M{ z1AFg}M({z_#IpU52X+nReXG_SIMc@`TVciIK}$Sq%&*)G2hWy*j>uXuus)Arw8wHx zmWqr~cx0Vm$=>P8PSLU-4T);0x5p3?)-zTcV*~{a7lC8cf`Cp-0|n|#IxP(ps5$Ah zG*E2sy9TXFmTAc&OC&AXGoE)V)ps4{O!D$S{vTVm9=K`tf5qkBix@Zd2dcjoLydpK z<-hH*`a7yWilLo<;&Q6TTcWBjr@lu#-t+j#72-kv;zJkI=14KGw@6`{VC_JG8H{NH zwKq~*FzbENIQ-e4StB|e0HH9c0>ubmT0!BE6)4(^gBBDHP=Q)%90w`rS>>S*=cH~$ ziurI`DrA;g9N2D>eqI*dPcKM&K2TsTdYfOYSidCgd9dCk>bd*gE#8V=5KCJs^%Tay zdkUut_GfWp3~;glg_DIqEj5l42I$nU7#r_boGf8&=qa2aK&9R`mGw6^ZmbXUyeoxM zhd?oJaPj~ZvcN61Z8?$O|G$Bwjep?s41fz^(F_j&n9q_$wS zJSy#Z*e~EBgZ*7ztK9qjF=@|(^*T|Uvf7{3XsP+eNh`GH_WcKo&U+je2e8(yaasoL zd9e0z_@rWuQ&d=go^$i=y{it5-ml2++h~tjeO)SKmPY$T(o*Qjq;b-3f3XZs{GmM$ zz2mbntjz5bNlVqO>i7R&Ug8f_!P=_rzjHT}o+*@9(0|8&KczHZdnPh=RPkVqZ8db2 z4O2X6z>&)6LJoG-Hbl>1MI45ObM)VQ>mI78d5X|RtoD!nrN@lDWlx*YyLEl>tDNXy zk7JQxGmAGP)x)+1)Us;CY+DUi2^2vKhmmt*g`W}8Mxfa3#7q36J(gp#R8O)WyeIkb zEo>(7gRk0PrD|HS*m=U9FjtB}OW_b2M_!SsMvtvTnfsiX$unj}#k2YEGgo>(P{f#J z@8fY#&W|x}t=4?sr^bqJS&OQskXdTIasz(cx7H67^>NozD`b19`96Lbu8*{p2!9SO zbmStbFE~m)zR5<1uU?&??m+X^sa@(a+FLLr%>5!%gE2O&%x>)Mn$)d^$K0kq(y*9$ zsq`rIc*A3upzgq)k5F}~r{nq=>e;w{j=GHg(LtJvh{1oDIk7bUIpa$vd&<_^@v)2r z*v};bCGNp*&fLbksXoj6xkWc^CHhj@`A_?K%(G2g?A43c#9qtT>te5GtR>dUSX-=ZEZppPL*$J}-UMmA zX?o+J)z_we16mQhNpb`v>;tw78*612pjxC}|-GV;OErhy+{uJ7bNtko?>Z`*!oq}cY89cW>3w6P& zO;TpW49J+%8?OR<&XS*JB}qCUE8x3JUCIJw%mW$o6l>0Gm14~)TUDH8FPu#^Hc57Z zJcb&dr?xb<`2~_zv}jXzpxJX>>N2jk>PeWV2y@1oDt0E-zIm3#IYxcXYiv@tpxH}p z>JmD6Au}0E6<@$h`9-i&50M!L9pPwxNvkhSvvszPgn8~ir)*C#%_yg>B%^9lcc4Gu zSW=hJoPp+%gt^x~10Ss!_tB>AK(kDjx`g&VB(XwZmZ4q6SM>5#B5jfq#Oo%p0$|?K zoXHn0EXgg4uj&8m%s)v7B+Low5}JKsrAe5pKPrsniu3e*K6u7_Xp@v88Z|O2zgQZ! zfeWa^{x0~@fXj*561UEavb%`=G|459;Y$`BkC`LX>n{0zd_8sJlKX8^KYhve`#huE zOl_&oY`0KvjqA5jk4ArE)Gheq`B0m>ME&P5qbwK_=6Jpkh z&6tFFI^#}EZSAr1y5>;VvN`j`GlJ#RE9bm_R#86^*FQ>asXi^Ord}J@KSph-)~}xS<$s`1V?SC-Pk+ zH$`qna!ce^B)3IwM{-BxP9)!pd>=_EQbuBp5W|x1V?+m$Ya1OB!_{!J#Tv+$6ffcn5lt~%A2&Pp7_N?^Yzw*XTf}g2$e3S2615CVY5&m6eSgqP6)9#) z|8}yzG+%pdectub?6EEQWv^%t>%D?IkJegVd%*qheytr3cD%MSAv-*Y<-4(M8OKE@G%N4n-LKf_^cV)o0Eab;~m17vU#x_dYKkom9 zEe%@{?nZ;Mwb9nwJKJMBCtHmRUl(IYR7=svqSl00&-8k#AK?nEZ=)hKe`w>PB2gLd z!wzDKZR$eV|Kk1s^nWEU=0JY56#aXx;+3{GP)gfVQy#Vk#^d!ivC+(KOss`mSD@Nr zxZCA>PdtBsmf@bc?+b9B91PDO_#DMu@;G0#&+ys8S+DK2GV8e&dGB#nX@B8!3O=n~ zUWL1=I&L7>1D1Fk9yT`v<2e(a2m#}0$j+pwme{vCT58P?zw^D-kH16tKmN{J{3q(4 zerLVHM>FLkWGG#~H|w|krmKJ`n|t9NB!GB7Mc9XP?Qhc!WxOc>faH^#d(tai1l4G@Vzse=d@L9`SX&YK!4XFh92O zJkT`0_F*H$Bhp*4!!vPi$D_Y#odwXY=PW?SNM&kl|pX?iNB zXOuYh=2*V96#dk!@$2Q)61?hJV{a&L|1io$|0D9EUf~NYy-!-fGQ3t(cH=#zeSYdJ z)z+bvJ?E)Fj z_S(rFd%s>&^>bJIqH6t~KS|Z&`_DzK_S!b~<8S!u2zsJh4DILnXYksdGC%*M`2Fwm ze)C{+#e-;SZ1A=e8$~u6;qj|@62wyV$r9=YG>>~tYBK@xBVNvE zRcwNn#wHs*p7A%STbr)x%1fKN++;rdlLCnqie-uhe6$+wqfLFV;q@M(J_61A5=W`W zp*g}6)RVFN6m_TJF?6X*toJMJBnbSf?gVhz66R`457U*oqN#ptTJ52)pAva0lBY$U zj%2gQ=18`PZ1GkX&xkw|$+IHQMzU38Yb4u5wiyX$_s@wu7s+;z#&++ICiSlE)^=XA z-%Y(2ns+<)QSaaGu^ymqZ8v{BUu{#5!=9hnCa62G=NNaXXJOAdF-LtpmcKz=LR(zg zM#)UVEAN{WJJgOH?zh+}veSr}@?O{TV$Wyn1+dl&iL^;d5!|UU12X3HhI5Px-H9*p zSD48f%f3{5hnl*IQAIv#afX>R#<<5!H}Dy`O9#rR25P#h7;)S;Cm9$DyBro}ezF6`5sZ%p)y!)6ec?*Cr`J=-KQ^n5S|t zv)s#BITEu1V+>rjM9ebIoINbLCo4%}tHC$|T((5aGM3!Sl6$j~BxOd-l#F>Ashq7w z{}lV+tFbTnYLc`v(kAJE45Cbzy38!h1sU^HTh45iW>8M)uXqJ9*xxHDisDta@zq4y zBpnb&-lZ-x3-dt6JdV(U=;Q2*{j77p)ez=CbqQ@w6g`{u{tpw$148( z8eg)jFU#19x750~yfwuUks}^&aa81}5vz=!yWbXjJ7e#Ny_2zHV#hLeTy4 zS9o<@HqmtEl{58OPx;uB73$ZMQ+Y*Gv6Ii@L&p4J>Wwx@=R?e2+_URam#}c(B<27% zTXbHMSh|;(v&KBTrNu?;UFgRW=ILH)Dw{r0Bvx-XKfZJ}oyw*@PK&i63I7b0Io@+C;)OV>^6QD{DCH%4tH z(W01^k7+MsYjb9j_wHw8H{*82S0Z0oOZkbX_*&%aNY0C#kK}^Lh1jl(A{QgMByuT| zS&`XD=0xTqxh!%yk}D!tBDpGZHIi#0*CP2wmt`9xdBq%u-@@k<&hW! z^IrT;<-Uu(cvIwNB)3FvMRFTt__iNoN2nXOZGE@~LA^Py-$K3hw#CL5#ciV=h2~Lv zjJkE(#)SLKHgyNZ$J|iG?R;hf}W!wps1M&2nu?Rf`Wi% zDq7&J&Z+VOUNbGhL=jF;#6_s&dEYpN!SAlKT@XFuy%&wAF{Yp=b}KKoeZB+ON&I43X9 zxs~EP$l$#9vP3ndzxO4<1?+XpK?F%#;g$GFPFpNxcVrTo`6b&nYiMVpX{+3-R@h1Wtxj5VwH$3snrW*h zihs}cT2#=^q?fkJQOtSvQvtIgAX6o7Wpzi*wn}@lm;IM`_OkyH=Z_2oS4teM{%UG& z_Vr3z-K1|dGHn-skfU(0po<` zK^upxjqWDhX8)T?G_}htHN>vu4<;P*hw0CJd9PVL4ZYF4hY|XN-++&n>d5>aWlI&A?^Cwa=i=fI zNh}SsaPdc!E%h^H@i~d58p&T!wp3^NKc;M{qVgw{Esb^jDT$@}VV*yu{1=ev^##h7 zs)mb{EtSQ;q-?2L^;eWFl?OkdY-#lQha{G&-T#ZSrO~IqCb3lQzC_tl`E;4GrKKJO+n+p^F9Nyq2dL}u&Ewqwp|22169=1Ih~bX+9n^`+)vt9jP- zmRI$Y?dl$nOqH`0K2OGb%^8T z-$bo5kY|@RczZe6uT)(%s#%4c)28{KNjHt6<*6n5A1s>#xt#ortm*@!D{f z-{~%QwS+%AQRRMjy3G9(2T_g%+3t$T|B=GUFN!@hNqZ68ZfoD6PQJlDS2+kAZ9+i>lbC2 z>pYA1{DLvpGeKO(8Dp+?`)ZE4CW;4Cmbqq>2gR6c9Bdb39^2<@LFS~0v3SCO_yt4V%4($|vAHP1e*(#)gHM?{&EVr=XYWgctVE6SV{Zx47>lsPGS^D$B8 zn$&ru80S%x8R2$IWVQL-=C)jTm#yeK(2Sj6B9?t*B*zhiA5~g0@0=ddl;U$tl7(W<0`! zOw%?Yg)DH+)HR%zYq%j;FHqY4h|Zcp*nq;S=BC$E!&Cxm32TpT?9?7P8MU^{+MfZvPA4!gtGk1?4;~XB3HdrV$;YKgEL~5VM{d^Wm?|@I@Vm5EsRHHTNc?j)J9qCs_Zy&&7>1zY>&L>}8vba*wP2GSGf_THE_~O#V=FFx z7vt>*kU8)Fkn$zSPhoDpOxaWn@MVJ7w7)>M>Cx3hjL*Ijv>z`({T}aFeBm=z{Z&d6 ztzT(tEV&oMp$YV11l#t)k4ul|zeU9u+V5w- zUeM#Zzb`$Gg!I|1sAbrycpm8kHBprfv_ZXsEv+;bNW+u#RSQ3Fl;d|+i?4)Ub&J`X zLq%8b>8eKZ5%5`_m1ryU+E!?`tL05@xQD-^)-tWks&4^Q?eGJ?>PLNT)SgvaiOMeH zYeuVf>-(r=L8aoXJ*z%b$d3-i^Zq=Z9n?EiuoYeTFi(r?M?|GA6NBX|<@9b=OG;G! zk*S`Lg&OO7q~7a0^RY6IU9-NB5!cJS=wsXd&IU#wJ`r`h7tJUvwKh-u4a zC)C4H;=RdPdZ?g1pQYs^N5A_xnfW+X_R*wu&P6eAu_HTsNQ4L5{Yr)E!6Z!$hL z`b{-A>9db&>=Db^5kk8<+a5r zt=N7`1i`bZvXw{=${{gl+XG;ij}zFyI;j2%9iSS=P+eURsINNOBID@C|jy)p=T*u z$}1~;7h#;lQbm7)@^jJR^OP->M@K1Jsv2LQ{Eb-t7-dVf|2Sn!StI7Zmq;v?#>z~)#dVnbalC1 z(XFRfQd_-+FYj5s51_?j#b$Ac4bKQm#FiKfzlnB@$TdcI2e7ynWN@v?`*o%zF$i|5 zhJCw+?Ph&LuvH9Mxs#9=QMNRmix!huD$7eKTdL##8p@Uq6^CHqTFRD23qvH9+K)g& zV<}}zRbm-sOJj-aNGu&H=;ig4EgdQ*U|~6BOXb4~%9ail-@yJGC|f#Id;s}I$}1r= zf~zRs0@+%RzPOdd(&)o_5=$f5Kyq8Oay#XXka_2G6Xm7QqB!aEl$ZAnTep@ww$pf_gf-8%j8S0>2piYXt7v^dKWEA^)4n^0&)xH)@vwR z8a=y~#8MLI43StG$x;$aBUwgbDGBE1>qsn(WI7{fNCp|PkdrZI%hYE% zW%MhWt97=UrB_^se%y9lirl>xa;u{7!oNX)pHdayzj{|f!ObTtMlwbl6GNBR7kXrQ&fSdKVuT%Ov$iDbJ7 zTC{^?mk4UzP14D9x+MEDo&6*SL{Qg3lJTt61j)OZ&U+-&na&xKvmhMdpHUuU8rA?Z z=CL1VQ^l*It3IpH8eM-6O+~Z0e6a$tZLRPt$TsCIE9~lt-!9xrc@#3gX*NcA7i7MB zXE)`}3cJGOXI@>(1MJ_5PwLD#33HVxZa|$&ZwUQ~PfVAQEC(5auPZ1IXBs0UtsDHR zuT8m=X>>`Jzp2*%=K1DZ8wt5c1Z>xz6v8TH85T^ zaN80w_bk`rI=on;`qo%Ut~raFL~b$?B6YLK&5^7XSsTeZk#$C_QuI!7i`Xq0yH)H~ zWA16rcF^4(PuUQNWr%#SL6$Zc^A&2&cvV;2MoYJ)a(xmr0>&#tZd)Qo z4=T(=)_J??ygk@sD_dZ#mV42r+=0yA=~6xnnbAB#c^op^HbJ=u+3dh#pJV{yR{MC`Fb zL6G4GE&lAq5z1>Hw3(G}4p~RJ^`OlhoQd0%N1@L*wv18U^`P0~^9#EvTdF&G4^y^O z9y~(XQr#QeL)lX4@1<<1X6;8QTPpjHQMOd&JCp~pyfub|x!?6HitTFmcDGyX5ZPfZ zF=ZYFJHdK86X}x}1Y4>zOU}IHL$dZzDr>uHXt4{Lon5AP1MGDv4xuF6F@<^MYg5%8)SkBVw;w zx!1J9^GA=0JQ~SkB99s2=PyM^q!V?zB3&P;#p5E6NAd*7Qyh&qYZoRrF z#3#c_7Sl+c+oEQ$Qdy145=&2k<@QVkW4@%RwiNp?&IbEzRQY#eNDP97@0aX{PHVr- zqx^-KHs#KKFVm$w*zfbQDU&eI$5W!|$V^N}W~p?FPtvO^n_`jl(%VOJX67|FCz|G% z#Oi8JG0OG$32B|z#gjU!pNvQTQy`tET<%gHJmtrjM#WwMq~~M% zoAUgd?pe_TS=+N7It}aVDBl8kJLFp_TRK#{26;VYOSOLkvz z`8eehkl%)UlJa!ie}?iP?l!(prd`s+G8T+=_w=?#-*y|a4L+p)=y(#u)#@-TpD`O|bPGsz)*vX8& zE%tWC-Vu8zWABQ+o3Z!A-pkngV((|{1F;V>HYqllu_>^TDIc>dDR&^VU%QmYTuf%azRy{mp0_#IYb;xQOy53EBi}qBW1g-i5=-Zb z#I!~zreV$gPutl#ocGR%oUt0hTImy!Pa^qLPc zA~EN{@D!u<2d|KAQ&d~=dN%F({FltaIUKcL{1VE~{F0Tn99O+bOI!MmD|S%#?*(1l zlc~`)q}f2udQB>hjCGZ@0?u9)q0)iBr(5*N2Da1$cg#@G4hv@K;(_$!Fdj*V<+YJw zalKBo6)76m7G-eL5>eE$sIAMJ>Yh7z+e%bjWKykmv;C44D-L`0Ew9iHG#P4qh}DI( zglU)nuHp82rlI5pZf}$hCYDXy-Y0^?b3eC_ieN%`f!nW(V6uFJ+wY2CvU!i&ABn*7 zDQ=$?!Q}iIx6Mm29ON!}9wt+lEXUW^JsSAZI{KEmPA>S;I@ruFyOs%J+R_A#x}b?K zWLnfXt>O!rVE9U}F-|-9S}$1m?^eC^|H%|zeYGg?i-`EjE25B&BkQer9QCkQqp>f| zH2!OkukGMV7KoO-u`O71f5wC6_0XJ(t2?82{x+R(EXe-$2F0^v^xUZy9|axl>N`t zoUkDDTd{o=Ug_&lz|GFBtEls(PTg{C6|2&GKkuDE@GAQfZ{}^Kyu8xOO)6g1 z(|QYEo>orU(X;r9CA0#sma&MFZN|3!;ngt4UdFMA7s7xkF17_acMMGlrRrP2-i3`> zv5{@(^~c`)w(~PCzHT4J6DYoLKX1>~d;L?Q%c8#+fAro6&q491z$-7%3eG&XoP{P{ zT`_OVXaNUhCBl3Yn9pr^u||j(H0h5Ko)HxTKO?RVnyb*4YgB(a7ofDSsqm75WOIXb zTY>UrWo@yIfzhK)V)*)+k0pG44ei{9JhtavQO&m|p?05fx0iHxNOxC>;_Gg(i?6#S zyZE9TXd3&l+ZDA8TYAxn$5gHAVHxeMQu%kmymT*=eG{xNi-W){)k9O_mW4epH7w3m z!hMi_{g`Fccsm(3gDST4Vx9%rsJHyHOW9_`&RfS(uG`o?#)lCFwSmW$$?8pBRJF0+ z{?wbcmG>vl;EP}%C$tIavX^z4*cW3jr%O&z%dnL`#47W2YrD+TZQC+WUvepPwa;Lg zH`Uv$&xZ|W*-0O3m+hxp?q!~CW0!fezJK6c)>k~ee{CoB&+7Lku33*?Ve#?6c~%$H zc(oAvzHW@vj|cYhyqDwdFSVQctSLrKW2iZH{-K##qi8HHp489HlzCHMHnpnBpXM=C z?@yEcrgmMa{U-e;`~Gp4qND!ioX{0hZ~G%1)j0ZNcU5k3^NgOak>;^qf6t_;om%Z# zzJPSeP5nhl$Juzq&%+jr$C)YHYqJ{%){yef7Ts$R04wY}QZ znx^PBwK9FgUiQ4H^-cOs^)5y$Ywu8{4=l?yH}`jwrREYVbwOCIfww9RmU+{8OOLQF zSigDhZ5pvn{`lj~RX_QWd5u3jpZU1r6^iy?UVGyT z$k*QTqkMk+gkFS)e?E1Ocoim({2GC^Yc%^xiB|)Q3ciSJjhV;Uk{&G%4}7~n%oXih zq{r(6&9d$xSNN*K*Y})xHJZCByAQd><$kdP$aTyg6g!MuH~)`_jU!jRzG7ppBMGl} zL_3(9FBqA4y(1WN#pS3NbGx zZ)bY%h`pQXy(h+84|lyUHW~CRMeC+SKSHh+qqX>(My?2+5j%@qk^W4Kv!Kcv64lm~ z&QXhthttb2;Dzio%|uP}LGxVdk6@JjTwJ_byC!O~qn?v@xu5m(!Ij6Me!bn)UXAKm z{xthpZ@<~krg_n-tewG|E!Eeod1F=!nrG_LOsaG7(c1IaQ1McJ1uWfOgRZ%dYuC-a zEz_}MgRh!wW83~Z$QAF>Y$d(QY{m15&sLl@r026nFSF+}ggnn)ahV+>L&brH7ER~v z8HHWdHHK~btMgrTv8<^`Q(G!Oi#Lt8CjEGKVwNS9C{%9?xtK@%&cN7@ypv=y^JsOG zN^c38935N5c*fDl@H5VRL632~UwVqyyNIF3>w%#6A=rb`V;*bXF3Mbf?-1J=N?VHZ z4~gyy^c>i3F}zgTTFpMdtE5Z4%~4Q_k5*Y8AN8u0!x7q5d7dqGbo%%k$3C5Xc}6t3 z2d4h)t1Qn(((|*?WGKs{(a$FwJ56Ijs|G73tJ=~Xsad>v&SRak^wli`S{{kQdu8M95*`q`nX|_$e#CyRfXDg73^LQ z2gb+bN92t>CG7!Zp@+q{m#n%@v7p<`yy3fu6(PG;-B(M(h*hD*LIJRx6xo zE31|I)p?AW8ITQaHSbZoyx*ceuaxJeJW7U&Fat5)28HkDCv^tp|ne$ z`w{E1=k=Bs*(;p*gwF!%3-{XGp66eMZ}m2=tR>+m+ubYA!_4TC=k>Zx?ZcO(yrk#h zOIt2^?j9F>BFgAt`%}LcN3d;w%%fi=8sku*{F>G?DBock{O@vmz%-0D)1c(Je#ZV; zl(awQ(en}wH5Xiwm?m>QiQ_Aiqp%WN_yVLB(=ZO(-0m<9k?eBY^j?InYQWEEoU*@T z$hD?9F2=hus@3nxFjv{vq}M|(y}sC+$fd{ilF3{TN$)-Bape{l7p_%g zv9wl^o*9%)ZC&}DiTX89<;<`3gjIq$)mIe5sGIG;C)FeJBwfcqw{jh0I?&xMUCXc) zV<9kJYU)85xPbALq69iSO7O{}#8rEY-8xxlA&=2$i|&dP z7Cd%3bJ;#bp)1`3Q5QZO6xFe05-j-9#ACzGpU~v-Vf&fu#WtnmM0&?%QO5~iZ{f#@ z?ZRGZN(x!v{xS?mIrrB+Rr!_bTY0o4m@d_DHG7)8GFuJfuF2nWiGlnJaSDQ^C4Xtj z#}(%qt*`siJb}FKn%k`6s>o**ROWiNsnXigQ9g^u5m>XQ>C;V9ZHP+v;-KwE3pr}@ zb%`^08H?)x*ar_hR`z zXtnhtue^#i?4vav(-F$8HP#3G)S^v!3-((vjJvHQqtIY4jZyAE z=3VwKc`+&@Nn7i2Tdb0JA5YIG^@gUp|{-A{Qu?w_E13^IQt_BiEN zqW-It--pZ}=>CB6ImrAG+VhkLko^a4Nz5HEc}2;RIjR3-ZeHGhhBjyZ6TLaBtGiCm ze+V}(Tc=m&OI_K8)?24n*EauQ-`u~tvi@V~xn6y&>snG*x=xQZ7dK-}+W(uaKlzin z#abSrYh7MOc^L9E&Uhn~TaeE|Zc`qGY-T{lNIKC%m-2WlF+sT(_xCAJW)`MMrZaMe zWRMZ7jEs4#`)7d`>lD*<7L&X1q;hc!$lw-}@#CQg6bWyJ#;sx0E7sG_dMmdLI$g>=$gI0hc@pvi*gr*i8uDt$XDAQieyfj!dGbGJtf!)P zgZ#_&SbwpB{%x@O7@IET9%Pp3Q#NZL{!@K9^9bgwPLI}U#}e7|sO4onx;gU}<*cp_ zMyyhYw|rLF;x@MYHftB#(52ji99mALq6MHVN?<049&3douYO1qIz2Yv!ZTK!9eaD4SE64kb(G zq~6P4WqG!{*sPgpvq!@G$eD>6HS^P8af>W&af`)Pk*!921)MWq!{*Fa)H(BYZO(j^ zoip=UpJ7!fuBvQjPV4;PRYY+&yk2^@`@D?ua>(>!1?3wc)7Kj*4@0(csA+^`B?v99 zqP!Y1uRqpMUJIEKSV#F5$ZXZEl-EO+#SJ94fow(#Z>QXn21uL4Qbqa>%9hIOJ1JW# zuQyV*G}f_+#8P>E7iCN3^=8VJ%IhtZEtS_>DO(yX-c4euyuOFBrPP4e+ej>x*Y{Gk zR9@dl*;09ZKV?hh<0xfI<E#IJ z7G!$araTJS%3++0k!%;iF}8zbPb{;SatAVPb}3tN5RYljY?o$*oYrZ2^m9GdQQV7m zb?&tqsMDqVIApf_3Caf`tG0tA;~=bQg7Q(wwDj!<3;nWffIZb4RwHpxa1wsI5YQONXs zjB*Dued$s@kXblLG7iGHO;GN|5`D^(kZEy>@@dE%aUWA2KxWUGVy=a1muoW84;#SgLP? zETL>EHE{O6hQ!jL@Y9#qQnpkjhA3OApSN5}*-~0Sii>@cJR9C#q zDO;*%L03?=#ynt=<9+VpK}GIC(+SVYY-i-Q+uc??%YmUm!rXOssMHR>hg<9f*|O7n zWGm%uJN+*5y_82G^B(aS<<3s8wM%(`^1LT(#z>f_`{jwrPDw94wVm|RC)PRhm%=8N z#z|s+ANe7*_96Ga*u@y_^46LcB+OF_63f5slxX_AAhFce#L}~< ztfQY zz~2dyUZ&G08DzxFk}+p5Xa@QcRI!@hg3oqWt=U{t@hBp;@6i;){Uip(P_}psT7$<- z%Y7j+2xb|zI_i;5#=2mgZX#Wh9>@{ADWOlED5X22WTpqolEo9$dctMf zN5VY4r6y;#OV)Dg@3YAn-^Ww2$T!*)`&jEftCjE4F&z@-DHi*o)!H9gfatVIIv{+5 zPnYrlGVPi=3G-yCP}WWJ@S zOL+jk)0svfpEprr#yMc&*4*)2Z#LpWyMIC(+buo#bLGPaInl7@rc+FZ(;F_ z$TN{VOaGpAxl7q>gM<~-xXO&Xj_u8vf43-SVKp+Lk`q>vb4T%<$a9fAFY2v(Q#<-9+qW^mZ`Bpw68Tmn-xm3HB(ICS9?2UbZ&;0? zhu#!Jb>)q!Xq)Iw`_#^S}d_Ty|h-ErB|FleZwc*{s`sP3HPT> zc}v{CmGUU|b99bTJ`ndGq&yz?Pf$LF{aj5Pr`$VXzAssBW28@c68e0iVv6#I*w40o zhw|xY|6|J2asL_0XR)8FqR%LwJK?Lh^OOhJ@85?cu|~%>a@!K->A9<Fn7iTp_&zfF1iarzhEb5#SITy)!k@H5(9M`1-u|d?bJ*NlQZv;OK zWLuOxwR9a(f{1iABRSD0v?AiWMx$bf|z{m)ir8k3vaGrYZU;qI&~M+TV@H z8FP4oZvuca*ZVE;q&pb%sJT*<`A|WdtHhW`O?*Qa<(WsiMwIzb@ict8NsPH#c(WMu zp<);G@XS3dG9N0w1%@Z@!I;Nd@JQUC2? z%!i6`u$CC}q2d*=w%90gl^ql71je#mF+A~adW`Rc*s;LSy9J)(M+R$rKoY4@{cl&ACp)b%lw4oZ!_|DB$h^<84`IKDcqiu?b4f1 z=GHP3IR59gHcJmB>YZVDGK1-~Tk1nsOPbh9%4M#o8!Yom&#@sIA3pChH-_Zic$&@^o-`7CT{+QdE#YUS; zo=fvuX)>qpII@RCnM)JjVmduwI#k>iEK)Kq%45LKNjg*6UW|2ouN)pRj~&eOmQkI* z_~U$)^Aes;G>r=7b8?mQ5Pw9G=b-^p))Gql*@?N@!!wmx))|Z6>fw3H81onno~ev7 zkF;{e(n_I1trU)f*=I8AdE2)jE`NEx8%}3EyUQ^`sa0ZaN~0wIlV)_w2hz#nTJndUGhA7QPIVl zHeJVa-RHQ&bVntVE> zA<~OTLh608n9MZ8zHl{-cgr9W%&CdF25*@;-C^qfbSVv(#@?i4x+TrxF4<%rZEhB2 zuJhm)uwkYlh9lf=iP&E2tv02O7{+3k+qSo)=d$OqU#T^`)p%GIn9UJNtC@z@tl@U6 zq}8T0Du&(~<90^`W1-9K10q(3SwBeWaHe&H+k=vp=~DJQj<^b49Y%76YJ68{sK2<| z^3zM12CK`sJuHHjjBvXpf~dB+eOv_gU*dL1!$^CXIx>t<3kI3Ra&=yl4Wo=3wF??pw<+f>-^j!9w<-_@Bw*F6n z7x$wr!%V#`Ba~W+nICOR9Wl0#+dUDSTl?Ie6fwKjlT(yzJJHaph4U~9EBf%jt$OaU zEO_DD0|NGVU1AB`A#&98eUQ9X`}~C24k-0haME$j$BU~@4)t8 zXCV0G$+jqY9_O|a)iX2?p`88gLaufDZZYP%hI?3yd9YYKBF5`KyN_Y%A3!71l&E|Hj6^}{#apcqneFD-jQ}2xtN|Rz3CsW)u&7>Flcs38c{4>RieQYCB zw$Xeaq0~wYM+~LW5*wq`6T=wpb9<1qLL?|#J&A`%RJe|U3bk^kUF?USqfEo6m}A@? z7YSMulzJuBr!+_`_(a)CiL34k4OU&ta~}&Xd)~w~a-TH4(}SmwQqxA5ZBzE#t}XF) zgagpAKjwPJ(LpihUcPu*l({qyi80p^cNlEIG~8P^nUd$alX`@DOj$=bW+>YpabBN2 z15Nv5PF;&@@vJCw-DMmH>o5)Hp)R+3A~-MixqU(eXVH_~wvuAD6?`f2ILnl1=6QwV zyy`YRx4V(GR4apug?e4BEh@V8KI>dOVS5oj=IXiU#F(q+o(CH+^1#(`i@s8)y$lWedj)y8r&7Es##|%sHL-67Jxei0dyoc9gPzHhJg4{2>_gN3nCmG1 z7TDn1NV8T_HYUy^96Is(@XOPGCd?Na3 zr10{r=x2fQndft2=S!LcQRcLY=jjcKYfCHO8jfRnw!Yd?qi@LOhS?=_6xEloH9=ho zQ(n-Xj;ykMR-!8zjkfY`qMY&IRs z&BrW1B?_*Tj*N=^KllfVTJgPq06j}N0x_F@pTts~tN)O)DPuExEF`IN0QrUpI-#`YOg6ZtdSY@xAT z_GeD=N4|Gs+x|L%@#nX@Vg~|y81@c|jR(eGe4P+G78rk!`nXsxF#dRUUyQ*VD)__L zjHYo0P(Ost2pZE_kTLMH;B>IZww;kZoyAzMpTn5T9?xf{t4`^l9VV)@w)81!4R6wC z%xm-+lN#CgY6#hyNY@ed(ifXx26Ncj?Ew(~OO8OZE|l5K*$_JPhdJJY|na4Qzpwm&zpz<&_zcmoqiIsuK&hmk%0me?P3@{FCGo>hK>q`%? z&;OD4^%wt$0|qjEzexFSAk&{8QAYLpP3Gi@5r(Bi7`#M6LAKU5tGuaojBI5zSXnH! zeLUP6EL)1j+G_z|TEYlw<8s2bnY(teQ+74J z`ASP4-FvXl);DPFUgYTawJN3LC2!$!Y@A>bxx24KP#LwIkXtM=ONkOAW+83Hbu3?cEIEM zJ@EP~+H)@+`u~b-nHjXO-rCi)rrBEap5}U*_mr)D?;pqUS$zK=qpv;}f!-G+e=Gu< ze?s!7AUt;djIyP1H2yh>rEw(x1<8esTqOBR5!n4J5=&#LACOoY$HxyzE{R}VTqc>x zbV~h^j2TATkPQ_+3=%P}u#}jBSYjHECAOflKKM%|>#WUUwIvtY!Lil0aW!Si!)0OC zn(JxU!=WVGA+t2=DM&fD?Pk9aKOC1RF^oJ8%@NVnfikXZ#OhD98-gbNyG@$RcYVJWu4 zKO5EQSGs$lV}G5f3%gy>`qO1vU_#dynEJeiM;kZGZ)CLfEMDDMl@S0Y7uKjG?x$@=@yu)lP=M0r15^3q6iMCDGlm4QvampvJ3qD?=o zro}A!u(Fs{`N|2DW6MvUJYmN1%G0KmVjla-0BQ~ywxWLh9{60pM>7p<1O;r(Q%|$C z<~-H2S8eyzwnYThNy&6y@ob0+gTQeTndwWKkg-dGx*^CV}Kx$5y# z9dmuK%F~|dr4t=Wj~PJ^?L;2#g7b$&!1ja5BCpv@X3n}X#(DKNI1tL}zBDBxqMwG5 zSfatE>v$eNz^88KAgl(>F1H6vqZTF85#@uQygy@%dGzuSEDe~((v*yg>M>TQI=QMv zluTFDwyfo7)``)3!KuDGiv$7*VqQ(p+u5=91?_#i0=8 zif*v#TAsV7{P`dB^XvBK{rm>Dcb!D)@!L(w$OoAoPt_)$ikkRP6xQ&^kB~KTcmg+e zE^1=r_;sv7aOp}48905wIIY=( zeha9kl>7X3dEnl8J;}G`J>}TsCHzHe#FdxLw?ql-h?o?p@Jd)WyB$zNC;@ zs*#Z7v=u(iNOIaLdy{zcJ#*7pz!=Fb@#~KP%#On!{0f+*`kLhTe&uw>{(SUyZF@jj zUoy3A(<-%ld#I^_a7cJPfS)c}56t`zdY!(2w$C`>E!@ues?RII~7ahYsz!9WZ6M#%M|%%!

eqredQ<&<>7FQ2KV7_EqC9yR;fW)*U`iG~ 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

>^Tvkj0pC;Q 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%0A_ahXALW^U3!i5T&8zL! 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

`B`F70zyuC|5(c0fY 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 z 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 + + + win-framework + com.win + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-tenant + jar + + ${project.artifactId} + 多租户 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-security + + + + + com.win + win-spring-boot-starter-mybatis + + + + com.win + win-spring-boot-starter-redis + + + + + com.win + win-spring-boot-starter-job + + + + + com.win + win-spring-boot-starter-mq + true + + + org.springframework.kafka + spring-kafka + true + + + org.springframework.amqp + spring-rabbit + true + + + org.apache.rocketmq + rocketmq-spring-boot-starter + true + + + + + com.google.guava + guava + + + + diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java new file mode 100644 index 0000000..e57ced9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java @@ -0,0 +1,49 @@ +package com.win.framework.tenant.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.Collections; +import java.util.Set; + +/** + * 多租户配置 + * + * @author 芋道源码 + */ +@ConfigurationProperties(prefix = "win.tenant") +@Data +public class TenantProperties { + + /** + * 租户是否开启 + */ + private static final Boolean ENABLE_DEFAULT = true; + + /** + * 是否开启 + */ + private Boolean enable = ENABLE_DEFAULT; + + /** + * 需要忽略多租户的请求 + * + * 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API! + */ + private Set ignoreUrls = Collections.emptySet(); + + /** + * 需要忽略多租户的表 + * + * 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟 + */ + private Set ignoreTables = Collections.emptySet(); + + /** + * 需要忽略多租户的 Spring Cache 缓存 + * + * 即默认所有缓存都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟 + */ + private Set ignoreCaches = Collections.emptySet(); + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java new file mode 100644 index 0000000..b95d78d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java @@ -0,0 +1,133 @@ +package com.win.framework.tenant.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.win.framework.redis.config.WinCacheProperties; +import com.win.framework.tenant.core.aop.TenantIgnoreAspect; +import com.win.framework.tenant.core.db.TenantDatabaseInterceptor; +import com.win.framework.tenant.core.job.TenantJobAspect; +import com.win.framework.tenant.core.mq.rabbitmq.TenantRabbitMQInitializer; +import com.win.framework.tenant.core.mq.redis.TenantRedisMessageInterceptor; +import com.win.framework.tenant.core.mq.rocketmq.TenantRocketMQInitializer; +import com.win.framework.tenant.core.redis.TenantRedisCacheManager; +import com.win.framework.tenant.core.security.TenantSecurityWebFilter; +import com.win.framework.tenant.core.service.TenantFrameworkService; +import com.win.framework.tenant.core.service.TenantFrameworkServiceImpl; +import com.win.framework.tenant.core.web.TenantContextWebFilter; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.module.system.api.tenant.TenantApi; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.BatchStrategies; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Objects; + +@AutoConfiguration +@ConditionalOnProperty(prefix = "win.tenant", value = "enable", matchIfMissing = true) // 允许使用 win.tenant.enable=false 禁用多租户 +@EnableConfigurationProperties(TenantProperties.class) +public class WinTenantAutoConfiguration { + + @Bean + public TenantFrameworkService tenantFrameworkService(TenantApi tenantApi) { + return new TenantFrameworkServiceImpl(tenantApi); + } + + // ========== AOP ========== + + @Bean + public TenantIgnoreAspect tenantIgnoreAspect() { + return new TenantIgnoreAspect(); + } + + // ========== DB ========== + + @Bean + public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties, + MybatisPlusInterceptor interceptor) { + TenantLineInnerInterceptor inner = new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties)); + // 添加到 interceptor 中 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定 + MyBatisUtils.addInterceptor(interceptor, inner, 0); + return inner; + } + + // ========== WEB ========== + + @Bean + public FilterRegistrationBean tenantContextWebFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TenantContextWebFilter()); + registrationBean.setOrder(WebFilterOrderEnum.TENANT_CONTEXT_FILTER); + return registrationBean; + } + + // ========== Security ========== + + @Bean + public FilterRegistrationBean tenantSecurityWebFilter(TenantProperties tenantProperties, + WebProperties webProperties, + GlobalExceptionHandler globalExceptionHandler, + TenantFrameworkService tenantFrameworkService) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TenantSecurityWebFilter(tenantProperties, webProperties, + globalExceptionHandler, tenantFrameworkService)); + registrationBean.setOrder(WebFilterOrderEnum.TENANT_SECURITY_FILTER); + return registrationBean; + } + + // ========== MQ ========== + + @Bean + public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() { + return new TenantRedisMessageInterceptor(); + } + + @Bean + @ConditionalOnClass(name = "org.springframework.amqp.rabbit.core.RabbitTemplate") + public TenantRabbitMQInitializer tenantRabbitMQInitializer() { + return new TenantRabbitMQInitializer(); + } + + @Bean + @ConditionalOnClass(name = "org.apache.rocketmq.spring.core.RocketMQTemplate") + public TenantRocketMQInitializer tenantRocketMQInitializer() { + return new TenantRocketMQInitializer(); + } + + // ========== Job ========== + + @Bean + public TenantJobAspect tenantJobAspect(TenantFrameworkService tenantFrameworkService) { + return new TenantJobAspect(tenantFrameworkService); + } + + // ========== Redis ========== + + @Bean + @Primary // 引入租户时,tenantRedisCacheManager 为主 Bean + public RedisCacheManager tenantRedisCacheManager(RedisTemplate redisTemplate, + RedisCacheConfiguration redisCacheConfiguration, + WinCacheProperties winCacheProperties, + TenantProperties tenantProperties) { + // 创建 RedisCacheWriter 对象 + RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory()); + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, + BatchStrategies.scan(winCacheProperties.getRedisScanBatchSize())); + // 创建 TenantRedisCacheManager 对象 + return new TenantRedisCacheManager(cacheWriter, redisCacheConfiguration, tenantProperties.getIgnoreCaches()); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java new file mode 100644 index 0000000..1eb125a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java @@ -0,0 +1,18 @@ +package com.win.framework.tenant.core.aop; + +import java.lang.annotation.*; + +/** + * 忽略租户,标记指定方法不进行租户的自动过滤 + * + * 注意,只有 DB 的场景会过滤,其它场景暂时不过滤: + * 1、Redis 场景:因为是基于 Key 实现多租户的能力,所以忽略没有意义,不像 DB 是一个 column 实现的 + * 2、MQ 场景:有点难以抉择,目前可以通过 Consumer 手动在消费的方法上,添加 @TenantIgnore 进行忽略 + * + * @author 芋道源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface TenantIgnore { +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java new file mode 100644 index 0000000..702ddfa --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java @@ -0,0 +1,35 @@ +package com.win.framework.tenant.core.aop; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +/** + * 忽略多租户的 Aspect,基于 {@link TenantIgnore} 注解实现,用于一些全局的逻辑。 + * 例如说,一个定时任务,读取所有数据,进行处理。 + * 又例如说,读取所有数据,进行缓存。 + * + * 整体逻辑的实现,和 {@link TenantUtils#executeIgnore(Runnable)} 需要保持一致 + * + * @author 芋道源码 + */ +@Aspect +@Slf4j +public class TenantIgnoreAspect { + + @Around("@annotation(tenantIgnore)") + public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable { + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setIgnore(true); + // 执行逻辑 + return joinPoint.proceed(); + } finally { + TenantContextHolder.setIgnore(oldIgnore); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java new file mode 100644 index 0000000..8336383 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java @@ -0,0 +1,68 @@ +package com.win.framework.tenant.core.context; + +import com.win.framework.common.enums.DocumentEnum; +import com.alibaba.ttl.TransmittableThreadLocal; + +/** + * 多租户上下文 Holder + * + * @author 芋道源码 + */ +public class TenantContextHolder { + + /** + * 当前租户编号 + */ + private static final ThreadLocal TENANT_ID = new TransmittableThreadLocal<>(); + + /** + * 是否忽略租户 + */ + private static final ThreadLocal IGNORE = new TransmittableThreadLocal<>(); + + /** + * 获得租户编号 + * + * @return 租户编号 + */ + public static Long getTenantId() { + return TENANT_ID.get(); + } + + /** + * 获得租户编号。如果不存在,则抛出 NullPointerException 异常 + * + * @return 租户编号 + */ + public static Long getRequiredTenantId() { + Long tenantId = getTenantId(); + if (tenantId == null) { + throw new NullPointerException("TenantContextHolder 不存在租户编号!可参考文档:" + + DocumentEnum.TENANT.getUrl()); + } + return tenantId; + } + + public static void setTenantId(Long tenantId) { + TENANT_ID.set(tenantId); + } + + public static void setIgnore(Boolean ignore) { + IGNORE.set(ignore); + } + + /** + * 当前是否忽略租户 + * + * @return 是否忽略 + */ + public static boolean isIgnore() { + return Boolean.TRUE.equals(IGNORE.get()); + } + + public static void clear() { + TENANT_ID.remove(); + IGNORE.remove(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java new file mode 100644 index 0000000..cd4119d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java @@ -0,0 +1,21 @@ +package com.win.framework.tenant.core.db; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 拓展多租户的 BaseDO 基类 + * + * @author 芋道源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class TenantBaseDO extends BaseDO { + + /** + * 多租户编号 + */ + private Long tenantId; + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java new file mode 100644 index 0000000..d19ac37 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java @@ -0,0 +1,43 @@ +package com.win.framework.tenant.core.db; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.tenant.config.TenantProperties; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; + +import java.util.HashSet; +import java.util.Set; + +/** + * 基于 MyBatis Plus 多租户的功能,实现 DB 层面的多租户的功能 + * + * @author 芋道源码 + */ +public class TenantDatabaseInterceptor implements TenantLineHandler { + + private final Set ignoreTables = new HashSet<>(); + + public TenantDatabaseInterceptor(TenantProperties properties) { + // 不同 DB 下,大小写的习惯不同,所以需要都添加进去 + properties.getIgnoreTables().forEach(table -> { + ignoreTables.add(table.toLowerCase()); + ignoreTables.add(table.toUpperCase()); + }); + // 在 OracleKeyGenerator 中,生成主键时,会查询这个表,查询这个表后,会自动拼接 TENANT_ID 导致报错 + ignoreTables.add("DUAL"); + } + + @Override + public Expression getTenantId() { + return new LongValue(TenantContextHolder.getRequiredTenantId()); + } + + @Override + public boolean ignoreTable(String tableName) { + return TenantContextHolder.isIgnore() // 情况一,全局忽略多租户 + || CollUtil.contains(ignoreTables, tableName); // 情况二,忽略多租户的表 + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java new file mode 100644 index 0000000..15c129a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java @@ -0,0 +1,14 @@ +package com.win.framework.tenant.core.job; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 多租户 Job 注解 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface TenantJob { +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java new file mode 100644 index 0000000..0a2625d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java @@ -0,0 +1,59 @@ +package com.win.framework.tenant.core.job; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.tenant.core.service.TenantFrameworkService; +import com.win.framework.tenant.core.util.TenantUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 多租户 JobHandler AOP + * 任务执行时,会按照租户逐个执行 Job 的逻辑 + * + * 注意,需要保证 JobHandler 的幂等性。因为 Job 因为某个租户执行失败重试时,之前执行成功的租户也会再次执行。 + * + * @author 芋道源码 + */ +@Aspect +@RequiredArgsConstructor +@Slf4j +public class TenantJobAspect { + + private final TenantFrameworkService tenantFrameworkService; + + @Around("@annotation(tenantJob)") + public String around(ProceedingJoinPoint joinPoint, TenantJob tenantJob) { + // 获得租户列表 + List tenantIds = tenantFrameworkService.getTenantIds(); + if (CollUtil.isEmpty(tenantIds)) { + return null; + } + + // 逐个租户,执行 Job + Map results = new ConcurrentHashMap<>(); + tenantIds.parallelStream().forEach(tenantId -> { + // TODO 芋艿:先通过 parallel 实现并行;1)多个租户,是一条执行日志;2)异常的情况 + TenantUtils.execute(tenantId, () -> { + try { + Object result = joinPoint.proceed(); + results.put(tenantId, StrUtil.toStringOrNull(result)); + } catch (Throwable e) { + log.error("[execute][租户({}) 执行 Job 发生异常", tenantId, e); + results.put(tenantId, ExceptionUtil.getRootCauseMessage(e)); + } + }); + }); + return JsonUtils.toJsonString(results); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java new file mode 100644 index 0000000..0ed6895 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaEnvironmentPostProcessor.java @@ -0,0 +1,37 @@ +package com.win.framework.tenant.core.mq.kafka; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; + +/** + * 多租户的 Kafka 的 {@link EnvironmentPostProcessor} 实现类 + * + * Kafka Producer 发送消息时,增加 {@link TenantKafkaProducerInterceptor} 拦截器 + * + * @author 芋道源码 + */ +@Slf4j +public class TenantKafkaEnvironmentPostProcessor implements EnvironmentPostProcessor { + + private static final String PROPERTY_KEY_INTERCEPTOR_CLASSES = "spring.kafka.producer.properties.interceptor.classes"; + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + // 添加 TenantKafkaProducerInterceptor 拦截器 + try { + String value = environment.getProperty(PROPERTY_KEY_INTERCEPTOR_CLASSES); + if (StrUtil.isEmpty(value)) { + value = TenantKafkaProducerInterceptor.class.getName(); + } else { + value += "," + TenantKafkaProducerInterceptor.class.getName(); + } + environment.getSystemProperties().put(PROPERTY_KEY_INTERCEPTOR_CLASSES, value); + } catch (NoClassDefFoundError ignore) { + // 如果触发 NoClassDefFoundError 异常,说明 TenantKafkaProducerInterceptor 类不存在,即没引入 kafka-spring 依赖 + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaProducerInterceptor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaProducerInterceptor.java new file mode 100644 index 0000000..a5278bc --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/kafka/TenantKafkaProducerInterceptor.java @@ -0,0 +1,47 @@ +package com.win.framework.tenant.core.mq.kafka; + +import cn.hutool.core.util.ReflectUtil; +import com.win.framework.tenant.core.context.TenantContextHolder; +import org.apache.kafka.clients.producer.ProducerInterceptor; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.header.Headers; +import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; + +import java.util.Map; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * Kafka 消息队列的多租户 {@link ProducerInterceptor} 实现类 + * + * 1. Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中 + * 2. Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中,通过 {@link InvocableHandlerMethod} 实现 + * + * @author 芋道源码 + */ +public class TenantKafkaProducerInterceptor implements ProducerInterceptor { + + @Override + public ProducerRecord onSend(ProducerRecord record) { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId != null) { + Headers headers = (Headers) ReflectUtil.getFieldValue(record, "headers"); // private 属性,没有 get 方法,智能反射 + headers.add(HEADER_TENANT_ID, tenantId.toString().getBytes()); + } + return record; + } + + @Override + public void onAcknowledgement(RecordMetadata metadata, Exception exception) { + } + + @Override + public void close() { + } + + @Override + public void configure(Map configs) { + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQInitializer.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQInitializer.java new file mode 100644 index 0000000..3f55eb2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQInitializer.java @@ -0,0 +1,23 @@ +package com.win.framework.tenant.core.mq.rabbitmq; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +/** + * 多租户的 RabbitMQ 初始化器 + * + * @author 芋道源码 + */ +public class TenantRabbitMQInitializer implements BeanPostProcessor { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof RabbitTemplate) { + RabbitTemplate rabbitTemplate = (RabbitTemplate) bean; + rabbitTemplate.addBeforePublishPostProcessors(new TenantRabbitMQMessagePostProcessor()); + } + return bean; + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQMessagePostProcessor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQMessagePostProcessor.java new file mode 100644 index 0000000..246d467 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rabbitmq/TenantRabbitMQMessagePostProcessor.java @@ -0,0 +1,31 @@ +package com.win.framework.tenant.core.mq.rabbitmq; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import org.apache.kafka.clients.producer.ProducerInterceptor; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * RabbitMQ 消息队列的多租户 {@link ProducerInterceptor} 实现类 + * + * 1. Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中 + * 2. Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中,通过 {@link InvocableHandlerMethod} 实现 + * + * @author 芋道源码 + */ +public class TenantRabbitMQMessagePostProcessor implements MessagePostProcessor { + + @Override + public Message postProcessMessage(Message message) throws AmqpException { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId != null) { + message.getMessageProperties().getHeaders().put(HEADER_TENANT_ID, tenantId); + } + return message; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/redis/TenantRedisMessageInterceptor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/redis/TenantRedisMessageInterceptor.java new file mode 100644 index 0000000..ff102a3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/redis/TenantRedisMessageInterceptor.java @@ -0,0 +1,42 @@ +package com.win.framework.tenant.core.mq.redis; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.mq.redis.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; +import com.win.framework.tenant.core.context.TenantContextHolder; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * 多租户 {@link AbstractRedisMessage} 拦截器 + * + * 1. Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中 + * 2. Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中 + * + * @author 芋道源码 + */ +public class TenantRedisMessageInterceptor implements RedisMessageInterceptor { + + @Override + public void sendMessageBefore(AbstractRedisMessage message) { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId != null) { + message.addHeader(HEADER_TENANT_ID, tenantId.toString()); + } + } + + @Override + public void consumeMessageBefore(AbstractRedisMessage message) { + String tenantIdStr = message.getHeader(HEADER_TENANT_ID); + if (StrUtil.isNotEmpty(tenantIdStr)) { + TenantContextHolder.setTenantId(Long.valueOf(tenantIdStr)); + } + } + + @Override + public void consumeMessageAfter(AbstractRedisMessage message) { + // 注意,Consumer 是一个逻辑的入口,所以不考虑原本上下文就存在租户编号的情况 + TenantContextHolder.clear(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQConsumeMessageHook.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQConsumeMessageHook.java new file mode 100644 index 0000000..b9aebc1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQConsumeMessageHook.java @@ -0,0 +1,46 @@ +package com.win.framework.tenant.core.mq.rocketmq; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.tenant.core.context.TenantContextHolder; +import org.apache.rocketmq.client.hook.ConsumeMessageContext; +import org.apache.rocketmq.client.hook.ConsumeMessageHook; +import org.apache.rocketmq.common.message.MessageExt; +import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; + +import java.util.List; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * RocketMQ 消息队列的多租户 {@link ConsumeMessageHook} 实现类 + * + * Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中,通过 {@link InvocableHandlerMethod} 实现 + * + * @author 芋道源码 + */ +public class TenantRocketMQConsumeMessageHook implements ConsumeMessageHook { + + @Override + public String hookName() { + return getClass().getSimpleName(); + } + + @Override + public void consumeMessageBefore(ConsumeMessageContext context) { + // 校验,消息必须是单条,不然设置租户可能不正确 + List messages = context.getMsgList(); + Assert.isTrue(messages.size() == 1, "消息条数({})不正确", messages.size()); + // 设置租户编号 + String tenantId = messages.get(0).getUserProperty(HEADER_TENANT_ID); + if (StrUtil.isNotEmpty(tenantId)) { + TenantContextHolder.setTenantId(Long.parseLong(tenantId)); + } + } + + @Override + public void consumeMessageAfter(ConsumeMessageContext context) { + TenantContextHolder.clear(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQInitializer.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQInitializer.java new file mode 100644 index 0000000..e7a817b --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQInitializer.java @@ -0,0 +1,53 @@ +package com.win.framework.tenant.core.mq.rocketmq; + +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; +import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +/** + * 多租户的 RocketMQ 初始化器 + * + * @author 芋道源码 + */ +public class TenantRocketMQInitializer implements BeanPostProcessor { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof DefaultRocketMQListenerContainer) { + DefaultRocketMQListenerContainer container = (DefaultRocketMQListenerContainer) bean; + initTenantConsumer(container.getConsumer()); + } else if (bean instanceof RocketMQTemplate) { + RocketMQTemplate template = (RocketMQTemplate) bean; + initTenantProducer(template.getProducer()); + } + return bean; + } + + private void initTenantProducer(DefaultMQProducer producer) { + if (producer == null) { + return; + } + DefaultMQProducerImpl producerImpl = producer.getDefaultMQProducerImpl(); + if (producerImpl == null) { + return; + } + producerImpl.registerSendMessageHook(new TenantRocketMQSendMessageHook()); + } + + private void initTenantConsumer(DefaultMQPushConsumer consumer) { + if (consumer == null) { + return; + } + DefaultMQPushConsumerImpl consumerImpl = consumer.getDefaultMQPushConsumerImpl(); + if (consumerImpl == null) { + return; + } + consumerImpl.registerConsumeMessageHook(new TenantRocketMQConsumeMessageHook()); + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQSendMessageHook.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQSendMessageHook.java new file mode 100644 index 0000000..855fbae --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/rocketmq/TenantRocketMQSendMessageHook.java @@ -0,0 +1,36 @@ +package com.win.framework.tenant.core.mq.rocketmq; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import org.apache.rocketmq.client.hook.SendMessageContext; +import org.apache.rocketmq.client.hook.SendMessageHook; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * RocketMQ 消息队列的多租户 {@link SendMessageHook} 实现类 + * + * Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中 + * + * @author 芋道源码 + */ +public class TenantRocketMQSendMessageHook implements SendMessageHook { + + @Override + public String hookName() { + return getClass().getSimpleName(); + } + + @Override + public void sendMessageBefore(SendMessageContext sendMessageContext) { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId == null) { + return; + } + sendMessageContext.getMessage().putUserProperty(HEADER_TENANT_ID, tenantId.toString()); + } + + @Override + public void sendMessageAfter(SendMessageContext sendMessageContext) { + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java new file mode 100644 index 0000000..de37f87 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java @@ -0,0 +1,46 @@ +package com.win.framework.tenant.core.redis; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.redis.core.TimeoutRedisCacheManager; +import com.win.framework.tenant.core.context.TenantContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.Cache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; + +import java.util.Set; + +/** + * 多租户的 {@link RedisCacheManager} 实现类 + * + * 操作指定 name 的 {@link Cache} 时,自动拼接租户后缀,格式为 name + ":" + tenantId + 后缀 + * + * @author airhead + */ +@Slf4j +public class TenantRedisCacheManager extends TimeoutRedisCacheManager { + + private final Set ignoreCaches; + + public TenantRedisCacheManager(RedisCacheWriter cacheWriter, + RedisCacheConfiguration defaultCacheConfiguration, + Set ignoreCaches) { + super(cacheWriter, defaultCacheConfiguration); + this.ignoreCaches = ignoreCaches; + } + + @Override + public Cache getCache(String name) { + // 如果开启多租户,则 name 拼接租户后缀 + if (!TenantContextHolder.isIgnore() + && TenantContextHolder.getTenantId() != null + && !CollUtil.contains(ignoreCaches, name)) { + name = name + ":" + TenantContextHolder.getTenantId(); + } + + // 继续基于父方法 + return super.getCache(name); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java new file mode 100644 index 0000000..6cfa986 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java @@ -0,0 +1,117 @@ +package com.win.framework.tenant.core.security; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.tenant.config.TenantProperties; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.service.TenantFrameworkService; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.core.filter.ApiRequestFilter; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.AntPathMatcher; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Objects; + +/** + * 多租户 Security Web 过滤器 + * 1. 如果是登陆的用户,校验是否有权限访问该租户,避免越权问题。 + * 2. 如果请求未带租户的编号,检查是否是忽略的 URL,否则也不允许访问。 + * 3. 校验租户是合法,例如说被禁用、到期 + * + * @author 芋道源码 + */ +@Slf4j +public class TenantSecurityWebFilter extends ApiRequestFilter { + + private final TenantProperties tenantProperties; + + private final AntPathMatcher pathMatcher; + + private final GlobalExceptionHandler globalExceptionHandler; + private final TenantFrameworkService tenantFrameworkService; + + public TenantSecurityWebFilter(TenantProperties tenantProperties, + WebProperties webProperties, + GlobalExceptionHandler globalExceptionHandler, + TenantFrameworkService tenantFrameworkService) { + super(webProperties); + this.tenantProperties = tenantProperties; + this.pathMatcher = new AntPathMatcher(); + this.globalExceptionHandler = globalExceptionHandler; + this.tenantFrameworkService = tenantFrameworkService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + Long tenantId = TenantContextHolder.getTenantId(); + // 1. 登陆的用户,校验是否有权限访问该租户,避免越权问题。 + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if (user != null) { + // 如果获取不到租户编号,则尝试使用登陆用户的租户编号 + if (tenantId == null) { + tenantId = user.getTenantId(); + TenantContextHolder.setTenantId(tenantId); + // 如果传递了租户编号,则进行比对租户编号,避免越权问题 + } else if (!Objects.equals(user.getTenantId(), TenantContextHolder.getTenantId())) { + log.error("[doFilterInternal][租户({}) User({}/{}) 越权访问租户({}) URL({}/{})]", + user.getTenantId(), user.getId(), user.getUserType(), + TenantContextHolder.getTenantId(), request.getRequestURI(), request.getMethod()); + ServletUtils.writeJSON(response, CommonResult.error(GlobalErrorCodeConstants.FORBIDDEN.getCode(), + "您无权访问该租户的数据")); + return; + } + } + + // 如果非允许忽略租户的 URL,则校验租户是否合法 + if (!isIgnoreUrl(request)) { + // 2. 如果请求未带租户的编号,不允许访问。 + if (tenantId == null) { + log.error("[doFilterInternal][URL({}/{}) 未传递租户编号]", request.getRequestURI(), request.getMethod()); + ServletUtils.writeJSON(response, CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), + "请求的租户标识未传递,请进行排查")); + return; + } + // 3. 校验租户是合法,例如说被禁用、到期 + try { + tenantFrameworkService.validTenant(tenantId); + } catch (Throwable ex) { + CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); + ServletUtils.writeJSON(response, result); + return; + } + } else { // 如果是允许忽略租户的 URL,若未传递租户编号,则默认忽略租户编号,避免报错 + if (tenantId == null) { + TenantContextHolder.setIgnore(true); + } + } + + // 继续过滤 + chain.doFilter(request, response); + } + + private boolean isIgnoreUrl(HttpServletRequest request) { + // 快速匹配,保证性能 + if (CollUtil.contains(tenantProperties.getIgnoreUrls(), request.getRequestURI())) { + return true; + } + // 逐个 Ant 路径匹配 + for (String url : tenantProperties.getIgnoreUrls()) { + if (pathMatcher.match(url, request.getRequestURI())) { + return true; + } + } + return false; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java new file mode 100644 index 0000000..5a5751d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java @@ -0,0 +1,26 @@ +package com.win.framework.tenant.core.service; + +import java.util.List; + +/** + * Tenant 框架 Service 接口,定义获取租户信息 + * + * @author 芋道源码 + */ +public interface TenantFrameworkService { + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIds(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java new file mode 100644 index 0000000..1b526fe --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java @@ -0,0 +1,73 @@ +package com.win.framework.tenant.core.service; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.util.cache.CacheUtils; +import com.win.module.system.api.tenant.TenantApi; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +import java.time.Duration; +import java.util.List; + +/** + * Tenant 框架 Service 实现类 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class TenantFrameworkServiceImpl implements TenantFrameworkService { + + private static final ServiceException SERVICE_EXCEPTION_NULL = new ServiceException(); + + private final TenantApi tenantApi; + + /** + * 针对 {@link #getTenantIds()} 的缓存 + */ + private final LoadingCache> getTenantIdsCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader>() { + + @Override + public List load(Object key) { + return tenantApi.getTenantIdList(); + } + + }); + + /** + * 针对 {@link #validTenant(Long)} 的缓存 + */ + private final LoadingCache validTenantCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader() { + + @Override + public ServiceException load(Long id) { + try { + tenantApi.validateTenant(id); + return SERVICE_EXCEPTION_NULL; + } catch (ServiceException ex) { + return ex; + } + } + + }); + + @Override + @SneakyThrows + public List getTenantIds() { + return getTenantIdsCache.get(Boolean.TRUE); + } + + @Override + public void validTenant(Long id) { + ServiceException serviceException = validTenantCache.getUnchecked(id); + if (serviceException != SERVICE_EXCEPTION_NULL) { + throw serviceException; + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java new file mode 100644 index 0000000..4516e27 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java @@ -0,0 +1,93 @@ +package com.win.framework.tenant.core.util; + +import com.win.framework.tenant.core.context.TenantContextHolder; + +import java.util.Map; +import java.util.concurrent.Callable; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * 多租户 Util + * + * @author 芋道源码 + */ +public class TenantUtils { + + /** + * 使用指定租户,执行对应的逻辑 + * + * 注意,如果当前是忽略租户的情况下,会被强制设置成不忽略租户 + * 当然,执行完成后,还是会恢复回去 + * + * @param tenantId 租户编号 + * @param runnable 逻辑 + */ + public static void execute(Long tenantId, Runnable runnable) { + Long oldTenantId = TenantContextHolder.getTenantId(); + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setTenantId(tenantId); + TenantContextHolder.setIgnore(false); + // 执行逻辑 + runnable.run(); + } finally { + TenantContextHolder.setTenantId(oldTenantId); + TenantContextHolder.setIgnore(oldIgnore); + } + } + + /** + * 使用指定租户,执行对应的逻辑 + * + * 注意,如果当前是忽略租户的情况下,会被强制设置成不忽略租户 + * 当然,执行完成后,还是会恢复回去 + * + * @param tenantId 租户编号 + * @param callable 逻辑 + */ + public static V execute(Long tenantId, Callable callable) { + Long oldTenantId = TenantContextHolder.getTenantId(); + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setTenantId(tenantId); + TenantContextHolder.setIgnore(false); + // 执行逻辑 + return callable.call(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + TenantContextHolder.setTenantId(oldTenantId); + TenantContextHolder.setIgnore(oldIgnore); + } + } + + /** + * 忽略租户,执行对应的逻辑 + * + * @param runnable 逻辑 + */ + public static void executeIgnore(Runnable runnable) { + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setIgnore(true); + // 执行逻辑 + runnable.run(); + } finally { + TenantContextHolder.setIgnore(oldIgnore); + } + } + + /** + * 将多租户编号,添加到 header 中 + * + * @param headers HTTP 请求 headers + * @param tenantId 租户编号 + */ + public static void addTenantHeader(Map headers, Long tenantId) { + if (tenantId != null) { + headers.put(HEADER_TENANT_ID, tenantId.toString()); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java new file mode 100644 index 0000000..2ee116c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java @@ -0,0 +1,37 @@ +package com.win.framework.tenant.core.web; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 多租户 Context Web 过滤器 + * 将请求 Header 中的 tenant-id 解析出来,添加到 {@link TenantContextHolder} 中,这样后续的 DB 等操作,可以获得到租户编号。 + * + * @author 芋道源码 + */ +public class TenantContextWebFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + // 设置 + Long tenantId = WebFrameworkUtils.getTenantId(request); + if (tenantId != null) { + TenantContextHolder.setTenantId(tenantId); + } + try { + chain.doFilter(request, response); + } finally { + // 清理 + TenantContextHolder.clear(); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java new file mode 100644 index 0000000..366df6c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java @@ -0,0 +1,17 @@ +/** + * 多租户,支持如下层面: + * 1. DB:基于 MyBatis Plus 多租户的功能实现。 + * 2. Redis:通过在 Redis Key 上拼接租户编号的方式,进行隔离。 + * 3. Web:请求 HTTP API 时,解析 Header 的 tenant-id 租户编号,添加到租户上下文。 + * 4. Security:校验当前登陆的用户,是否越权访问其它租户的数据。 + * 5. Job:在 JobHandler 执行任务时,会按照每个租户,都独立并行执行一次。 + * 6. MQ:在 Producer 发送消息时,Header 带上 tenant-id 租户编号;在 Consumer 消费消息时,将 Header 的 tenant-id 租户编号,添加到租户上下文。 + * 7. Async:异步需要保证 ThreadLocal 的传递性,通过使用阿里开源的 TransmittableThreadLocal 实现。相关的改造点,可见: + * 1)Spring Async: + * {@link com.win.framework.quartz.config.WinAsyncAutoConfiguration#threadPoolTaskExecutorBeanPostProcessor()} + * 2)Spring Security: + * TransmittableThreadLocalSecurityContextHolderStrategy + * 和 WinSecurityAutoConfiguration#securityContextHolderMethodInvokingFactoryBean() 方法 + * + */ +package com.win.framework.tenant; diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java new file mode 100644 index 0000000..8efaeb5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java @@ -0,0 +1,275 @@ +/* + * Copyright 2002-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.messaging.handler.invocation; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.Arrays; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.MethodParameter; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; +import org.springframework.messaging.Message; +import org.springframework.messaging.handler.HandlerMethod; +import org.springframework.util.ObjectUtils; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * Extension of {@link HandlerMethod} that invokes the underlying method with + * argument values resolved from the current HTTP request through a list of + * {@link HandlerMethodArgumentResolver}. + * + * 针对 rabbitmq-spring 和 kafka-spring,不存在合适的拓展点,可以实现 Consumer 消费前,读取 Header 中的 tenant-id 设置到 {@link TenantContextHolder} 中 + * TODO 芋艿:持续跟进,看看有没新的拓展点 + * + * @author Rossen Stoyanchev + * @author Juergen Hoeller + * @since 4.0 + */ +public class InvocableHandlerMethod extends HandlerMethod { + + private static final Object[] EMPTY_ARGS = new Object[0]; + + + private HandlerMethodArgumentResolverComposite resolvers = new HandlerMethodArgumentResolverComposite(); + + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); + + + /** + * Create an instance from a {@code HandlerMethod}. + */ + public InvocableHandlerMethod(HandlerMethod handlerMethod) { + super(handlerMethod); + } + + /** + * Create an instance from a bean instance and a method. + */ + public InvocableHandlerMethod(Object bean, Method method) { + super(bean, method); + } + + /** + * Construct a new handler method with the given bean instance, method name and parameters. + * @param bean the object bean + * @param methodName the method name + * @param parameterTypes the method parameter types + * @throws NoSuchMethodException when the method cannot be found + */ + public InvocableHandlerMethod(Object bean, String methodName, Class... parameterTypes) + throws NoSuchMethodException { + + super(bean, methodName, parameterTypes); + } + + + /** + * Set {@link HandlerMethodArgumentResolver HandlerMethodArgumentResolvers} to use for resolving method argument values. + */ + public void setMessageMethodArgumentResolvers(HandlerMethodArgumentResolverComposite argumentResolvers) { + this.resolvers = argumentResolvers; + } + + /** + * Set the ParameterNameDiscoverer for resolving parameter names when needed + * (e.g. default request attribute name). + *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. + */ + public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { + this.parameterNameDiscoverer = parameterNameDiscoverer; + } + + + /** + * Invoke the method after resolving its argument values in the context of the given message. + *

Argument values are commonly resolved through + * {@link HandlerMethodArgumentResolver HandlerMethodArgumentResolvers}. + * The {@code providedArgs} parameter however may supply argument values to be used directly, + * i.e. without argument resolution. + *

Delegates to {@link #getMethodArgumentValues} and calls {@link #doInvoke} with the + * resolved arguments. + * @param message the current message being processed + * @param providedArgs "given" arguments matched by type, not resolved + * @return the raw value returned by the invoked method + * @throws Exception raised if no suitable argument resolver can be found, + * or if the method raised an exception + * @see #getMethodArgumentValues + * @see #doInvoke + */ + @Nullable + public Object invoke(Message message, Object... providedArgs) throws Exception { + Object[] args = getMethodArgumentValues(message, providedArgs); + if (logger.isTraceEnabled()) { + logger.trace("Arguments: " + Arrays.toString(args)); + } + // 注意:如下是本类的改动点!!! + // 情况一:无租户编号的情况 + Long tenantId= parseTenantId(message); + if (tenantId == null) { + return doInvoke(args); + } + // 情况二:有租户的情况下 + return TenantUtils.execute(tenantId, () -> doInvoke(args)); + } + + private Long parseTenantId(Message message) { + Object tenantId = message.getHeaders().get(HEADER_TENANT_ID); + if (tenantId == null) { + return null; + } + if (tenantId instanceof Long) { + return (Long) tenantId; + } + if (tenantId instanceof Number) { + return ((Number) tenantId).longValue(); + } + if (tenantId instanceof String) { + return Long.parseLong((String) tenantId); + } + if (tenantId instanceof byte[]) { + return Long.parseLong(new String((byte[]) tenantId)); + } + throw new IllegalArgumentException("未知的数据类型:" + tenantId); + } + + /** + * Get the method argument values for the current message, checking the provided + * argument values and falling back to the configured argument resolvers. + *

The resulting array will be passed into {@link #doInvoke}. + * @since 5.1.2 + */ + protected Object[] getMethodArgumentValues(Message message, Object... providedArgs) throws Exception { + MethodParameter[] parameters = getMethodParameters(); + if (ObjectUtils.isEmpty(parameters)) { + return EMPTY_ARGS; + } + + Object[] args = new Object[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + MethodParameter parameter = parameters[i]; + parameter.initParameterNameDiscovery(this.parameterNameDiscoverer); + args[i] = findProvidedArgument(parameter, providedArgs); + if (args[i] != null) { + continue; + } + if (!this.resolvers.supportsParameter(parameter)) { + throw new MethodArgumentResolutionException( + message, parameter, formatArgumentError(parameter, "No suitable resolver")); + } + try { + args[i] = this.resolvers.resolveArgument(parameter, message); + } + catch (Exception ex) { + // Leave stack trace for later, exception may actually be resolved and handled... + if (logger.isDebugEnabled()) { + String exMsg = ex.getMessage(); + if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) { + logger.debug(formatArgumentError(parameter, exMsg)); + } + } + throw ex; + } + } + return args; + } + + /** + * Invoke the handler method with the given argument values. + */ + @Nullable + protected Object doInvoke(Object... args) throws Exception { + try { + return getBridgedMethod().invoke(getBean(), args); + } + catch (IllegalArgumentException ex) { + assertTargetBean(getBridgedMethod(), getBean(), args); + String text = (ex.getMessage() == null || ex.getCause() instanceof NullPointerException) ? + "Illegal argument": ex.getMessage(); + throw new IllegalStateException(formatInvokeError(text, args), ex); + } + catch (InvocationTargetException ex) { + // Unwrap for HandlerExceptionResolvers ... + Throwable targetException = ex.getTargetException(); + if (targetException instanceof RuntimeException runtimeException) { + throw runtimeException; + } + else if (targetException instanceof Error error) { + throw error; + } + else if (targetException instanceof Exception exception) { + throw exception; + } + else { + throw new IllegalStateException(formatInvokeError("Invocation failure", args), targetException); + } + } + } + + MethodParameter getAsyncReturnValueType(@Nullable Object returnValue) { + return new AsyncResultMethodParameter(returnValue); + } + + + private class AsyncResultMethodParameter extends AnnotatedMethodParameter { + + @Nullable + private final Object returnValue; + + private final ResolvableType returnType; + + public AsyncResultMethodParameter(@Nullable Object returnValue) { + super(-1); + this.returnValue = returnValue; + this.returnType = ResolvableType.forType(super.getGenericParameterType()).getGeneric(); + } + + protected AsyncResultMethodParameter(AsyncResultMethodParameter original) { + super(original); + this.returnValue = original.returnValue; + this.returnType = original.returnType; + } + + @Override + public Class getParameterType() { + if (this.returnValue != null) { + return this.returnValue.getClass(); + } + if (!ResolvableType.NONE.equals(this.returnType)) { + return this.returnType.toClass(); + } + return super.getParameterType(); + } + + @Override + public Type getGenericParameterType() { + return this.returnType.getType(); + } + + @Override + public AsyncResultMethodParameter clone() { + return new AsyncResultMethodParameter(this); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories b/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..7e8386a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ + com.win.framework.tenant.core.mq.kafka.TenantKafkaEnvironmentPostProcessor diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..6be41ca --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.tenant.config.WinTenantAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-excel/pom.xml b/win-framework/win-spring-boot-starter-excel/pom.xml new file mode 100644 index 0000000..74f15a7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/pom.xml @@ -0,0 +1,73 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-excel + jar + + ${project.artifactId} + Excel 拓展 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.win + win-module-system-api + ${revision} + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + + com.alibaba + easyexcel + + + + com.google.guava + guava + + + + org.apache.commons + commons-compress + + + + com.win + win-spring-boot-starter-biz-ip + true + + + + diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java new file mode 100644 index 0000000..2f1d519 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java @@ -0,0 +1,18 @@ +package com.win.framework.dict.config; + +import com.win.framework.dict.core.DictFrameworkUtils; +import com.win.module.system.api.dict.DictDataApi; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +public class WinDictAutoConfiguration { + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public DictFrameworkUtils dictUtils(DictDataApi dictDataApi) { + DictFrameworkUtils.init(dictDataApi); + return new DictFrameworkUtils(); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/core/DictFrameworkUtils.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/core/DictFrameworkUtils.java new file mode 100644 index 0000000..326fc19 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/core/DictFrameworkUtils.java @@ -0,0 +1,96 @@ +package com.win.framework.dict.core; + +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.cache.CacheUtils; +import com.win.module.system.api.dict.DictDataApi; +import com.win.module.system.api.dict.dto.DictDataRespDTO; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.time.Duration; +import java.util.List; + +/** + * 字典工具类 + * + * @author 芋道源码 + */ +@Slf4j +public class DictFrameworkUtils { + + private static DictDataApi dictDataApi; + + private static final DictDataRespDTO DICT_DATA_NULL = new DictDataRespDTO(); + + // TODO @puhui999:GET_DICT_DATA_CACHE、GET_DICT_DATA_LIST_CACHE、PARSE_DICT_DATA_CACHE 这 3 个缓存是有点重叠,可以思考下,有没可能减少 1 个。微信讨论好私聊,再具体改哈 + /** + * 针对 {@link #getDictDataLabel(String, String)} 的缓存 + */ + private static final LoadingCache, DictDataRespDTO> GET_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, DictDataRespDTO>() { + + @Override + public DictDataRespDTO load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.getDictData(key.getKey(), key.getValue()), DICT_DATA_NULL); + } + + }); + + /** + * 针对 {@link #getDictDataLabelList(String)} 的缓存 + */ + private static final LoadingCache> GET_DICT_DATA_LIST_CACHE = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader>() { + + @Override + public List load(String dictType) { + return dictDataApi.getDictDataLabelList(dictType); + } + + }); + + /** + * 针对 {@link #parseDictDataValue(String, String)} 的缓存 + */ + private static final LoadingCache, DictDataRespDTO> PARSE_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, DictDataRespDTO>() { + + @Override + public DictDataRespDTO load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.parseDictData(key.getKey(), key.getValue()), DICT_DATA_NULL); + } + + }); + + public static void init(DictDataApi dictDataApi) { + DictFrameworkUtils.dictDataApi = dictDataApi; + log.info("[init][初始化 DictFrameworkUtils 成功]"); + } + + @SneakyThrows + public static String getDictDataLabel(String dictType, Integer value) { + return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, String.valueOf(value))).getLabel(); + } + + @SneakyThrows + public static String getDictDataLabel(String dictType, String value) { + return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, value)).getLabel(); + } + + @SneakyThrows + public static List getDictDataLabelList(String dictType) { + return GET_DICT_DATA_LIST_CACHE.get(dictType); + } + + @SneakyThrows + public static String parseDictDataValue(String dictType, String label) { + return PARSE_DICT_DATA_CACHE.get(new KeyValue<>(dictType, label)).getValue(); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/package-info.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/package-info.java new file mode 100644 index 0000000..d1e8e1e --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/dict/package-info.java @@ -0,0 +1,6 @@ +/** + * 字典数据模块,提供 {@link com.win.framework.dict.core.DictFrameworkUtils} 工具类 + * + * 通过将字典缓存在内存中,保证性能 + */ +package com.win.framework.dict; diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java new file mode 100644 index 0000000..2df7177 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java @@ -0,0 +1,22 @@ +package com.win.framework.excel.core.annotations; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * 实现将字典数据的值,格式化成字典数据的标签 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface DictFormat { + + /** + * 例如说,SysDictTypeConstants、InfDictTypeConstants + * + * @return 字典类型 + */ + String value(); + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/ExcelColumnSelect.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/ExcelColumnSelect.java new file mode 100644 index 0000000..d89ab9a --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/ExcelColumnSelect.java @@ -0,0 +1,27 @@ +package com.win.framework.excel.core.annotations; + +import java.lang.annotation.*; + +/** + * 给 Excel 列添加下拉选择数据 + * + * 其中 {@link #dictType()} 和 {@link #functionName()} 二选一 + * + * @author HUIHUI + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelColumnSelect { + + /** + * @return 字典类型 + */ + String dictType() default ""; + + /** + * @return 获取下拉数据源的方法名称 + */ + String functionName() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/AreaConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/AreaConvert.java new file mode 100644 index 0000000..49f1190 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/AreaConvert.java @@ -0,0 +1,46 @@ +package com.win.framework.excel.core.convert; + +import cn.hutool.core.convert.Convert; +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.utils.AreaUtils; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +/** + * Excel 数据地区转换器 + * + * @author HUIHUI + */ +@Slf4j +public class AreaConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 解析地区编号 + String label = readCellData.getStringValue(); + Area area = AreaUtils.parseArea(label); + if (area == null) { + log.error("[convertToJavaData][label({}) 解析不掉]", label); + return null; + } + // 将 value 转换成对应的属性 + Class fieldClazz = contentProperty.getField().getType(); + return Convert.convert(fieldClazz, area.getId()); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java new file mode 100644 index 0000000..5f2011c --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java @@ -0,0 +1,72 @@ +package com.win.framework.excel.core.convert; + +import cn.hutool.core.convert.Convert; +import com.win.framework.dict.core.DictFrameworkUtils; +import com.win.framework.excel.core.annotations.DictFormat; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +/** + * Excel 数据字典转换器 + * + * @author 芋道源码 + */ +@Slf4j +public class DictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 使用字典解析 + String type = getType(contentProperty); + String label = readCellData.getStringValue(); + String value = DictFrameworkUtils.parseDictDataValue(type, label); + if (value == null) { + log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label); + return null; + } + // 将 String 的 value 转换成对应的属性 + Class fieldClazz = contentProperty.getField().getType(); + return Convert.convert(fieldClazz, value); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 空时,返回空 + if (object == null) { + return new WriteCellData<>(""); + } + + // 使用字典格式化 + String type = getType(contentProperty); + String value = String.valueOf(object); + String label = DictFrameworkUtils.getDictDataLabel(type, value); + if (label == null) { + log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value); + return new WriteCellData<>(""); + } + // 生成 Excel 小表格 + return new WriteCellData<>(label); + } + + private static String getType(ExcelContentProperty contentProperty) { + return contentProperty.getField().getAnnotation(DictFormat.class).value(); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java new file mode 100644 index 0000000..a9487aa --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java @@ -0,0 +1,34 @@ +package com.win.framework.excel.core.convert; + +import com.win.framework.common.util.json.JsonUtils; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * Excel Json 转换器 + * + * @author 芋道源码 + */ +public class JsonConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public WriteCellData convertToExcelData(Object value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 生成 Excel 小表格 + return new WriteCellData<>(JsonUtils.toJsonString(value)); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java new file mode 100644 index 0000000..a22696b --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java @@ -0,0 +1,39 @@ +package com.win.framework.excel.core.convert; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 金额转换器 + * + * 金额单位:分 + * + * @author 芋道源码 + */ +public class MoneyConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + BigDecimal result = BigDecimal.valueOf(value) + .divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); + return new WriteCellData<>(result.toString()); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/function/ExcelColumnSelectFunction.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/function/ExcelColumnSelectFunction.java new file mode 100644 index 0000000..d564e78 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/function/ExcelColumnSelectFunction.java @@ -0,0 +1,28 @@ +package com.win.framework.excel.core.function; + +import java.util.List; + +/** + * Excel 列下拉数据源获取接口 + * + * 为什么不直接解析字典还搞个接口?考虑到有的下拉数据不是从字典中获取的所有需要做一个兼容 + + * @author HUIHUI + */ +public interface ExcelColumnSelectFunction { + + /** + * 获得方法名称 + * + * @return 方法名称 + */ + String getName(); + + /** + * 获得列下拉数据源 + * + * @return 下拉数据源 + */ + List getOptions(); + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/SelectSheetWriteHandler.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/SelectSheetWriteHandler.java new file mode 100644 index 0000000..6625f5e --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/SelectSheetWriteHandler.java @@ -0,0 +1,158 @@ +package com.win.framework.excel.core.handler; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.poi.excel.ExcelUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.dict.core.DictFrameworkUtils; +import com.win.framework.excel.core.annotations.ExcelColumnSelect; +import com.win.framework.excel.core.function.ExcelColumnSelectFunction; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.HSSFDataValidation; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; + +import java.lang.reflect.Field; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 基于固定 sheet 实现下拉框 + * + * @author HUIHUI + */ +@Slf4j +public class SelectSheetWriteHandler implements SheetWriteHandler { + + /** + * 数据起始行从 0 开始 + * + * 约定:本项目第一行有标题所以从 1 开始如果您的 Excel 有多行标题请自行更改 + */ + public static final int FIRST_ROW = 1; + /** + * 下拉列需要创建下拉框的行数,默认两千行如需更多请自行调整 + */ + public static final int LAST_ROW = 2000; + + private static final String DICT_SHEET_NAME = "字典sheet"; + + /** + * key: 列 value: 下拉数据源 + */ + private final Map> selectMap = new HashMap<>(); + + public SelectSheetWriteHandler(Class head) { + // 解析下拉数据 + int colIndex = 0; + for (Field field : head.getDeclaredFields()) { + if (field.isAnnotationPresent(ExcelColumnSelect.class)) { + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + if (excelProperty != null && excelProperty.index() != -1) { + colIndex = excelProperty.index(); + } + getSelectDataList(colIndex, field); + } + colIndex++; + } + } + + /** + * 获得下拉数据,并添加到 {@link #selectMap} 中 + * + * @param colIndex 列索引 + * @param field 字段 + */ + private void getSelectDataList(int colIndex, Field field) { + ExcelColumnSelect columnSelect = field.getAnnotation(ExcelColumnSelect.class); + String dictType = columnSelect.dictType(); + String functionName = columnSelect.functionName(); + Assert.isTrue(ObjectUtil.isNotEmpty(dictType) || ObjectUtil.isNotEmpty(functionName), + "Field({}) 的 @ExcelColumnSelect 注解,dictType 和 functionName 不能同时为空", field.getName()); + + // 情况一:使用 dictType 获得下拉数据 + if (StrUtil.isNotEmpty(dictType)) { // 情况一: 字典数据 (默认) + selectMap.put(colIndex, DictFrameworkUtils.getDictDataLabelList(dictType)); + return; + } + + // 情况二:使用 functionName 获得下拉数据 + Map functionMap = SpringUtil.getApplicationContext().getBeansOfType(ExcelColumnSelectFunction.class); + ExcelColumnSelectFunction function = CollUtil.findOne(functionMap.values(), item -> item.getName().equals(functionName)); + Assert.notNull(function, "未找到对应的 function({})", functionName); + selectMap.put(colIndex, function.getOptions()); + } + + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + if (CollUtil.isEmpty(selectMap)) { + return; + } + + // 1. 获取相应操作对象 + DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper(); // 需要设置下拉框的 sheet 页的数据验证助手 + Workbook workbook = writeWorkbookHolder.getWorkbook(); // 获得工作簿 + List>> keyValues = convertList(selectMap.entrySet(), entry -> new KeyValue<>(entry.getKey(), entry.getValue())); + keyValues.sort(Comparator.comparing(item -> item.getValue().size())); // 升序不然创建下拉会报错 + + // 2. 创建数据字典的 sheet 页 + Sheet dictSheet = workbook.createSheet(DICT_SHEET_NAME); + for (KeyValue> keyValue : keyValues) { + int rowLength = keyValue.getValue().size(); + // 2.1 设置字典 sheet 页的值,每一列一个字典项 + for (int i = 0; i < rowLength; i++) { + Row row = dictSheet.getRow(i); + if (row == null) { + row = dictSheet.createRow(i); + } + row.createCell(keyValue.getKey()).setCellValue(keyValue.getValue().get(i)); + } + // 2.2 设置单元格下拉选择 + setColumnSelect(writeSheetHolder, workbook, helper, keyValue); + } + } + + /** + * 设置单元格下拉选择 + */ + private static void setColumnSelect(WriteSheetHolder writeSheetHolder, Workbook workbook, DataValidationHelper helper, + KeyValue> keyValue) { + // 1.1 创建可被其他单元格引用的名称 + Name name = workbook.createName(); + String excelColumn = ExcelUtil.indexToColName(keyValue.getKey()); + // 1.2 下拉框数据来源 eg:字典sheet!$B1:$B2 + String refers = DICT_SHEET_NAME + "!$" + excelColumn + "$1:$" + excelColumn + "$" + keyValue.getValue().size(); + name.setNameName("dict" + keyValue.getKey()); // 设置名称的名字 + name.setRefersToFormula(refers); // 设置公式 + + // 2.1 设置约束 + DataValidationConstraint constraint = helper.createFormulaListConstraint("dict" + keyValue.getKey()); // 设置引用约束 + // 设置下拉单元格的首行、末行、首列、末列 + CellRangeAddressList rangeAddressList = new CellRangeAddressList(FIRST_ROW, LAST_ROW, + keyValue.getKey(), keyValue.getKey()); + DataValidation validation = helper.createValidation(constraint, rangeAddressList); + if (validation instanceof HSSFDataValidation) { + validation.setSuppressDropDownArrow(false); + } else { + validation.setSuppressDropDownArrow(true); + validation.setShowErrorBox(true); + } + // 2.2 阻止输入非下拉框的值 + validation.setErrorStyle(DataValidation.ErrorStyle.STOP); + validation.createErrorBox("提示", "此值不存在于下拉选择中!"); + // 2.3 添加下拉框约束 + writeSheetHolder.getSheet().addValidationData(validation); + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java new file mode 100644 index 0000000..fc1c960 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java @@ -0,0 +1,53 @@ +package com.win.framework.excel.core.util; + +import com.win.framework.excel.core.handler.SelectSheetWriteHandler; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.converters.longconverter.LongStringConverter; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * Excel 工具类 + * + * @author 芋道源码 + */ +public class ExcelUtils { + + /** + * 将列表以 Excel 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void write(HttpServletResponse response, String filename, String sheetName, + Class head, List data) throws IOException { + // 输出 Excel + EasyExcel.write(response.getOutputStream(), head) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 + .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 + .sheet(sheetName).doWrite(data); + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name())); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + } + + public static List read(MultipartFile file, Class head) throws IOException { + return EasyExcel.read(file.getInputStream(), head, null) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java new file mode 100644 index 0000000..bdd8936 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 EasyExcel 实现 Excel 相关的操作 + */ +package com.win.framework.excel; diff --git a/win-framework/win-spring-boot-starter-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..050af88 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.dict.config.WinDictAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-job/pom.xml b/win-framework/win-spring-boot-starter-job/pom.xml new file mode 100644 index 0000000..8d5e8eb --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/pom.xml @@ -0,0 +1,41 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-job + jar + + ${project.artifactId} + 任务拓展 + 1. 定时任务,基于 Quartz 拓展 + 2. 异步任务,基于 Spring Async 拓展 + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + jakarta.validation + jakarta.validation-api + + + + + diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java new file mode 100644 index 0000000..1257100 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java @@ -0,0 +1,36 @@ +package com.win.framework.quartz.config; + +import com.alibaba.ttl.TtlRunnable; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * 异步任务 Configuration + */ +@AutoConfiguration +@EnableAsync +public class WinAsyncAutoConfiguration { + + @Bean + public BeanPostProcessor threadPoolTaskExecutorBeanPostProcessor() { + return new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (!(bean instanceof ThreadPoolTaskExecutor)) { + return bean; + } + // 修改提交的任务,接入 TransmittableThreadLocal + ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) bean; + executor.setTaskDecorator(TtlRunnable::get); + return executor; + } + + }; + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java new file mode 100644 index 0000000..9e703e1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java @@ -0,0 +1,29 @@ +package com.win.framework.quartz.config; + +import com.win.framework.quartz.core.scheduler.SchedulerManager; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Scheduler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; + +import java.util.Optional; + +/** + * 定时任务 Configuration + */ +@AutoConfiguration +@EnableScheduling // 开启 Spring 自带的定时任务 +@Slf4j +public class WinQuartzAutoConfiguration { + + @Bean + public SchedulerManager schedulerManager(Optional scheduler) { + if (!scheduler.isPresent()) { + log.info("[定时任务 - 已禁用][参考 https://doc.iocoder.cn/job/ 开启]"); + return new SchedulerManager(null); + } + return new SchedulerManager(scheduler.get()); + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java new file mode 100644 index 0000000..6dbe9a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java @@ -0,0 +1,14 @@ +package com.win.framework.quartz.core.enums; + +/** + * Quartz Job Data 的 key 枚举 + */ +public enum JobDataKeyEnum { + + JOB_ID, + JOB_HANDLER_NAME, + JOB_HANDLER_PARAM, + JOB_RETRY_COUNT, // 最大重试次数 + JOB_RETRY_INTERVAL, // 每次重试间隔 + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java new file mode 100644 index 0000000..a306926 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java @@ -0,0 +1,19 @@ +package com.win.framework.quartz.core.handler; + +/** + * 任务处理器 + * + * @author 芋道源码 + */ +public interface JobHandler { + + /** + * 执行任务 + * + * @param param 参数 + * @return 结果 + * @throws Exception 异常 + */ + String execute(String param) throws Exception; + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java new file mode 100644 index 0000000..c9fc03f --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java @@ -0,0 +1,113 @@ +package com.win.framework.quartz.core.handler; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.thread.ThreadUtil; +import com.win.framework.quartz.core.enums.JobDataKeyEnum; +import com.win.framework.quartz.core.service.JobLogFrameworkService; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.PersistJobDataAfterExecution; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; + +import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; + +/** + * 基础 Job 调用者,负责调用 {@link JobHandler#execute(String)} 执行任务 + * + * @author 芋道源码 + */ +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +@Slf4j +public class JobHandlerInvoker extends QuartzJobBean { + + @Resource + private ApplicationContext applicationContext; + + @Resource + private JobLogFrameworkService jobLogFrameworkService; + + @Override + protected void executeInternal(JobExecutionContext executionContext) throws JobExecutionException { + // 第一步,获得 Job 数据 + Long jobId = executionContext.getMergedJobDataMap().getLong(JobDataKeyEnum.JOB_ID.name()); + String jobHandlerName = executionContext.getMergedJobDataMap().getString(JobDataKeyEnum.JOB_HANDLER_NAME.name()); + String jobHandlerParam = executionContext.getMergedJobDataMap().getString(JobDataKeyEnum.JOB_HANDLER_PARAM.name()); + int refireCount = executionContext.getRefireCount(); + int retryCount = (Integer) executionContext.getMergedJobDataMap().getOrDefault(JobDataKeyEnum.JOB_RETRY_COUNT.name(), 0); + int retryInterval = (Integer) executionContext.getMergedJobDataMap().getOrDefault(JobDataKeyEnum.JOB_RETRY_INTERVAL.name(), 0); + + // 第二步,执行任务 + Long jobLogId = null; + LocalDateTime startTime = LocalDateTime.now(); + String data = null; + Throwable exception = null; + try { + // 记录 Job 日志(初始) + jobLogId = jobLogFrameworkService.createJobLog(jobId, startTime, jobHandlerName, jobHandlerParam, refireCount + 1); + // 执行任务 + data = this.executeInternal(jobHandlerName, jobHandlerParam); + } catch (Throwable ex) { + exception = ex; + } + + // 第三步,记录执行日志 + this.updateJobLogResultAsync(jobLogId, startTime, data, exception, executionContext); + + // 第四步,处理有异常的情况 + handleException(exception, refireCount, retryCount, retryInterval); + } + + private String executeInternal(String jobHandlerName, String jobHandlerParam) throws Exception { + // 获得 JobHandler 对象 + JobHandler jobHandler = applicationContext.getBean(jobHandlerName, JobHandler.class); + Assert.notNull(jobHandler, "JobHandler 不会为空"); + // 执行任务 + return jobHandler.execute(jobHandlerParam); + } + + private void updateJobLogResultAsync(Long jobLogId, LocalDateTime startTime, String data, Throwable exception, + JobExecutionContext executionContext) { + LocalDateTime endTime = LocalDateTime.now(); + // 处理是否成功 + boolean success = exception == null; + if (!success) { + data = getRootCauseMessage(exception); + } + // 更新日志 + try { + jobLogFrameworkService.updateJobLogResultAsync(jobLogId, endTime, (int) LocalDateTimeUtil.between(startTime, endTime).toMillis(), success, data); + } catch (Exception ex) { + log.error("[executeInternal][Job({}) logId({}) 记录执行日志失败({}/{})]", + executionContext.getJobDetail().getKey(), jobLogId, success, data); + } + } + + private void handleException(Throwable exception, + int refireCount, int retryCount, int retryInterval) throws JobExecutionException { + // 如果有异常,则进行重试 + if (exception == null) { + return; + } + // 情况一:如果到达重试上限,则直接抛出异常即可 + if (refireCount >= retryCount) { + throw new JobExecutionException(exception); + } + + // 情况二:如果未到达重试上限,则 sleep 一定间隔时间,然后重试 + // 这里使用 sleep 来实现,主要还是希望实现比较简单。因为,同一时间,不会存在大量失败的 Job。 + if (retryInterval > 0) { + ThreadUtil.sleep(retryInterval); + } + // 第二个参数,refireImmediately = true,表示立即重试 + throw new JobExecutionException(exception, true); + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java new file mode 100644 index 0000000..d19b81a --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java @@ -0,0 +1,150 @@ +package com.win.framework.quartz.core.scheduler; + +import com.win.framework.quartz.core.enums.JobDataKeyEnum; +import com.win.framework.quartz.core.handler.JobHandlerInvoker; +import org.quartz.*; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; + +/** + * {@link org.quartz.Scheduler} 的管理器,负责创建任务 + * + * 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即: + * 1. Job 的 {@link JobDetail#getKey()} + * 2. Trigger 的 {@link Trigger#getKey()} + * + * 另外,jobHandlerName 对应到 Spring Bean 的名字,直接调用 + * + * @author 芋道源码 + */ +public class SchedulerManager { + + private final Scheduler scheduler; + + public SchedulerManager(Scheduler scheduler) { + this.scheduler = scheduler; + } + + /** + * 添加 Job 到 Quartz 中 + * + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 + * @throws SchedulerException 添加异常 + */ + public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) + throws SchedulerException { + validateScheduler(); + // 创建 JobDetail 对象 + JobDetail jobDetail = JobBuilder.newJob(JobHandlerInvoker.class) + .usingJobData(JobDataKeyEnum.JOB_ID.name(), jobId) + .usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName) + .withIdentity(jobHandlerName).build(); + // 创建 Trigger 对象 + Trigger trigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + // 新增 Job 调度 + scheduler.scheduleJob(jobDetail, trigger); + } + + /** + * 更新 Job 到 Quartz + * + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 + * @throws SchedulerException 更新异常 + */ + public void updateJob(String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) + throws SchedulerException { + validateScheduler(); + // 创建新 Trigger 对象 + Trigger newTrigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + // 修改调度 + scheduler.rescheduleJob(new TriggerKey(jobHandlerName), newTrigger); + } + + /** + * 删除 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 删除异常 + */ + public void deleteJob(String jobHandlerName) throws SchedulerException { + validateScheduler(); + // 暂停 Trigger 对象 + scheduler.pauseTrigger(new TriggerKey(jobHandlerName)); + // 取消并删除 Job 调度 + scheduler.unscheduleJob(new TriggerKey(jobHandlerName)); + scheduler.deleteJob(new JobKey(jobHandlerName)); + } + + /** + * 暂停 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 暂停异常 + */ + public void pauseJob(String jobHandlerName) throws SchedulerException { + validateScheduler(); + scheduler.pauseJob(new JobKey(jobHandlerName)); + } + + /** + * 启动 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 启动异常 + */ + public void resumeJob(String jobHandlerName) throws SchedulerException { + validateScheduler(); + scheduler.resumeJob(new JobKey(jobHandlerName)); + scheduler.resumeTrigger(new TriggerKey(jobHandlerName)); + } + + /** + * 立即触发一次 Quartz 中的 Job + * + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @throws SchedulerException 触发异常 + */ + public void triggerJob(Long jobId, String jobHandlerName, String jobHandlerParam) + throws SchedulerException { + validateScheduler(); + // 触发任务 + JobDataMap data = new JobDataMap(); // 无需重试,所以不设置 retryCount 和 retryInterval + data.put(JobDataKeyEnum.JOB_ID.name(), jobId); + data.put(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName); + data.put(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam); + scheduler.triggerJob(new JobKey(jobHandlerName), data); + } + + private Trigger buildTrigger(String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) { + return TriggerBuilder.newTrigger() + .withIdentity(jobHandlerName) + .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) + .usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam) + .usingJobData(JobDataKeyEnum.JOB_RETRY_COUNT.name(), retryCount) + .usingJobData(JobDataKeyEnum.JOB_RETRY_INTERVAL.name(), retryInterval) + .build(); + } + + private void validateScheduler() { + if (scheduler == null) { + throw exception0(NOT_IMPLEMENTED.getCode(), + "[定时任务 - 已禁用][参考 https://doc.iocoder.cn/job/ 开启]"); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java new file mode 100644 index 0000000..ed9be4f --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java @@ -0,0 +1,43 @@ +package com.win.framework.quartz.core.service; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * Job 日志 Framework Service 接口 + * + * @author 芋道源码 + */ +public interface JobLogFrameworkService { + + /** + * 创建 Job 日志 + * + * @param jobId 任务编号 + * @param beginTime 开始时间 + * @param jobHandlerName Job 处理器的名字 + * @param jobHandlerParam Job 处理器的参数 + * @param executeIndex 第几次执行 + * @return Job 日志的编号 + */ + Long createJobLog(@NotNull(message = "任务编号不能为空") Long jobId, + @NotNull(message = "开始时间") LocalDateTime beginTime, + @NotEmpty(message = "Job 处理器的名字不能为空") String jobHandlerName, + String jobHandlerParam, + @NotNull(message = "第几次执行不能为空") Integer executeIndex); + + /** + * 更新 Job 日志的执行结果 + * + * @param logId 日志编号 + * @param endTime 结束时间。因为是异步,避免记录时间不准去 + * @param duration 运行时长,单位:毫秒 + * @param success 是否成功 + * @param result 成功数据 + */ + void updateJobLogResultAsync(@NotNull(message = "日志编号不能为空") Long logId, + @NotNull(message = "结束时间不能为空") LocalDateTime endTime, + @NotNull(message = "运行时长不能为空") Integer duration, + boolean success, String result); +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java new file mode 100644 index 0000000..aa15a77 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java @@ -0,0 +1,60 @@ +package com.win.framework.quartz.core.util; + +import cn.hutool.core.date.LocalDateTimeUtil; +import org.quartz.CronExpression; + +import java.text.ParseException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Quartz Cron 表达式的工具类 + * + * @author 芋道源码 + */ +public class CronUtils { + + /** + * 校验 CRON 表达式是否有效 + * + * @param cronExpression CRON 表达式 + * @return 是否有效 + */ + public static boolean isValid(String cronExpression) { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 基于 CRON 表达式,获得下 n 个满足执行的时间 + * + * @param cronExpression CRON 表达式 + * @param n 数量 + * @return 满足条件的执行时间 + */ + public static List getNextTimes(String cronExpression, int n) { + // 1. 获得 CronExpression 对象 + CronExpression cron; + try { + cron = new CronExpression(cronExpression); + } catch (ParseException e) { + throw new IllegalArgumentException(e.getMessage()); + } + // 2. 从当前开始计算,n 个满足条件的 + Date now = new Date(); + List nextTimes = new ArrayList<>(n); + for (int i = 0; i < n; i++) { + Date nextTime = cron.getNextValidTimeAfter(now); + // 2.1 如果 nextTime 为 null,说明没有更多的有效时间,退出循环 + if (nextTime == null) { + break; + } + nextTimes.add(LocalDateTimeUtil.of(nextTime)); + // 2.2 切换现在,为下一个触发时间; + now = nextTime; + } + return nextTimes; + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java new file mode 100644 index 0000000..c404d50 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java @@ -0,0 +1,7 @@ +/** + * 1. 定时任务,采用 Quartz 实现进程内的任务执行。 + * 考虑到高可用,使用 Quartz 自带的 MySQL 集群方案。 + * + * 2. 异步任务,采用 Spring Async 异步执行。 + */ +package com.win.framework.quartz; diff --git a/win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..419bbd5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.quartz.config.WinQuartzAutoConfiguration +com.win.framework.quartz.config.WinAsyncAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md b/win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md new file mode 100644 index 0000000..9a8a16c --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md b/win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md new file mode 100644 index 0000000..3161ffb --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-monitor/pom.xml b/win-framework/win-spring-boot-starter-monitor/pom.xml new file mode 100644 index 0000000..f3a4600 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/pom.xml @@ -0,0 +1,73 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-monitor + jar + + ${project.artifactId} + 服务监控,提供链路追踪、日志服务、指标收集等等功能 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + + io.opentracing + opentracing-util + + + org.apache.skywalking + apm-toolkit-trace + + + org.apache.skywalking + apm-toolkit-logback-1.x + + + org.apache.skywalking + apm-toolkit-opentracing + + + + + io.micrometer + micrometer-registry-prometheus + + + + de.codecentric + spring-boot-admin-starter-client + + + + diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java new file mode 100644 index 0000000..785bc88 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java @@ -0,0 +1,14 @@ +package com.win.framework.tracer.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * BizTracer配置类 + * + * @author 麻薯 + */ +@ConfigurationProperties("win.tracer") +@Data +public class TracerProperties { +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java new file mode 100644 index 0000000..26dece1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java @@ -0,0 +1,27 @@ +package com.win.framework.tracer.config; + +import io.micrometer.core.instrument.MeterRegistry; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; + +/** + * Metrics 配置类 + * + * @author 芋道源码 + */ +@AutoConfiguration +@ConditionalOnClass({MeterRegistryCustomizer.class}) +@ConditionalOnProperty(prefix = "win.metrics", value = "enable", matchIfMissing = true) // 允许使用 win.metrics.enable=false 禁用 Metrics +public class WinMetricsAutoConfiguration { + + @Bean + public MeterRegistryCustomizer metricsCommonTags( + @Value("${spring.application.name}") String applicationName) { + return registry -> registry.config().commonTags("application", applicationName); + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java new file mode 100644 index 0000000..643fbb8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java @@ -0,0 +1,55 @@ +package com.win.framework.tracer.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.tracer.core.aop.BizTraceAspect; +import com.win.framework.tracer.core.filter.TraceFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * Tracer 配置类 + * + * @author mashu + */ +@AutoConfiguration +@ConditionalOnClass({BizTraceAspect.class}) +@EnableConfigurationProperties(TracerProperties.class) +@ConditionalOnProperty(prefix = "win.tracer", value = "enable", matchIfMissing = true) +public class WinTracerAutoConfiguration { + + // TODO @芋艿:重要。目前 opentracing 版本存在冲突,要么保证 skywalking,要么保证阿里云短信 sdk +// @Bean +// public TracerProperties bizTracerProperties() { +// return new TracerProperties(); +// } +// +// @Bean +// public BizTraceAspect bizTracingAop() { +// return new BizTraceAspect(tracer()); +// } +// +// @Bean +// public Tracer tracer() { +// // 创建 SkywalkingTracer 对象 +// SkywalkingTracer tracer = new SkywalkingTracer(); +// // 设置为 GlobalTracer 的追踪器 +// GlobalTracer.register(tracer); +// return tracer; +// } + + /** + * 创建 TraceFilter 过滤器,响应 header 设置 traceId + */ + @Bean + public FilterRegistrationBean traceFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TraceFilter()); + registrationBean.setOrder(WebFilterOrderEnum.TRACE_FILTER); + return registrationBean; + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java new file mode 100644 index 0000000..0d72635 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java @@ -0,0 +1,42 @@ +package com.win.framework.tracer.core.annotation; + +import java.lang.annotation.*; + +/** + * 打印业务编号 / 业务类型注解 + * + * 使用时,需要设置 SkyWalking OAP Server 的 application.yaml 配置文件,修改 SW_SEARCHABLE_TAG_KEYS 配置项, + * 增加 biz.type 和 biz.id 两值,然后重启 SkyWalking OAP Server 服务器。 + * + * @author 麻薯 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface BizTrace { + + /** + * 业务编号 tag 名 + */ + String ID_TAG = "biz.id"; + /** + * 业务类型 tag 名 + */ + String TYPE_TAG = "biz.type"; + + /** + * @return 操作名 + */ + String operationName() default ""; + + /** + * @return 业务编号 + */ + String id(); + + /** + * @return 业务类型 + */ + String type(); + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java new file mode 100644 index 0000000..de6f1fa --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java @@ -0,0 +1,77 @@ +package com.win.framework.tracer.core.aop; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.tracer.core.annotation.BizTrace; +import com.win.framework.common.util.spring.SpringExpressionUtils; +import com.win.framework.tracer.core.util.TracerFrameworkUtils; +import io.opentracing.Span; +import io.opentracing.Tracer; +import io.opentracing.tag.Tags; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import java.util.Map; + +import static java.util.Arrays.asList; + +/** + * {@link BizTrace} 切面,记录业务链路 + * + * @author mashu + */ +@Aspect +@AllArgsConstructor +@Slf4j +public class BizTraceAspect { + + private static final String BIZ_OPERATION_NAME_PREFIX = "Biz/"; + + private final Tracer tracer; + + @Around(value = "@annotation(trace)") + public Object around(ProceedingJoinPoint joinPoint, BizTrace trace) throws Throwable { + // 创建 span + String operationName = getOperationName(joinPoint, trace); + Span span = tracer.buildSpan(operationName) + .withTag(Tags.COMPONENT.getKey(), "biz") + .start(); + try { + // 执行原有方法 + return joinPoint.proceed(); + } catch (Throwable throwable) { + TracerFrameworkUtils.onError(throwable, span); + throw throwable; + } finally { + // 设置 Span 的 biz 属性 + setBizTag(span, joinPoint, trace); + // 完成 Span + span.finish(); + } + } + + private String getOperationName(ProceedingJoinPoint joinPoint, BizTrace trace) { + // 自定义操作名 + if (StrUtil.isNotEmpty(trace.operationName())) { + return BIZ_OPERATION_NAME_PREFIX + trace.operationName(); + } + // 默认操作名,使用方法名 + return BIZ_OPERATION_NAME_PREFIX + + joinPoint.getSignature().getDeclaringType().getSimpleName() + + "/" + joinPoint.getSignature().getName(); + } + + private void setBizTag(Span span, ProceedingJoinPoint joinPoint, BizTrace trace) { + try { + Map result = SpringExpressionUtils.parseExpressions(joinPoint, asList(trace.type(), trace.id())); + span.setTag(BizTrace.TYPE_TAG, MapUtil.getStr(result, trace.type())); + span.setTag(BizTrace.ID_TAG, MapUtil.getStr(result, trace.id())); + } catch (Exception ex) { + log.error("[setBizTag][解析 bizType 与 bizId 发生异常]", ex); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java new file mode 100644 index 0000000..e18dcb1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java @@ -0,0 +1,33 @@ +package com.win.framework.tracer.core.filter; + +import com.win.framework.common.util.monitor.TracerUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Trace 过滤器,打印 traceId 到 header 中返回 + * + * @author 芋道源码 + */ +public class TraceFilter extends OncePerRequestFilter { + + /** + * Header 名 - 链路追踪编号 + */ + private static final String HEADER_NAME_TRACE_ID = "trace-id"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws IOException, ServletException { + // 设置响应 traceId + response.addHeader(HEADER_NAME_TRACE_ID, TracerUtils.getTraceId()); + // 继续过滤 + chain.doFilter(request, response); + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java new file mode 100644 index 0000000..0a9d6bb --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java @@ -0,0 +1,46 @@ +package com.win.framework.tracer.core.util; + +import io.opentracing.Span; +import io.opentracing.tag.Tags; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * 链路追踪 Util + * + * @author 芋道源码 + */ +public class TracerFrameworkUtils { + + /** + * 将异常记录到 Span 中,参考自 com.aliyuncs.utils.TraceUtils + * + * @param throwable 异常 + * @param span Span + */ + public static void onError(Throwable throwable, Span span) { + Tags.ERROR.set(span, Boolean.TRUE); + if (throwable != null) { + span.log(errorLogs(throwable)); + } + } + + private static Map errorLogs(Throwable throwable) { + Map errorLogs = new HashMap(10); + errorLogs.put("event", Tags.ERROR.getKey()); + errorLogs.put("error.object", throwable); + errorLogs.put("error.kind", throwable.getClass().getName()); + String message = throwable.getCause() != null ? throwable.getCause().getMessage() : throwable.getMessage(); + if (message != null) { + errorLogs.put("message", message); + } + StringWriter sw = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sw)); + errorLogs.put("stack", sw.toString()); + return errorLogs; + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java new file mode 100644 index 0000000..f068d71 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java @@ -0,0 +1,6 @@ +/** + * 使用 SkyWalking 组件,作为链路追踪、日志中心。 + * + * @author 芋道源码 + */ +package com.win.framework.tracer; diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..c312986 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.tracer.config.WinTracerAutoConfiguration +com.win.framework.tracer.config.WinMetricsAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md b/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md new file mode 100644 index 0000000..47f328b --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md b/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md new file mode 100644 index 0000000..b36e7a0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md b/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md new file mode 100644 index 0000000..83ce738 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mq/pom.xml b/win-framework/win-spring-boot-starter-mq/pom.xml new file mode 100644 index 0000000..6c10297 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/pom.xml @@ -0,0 +1,43 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-mq + jar + + ${project.artifactId} + 消息队列,支持 Redis、RocketMQ、RabbitMQ、Kafka 四种 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + com.win + win-spring-boot-starter-redis + + + + + org.springframework.kafka + spring-kafka + true + + + org.springframework.amqp + spring-rabbit + true + + + org.apache.rocketmq + rocketmq-spring-boot-starter + true + + + + \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java new file mode 100644 index 0000000..a2f747a --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java @@ -0,0 +1,4 @@ +/** + * 消息队列,支持 Redis、RocketMQ、RabbitMQ、Kafka 四种 + */ +package com.win.framework.mq; diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/config/WinRabbitMQAutoConfiguration.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/config/WinRabbitMQAutoConfiguration.java new file mode 100644 index 0000000..82dbd04 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/config/WinRabbitMQAutoConfiguration.java @@ -0,0 +1,28 @@ +package com.win.framework.mq.rabbitmq.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; + +/** + * RabbitMQ 消息队列配置类 + * + * @author 芋道源码 + */ +@AutoConfiguration +@Slf4j +@ConditionalOnClass(name = "org.springframework.amqp.rabbit.core.RabbitTemplate") +public class WinRabbitMQAutoConfiguration { + + /** + * Jackson2JsonMessageConverter Bean:使用 jackson 序列化消息 + */ + @Bean + public MessageConverter createMessageConverter() { + return new Jackson2JsonMessageConverter(); + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/core/package-info.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/core/package-info.java new file mode 100644 index 0000000..8afad41 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位符,无特殊逻辑 + */ +package com.win.framework.mq.rabbitmq.core; \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/package-info.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/package-info.java new file mode 100644 index 0000000..71b9105 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/rabbitmq/package-info.java @@ -0,0 +1,4 @@ +/** + * 消息队列,基于 RabbitMQ 提供 + */ +package com.win.framework.mq.rabbitmq; diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQConsumerAutoConfiguration.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQConsumerAutoConfiguration.java new file mode 100644 index 0000000..5aae1e3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQConsumerAutoConfiguration.java @@ -0,0 +1,151 @@ +package com.win.framework.mq.redis.config; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.system.SystemUtil; +import com.win.framework.common.enums.DocumentEnum; +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.mq.redis.core.job.RedisPendingMessageResendJob; +import com.win.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener; +import com.win.framework.mq.redis.core.stream.AbstractRedisStreamMessageListener; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.connection.stream.Consumer; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.StreamOffset; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.stream.StreamMessageListenerContainer; +import org.springframework.scheduling.annotation.EnableScheduling; + +import java.util.List; +import java.util.Properties; + +/** + * Redis 消息队列 Consumer 配置类 + * + * @author 芋道源码 + */ +@Slf4j +@EnableScheduling // 启用定时任务,用于 RedisPendingMessageResendJob 重发消息 +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinRedisMQConsumerAutoConfiguration { + + /** + * 创建 Redis Pub/Sub 广播消费的容器 + */ + @Bean + @ConditionalOnBean(AbstractRedisChannelMessageListener.class) // 只有 AbstractChannelMessageListener 存在的时候,才需要注册 Redis pubsub 监听 + public RedisMessageListenerContainer redisMessageListenerContainer( + RedisMQTemplate redisMQTemplate, List> listeners) { + // 创建 RedisMessageListenerContainer 对象 + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + // 设置 RedisConnection 工厂。 + container.setConnectionFactory(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory()); + // 添加监听器 + listeners.forEach(listener -> { + listener.setRedisMQTemplate(redisMQTemplate); + container.addMessageListener(listener, new ChannelTopic(listener.getChannel())); + log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]", + listener.getChannel(), listener.getClass().getName()); + }); + return container; + } + + /** + * 创建 Redis Stream 重新消费的任务 + */ + @Bean + @ConditionalOnBean(AbstractRedisStreamMessageListener.class) // 只有 AbstractStreamMessageListener 存在的时候,才需要注册 Redis pubsub 监听 + public RedisPendingMessageResendJob redisPendingMessageResendJob(List> listeners, + RedisMQTemplate redisTemplate, + @Value("${spring.application.name}") String groupName, + RedissonClient redissonClient) { + return new RedisPendingMessageResendJob(listeners, redisTemplate, groupName, redissonClient); + } + + /** + * 创建 Redis Stream 集群消费的容器 + * + * 基础知识:Redis Stream 的 xreadgroup 命令 + */ + @Bean(initMethod = "start", destroyMethod = "stop") + @ConditionalOnBean(AbstractRedisStreamMessageListener.class) // 只有 AbstractStreamMessageListener 存在的时候,才需要注册 Redis pubsub 监听 + public StreamMessageListenerContainer> redisStreamMessageListenerContainer( + RedisMQTemplate redisMQTemplate, List> listeners) { + RedisTemplate redisTemplate = redisMQTemplate.getRedisTemplate(); + checkRedisVersion(redisTemplate); + // 第一步,创建 StreamMessageListenerContainer 容器 + // 创建 options 配置 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions> containerOptions = + StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder() + .batchSize(10) // 一次性最多拉取多少条消息 + .targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化 + .build(); + // 创建 container 对象 + StreamMessageListenerContainer> container = + StreamMessageListenerContainer.create(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory(), containerOptions); + + // 第二步,注册监听器,消费对应的 Stream 主题 + String consumerName = buildConsumerName(); + listeners.parallelStream().forEach(listener -> { + log.info("[redisStreamMessageListenerContainer][开始注册 StreamKey({}) 对应的监听器({})]", + listener.getStreamKey(), listener.getClass().getName()); + // 创建 listener 对应的消费者分组 + try { + redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup()); + } catch (Exception ignore) { + } + // 设置 listener 对应的 redisTemplate + listener.setRedisMQTemplate(redisMQTemplate); + // 创建 Consumer 对象 + Consumer consumer = Consumer.from(listener.getGroup(), consumerName); + // 设置 Consumer 消费进度,以最小消费进度为准 + StreamOffset streamOffset = StreamOffset.create(listener.getStreamKey(), ReadOffset.lastConsumed()); + // 设置 Consumer 监听 + StreamMessageListenerContainer.StreamReadRequestBuilder builder = StreamMessageListenerContainer.StreamReadRequest + .builder(streamOffset).consumer(consumer) + .autoAcknowledge(false) // 不自动 ack + .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false + container.register(builder.build(), listener); + log.info("[redisStreamMessageListenerContainer][完成注册 StreamKey({}) 对应的监听器({})]", + listener.getStreamKey(), listener.getClass().getName()); + }); + return container; + } + + /** + * 构建消费者名字,使用本地 IP + 进程编号的方式。 + * 参考自 RocketMQ clientId 的实现 + * + * @return 消费者名字 + */ + private static String buildConsumerName() { + return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID()); + } + + /** + * 校验 Redis 版本号,是否满足最低的版本号要求! + */ + private static void checkRedisVersion(RedisTemplate redisTemplate) { + // 获得 Redis 版本 + Properties info = redisTemplate.execute((RedisCallback) RedisServerCommands::info); + String version = MapUtil.getStr(info, "redis_version"); + // 校验最低版本必须大于等于 5.0.0 + int majorVersion = Integer.parseInt(StrUtil.subBefore(version, '.', false)); + if (majorVersion < 5) { + throw new IllegalStateException(StrUtil.format("您当前的 Redis 版本为 {},小于最低要求的 5.0.0 版本!" + + "请参考 {} 文档进行安装。", version, DocumentEnum.REDIS_INSTALL.getUrl())); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQProducerAutoConfiguration.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQProducerAutoConfiguration.java new file mode 100644 index 0000000..9b29cc5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/config/WinRedisMQProducerAutoConfiguration.java @@ -0,0 +1,31 @@ +package com.win.framework.mq.redis.config; + +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.mq.redis.core.interceptor.RedisMessageInterceptor; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.List; + +/** + * Redis 消息队列 Producer 配置类 + * + * @author 芋道源码 + */ +@Slf4j +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinRedisMQProducerAutoConfiguration { + + @Bean + public RedisMQTemplate redisMQTemplate(StringRedisTemplate redisTemplate, + List interceptors) { + RedisMQTemplate redisMQTemplate = new RedisMQTemplate(redisTemplate); + // 添加拦截器 + interceptors.forEach(redisMQTemplate::addInterceptor); + return redisMQTemplate; + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/RedisMQTemplate.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/RedisMQTemplate.java new file mode 100644 index 0000000..dd4aa3a --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/RedisMQTemplate.java @@ -0,0 +1,87 @@ +package com.win.framework.mq.redis.core; + +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mq.redis.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; +import com.win.framework.mq.redis.core.pubsub.AbstractRedisChannelMessage; +import com.win.framework.mq.redis.core.stream.AbstractRedisStreamMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.data.redis.connection.stream.RecordId; +import org.springframework.data.redis.connection.stream.StreamRecords; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.ArrayList; +import java.util.List; + +/** + * Redis MQ 操作模板类 + * + * @author 芋道源码 + */ +@AllArgsConstructor +public class RedisMQTemplate { + + @Getter + private final RedisTemplate redisTemplate; + /** + * 拦截器数组 + */ + @Getter + private final List interceptors = new ArrayList<>(); + + /** + * 发送 Redis 消息,基于 Redis pub/sub 实现 + * + * @param message 消息 + */ + public void send(T message) { + try { + sendMessageBefore(message); + // 发送消息 + redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message)); + } finally { + sendMessageAfter(message); + } + } + + /** + * 发送 Redis 消息,基于 Redis Stream 实现 + * + * @param message 消息 + * @return 消息记录的编号对象 + */ + public RecordId send(T message) { + try { + sendMessageBefore(message); + // 发送消息 + return redisTemplate.opsForStream().add(StreamRecords.newRecord() + .ofObject(JsonUtils.toJsonString(message)) // 设置内容 + .withStreamKey(message.getStreamKey())); // 设置 stream key + } finally { + sendMessageAfter(message); + } + } + + /** + * 添加拦截器 + * + * @param interceptor 拦截器 + */ + public void addInterceptor(RedisMessageInterceptor interceptor) { + interceptors.add(interceptor); + } + + private void sendMessageBefore(AbstractRedisMessage message) { + // 正序 + interceptors.forEach(interceptor -> interceptor.sendMessageBefore(message)); + } + + private void sendMessageAfter(AbstractRedisMessage message) { + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).sendMessageAfter(message); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/interceptor/RedisMessageInterceptor.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/interceptor/RedisMessageInterceptor.java new file mode 100644 index 0000000..8efb9f2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/interceptor/RedisMessageInterceptor.java @@ -0,0 +1,26 @@ +package com.win.framework.mq.redis.core.interceptor; + +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; + +/** + * {@link AbstractRedisMessage} 消息拦截器 + * 通过拦截器,作为插件机制,实现拓展。 + * 例如说,多租户场景下的 MQ 消息处理 + * + * @author 芋道源码 + */ +public interface RedisMessageInterceptor { + + default void sendMessageBefore(AbstractRedisMessage message) { + } + + default void sendMessageAfter(AbstractRedisMessage message) { + } + + default void consumeMessageBefore(AbstractRedisMessage message) { + } + + default void consumeMessageAfter(AbstractRedisMessage message) { + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/job/RedisPendingMessageResendJob.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/job/RedisPendingMessageResendJob.java new file mode 100644 index 0000000..1c48c60 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/job/RedisPendingMessageResendJob.java @@ -0,0 +1,100 @@ +package com.win.framework.mq.redis.core.job; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.mq.redis.core.stream.AbstractRedisStreamMessageListener; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.data.domain.Range; +import org.springframework.data.redis.connection.stream.*; +import org.springframework.data.redis.core.StreamOperations; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 这个任务用于处理,crash 之后的消费者未消费完的消息 + */ +@Slf4j +@AllArgsConstructor +public class RedisPendingMessageResendJob { + + private static final String LOCK_KEY = "redis:pending:msg:lock"; + + /** + * 消息超时时间,默认 5 分钟 + * + * 1. 超时的消息才会被重新投递 + * 2. 由于定时任务 1 分钟一次,消息超时后不会被立即重投,极端情况下消息5分钟过期后,再等 1 分钟才会被扫瞄到 + */ + private static final int EXPIRE_TIME = 5 * 60; + + private final List> listeners; + private final RedisMQTemplate redisTemplate; + private final String groupName; + private final RedissonClient redissonClient; + + /** + * 一分钟执行一次,这里选择每分钟的35秒执行,是为了避免整点任务过多的问题 + */ + @Scheduled(cron = "35 * * * * ?") + public void messageResend() { + RLock lock = redissonClient.getLock(LOCK_KEY); + // 尝试加锁 + if (lock.tryLock()) { + try { + execute(); + } catch (Exception ex) { + log.error("[messageResend][执行异常]", ex); + } finally { + lock.unlock(); + } + } + } + + /** + * 执行清理逻辑 + * + * @see 讨论 + */ + private void execute() { + StreamOperations ops = redisTemplate.getRedisTemplate().opsForStream(); + listeners.forEach(listener -> { + PendingMessagesSummary pendingMessagesSummary = Objects.requireNonNull(ops.pending(listener.getStreamKey(), groupName)); + // 每个消费者的 pending 队列消息数量 + Map pendingMessagesPerConsumer = pendingMessagesSummary.getPendingMessagesPerConsumer(); + pendingMessagesPerConsumer.forEach((consumerName, pendingMessageCount) -> { + log.info("[processPendingMessage][消费者({}) 消息数量({})]", consumerName, pendingMessageCount); + // 每个消费者的 pending消息的详情信息 + PendingMessages pendingMessages = ops.pending(listener.getStreamKey(), Consumer.from(groupName, consumerName), Range.unbounded(), pendingMessageCount); + if (pendingMessages.isEmpty()) { + return; + } + pendingMessages.forEach(pendingMessage -> { + // 获取消息上一次传递到 consumer 的时间, + long lastDelivery = pendingMessage.getElapsedTimeSinceLastDelivery().getSeconds(); + if (lastDelivery < EXPIRE_TIME){ + return; + } + // 获取指定 id 的消息体 + List> records = ops.range(listener.getStreamKey(), + Range.of(Range.Bound.inclusive(pendingMessage.getIdAsString()), Range.Bound.inclusive(pendingMessage.getIdAsString()))); + if (CollUtil.isEmpty(records)) { + return; + } + // 重新投递消息 + redisTemplate.getRedisTemplate().opsForStream().add(StreamRecords.newRecord() + .ofObject(records.get(0).getValue()) // 设置内容 + .withStreamKey(listener.getStreamKey())); + // ack 消息消费完成 + redisTemplate.getRedisTemplate().opsForStream().acknowledge(groupName, records.get(0)); + log.info("[processPendingMessage][消息({})重新投递成功]", records.get(0).getId()); + }); + }); + }); + } +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/message/AbstractRedisMessage.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/message/AbstractRedisMessage.java new file mode 100644 index 0000000..3ad12ef --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/message/AbstractRedisMessage.java @@ -0,0 +1,29 @@ +package com.win.framework.mq.redis.core.message; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * Redis 消息抽象基类 + * + * @author 芋道源码 + */ +@Data +public abstract class AbstractRedisMessage { + + /** + * 头 + */ + private Map headers = new HashMap<>(); + + public String getHeader(String key) { + return headers.get(key); + } + + public void addHeader(String key, String value) { + headers.put(key, value); + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessage.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessage.java new file mode 100644 index 0000000..742ac7e --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessage.java @@ -0,0 +1,23 @@ +package com.win.framework.mq.redis.core.pubsub; + +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Redis Channel Message 抽象类 + * + * @author 芋道源码 + */ +public abstract class AbstractRedisChannelMessage extends AbstractRedisMessage { + + /** + * 获得 Redis Channel,默认使用类名 + * + * @return Channel + */ + @JsonIgnore // 避免序列化。原因是,Redis 发布 Channel 消息的时候,已经会指定。 + public String getChannel() { + return getClass().getSimpleName(); + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessageListener.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessageListener.java new file mode 100644 index 0000000..17ccd5c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/pubsub/AbstractRedisChannelMessageListener.java @@ -0,0 +1,103 @@ +package com.win.framework.mq.redis.core.pubsub; + +import cn.hutool.core.util.TypeUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.mq.redis.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Redis Pub/Sub 监听器抽象类,用于实现广播消费 + * + * @param 消息类型。一定要填写噢,不然会报错 + * + * @author 芋道源码 + */ +public abstract class AbstractRedisChannelMessageListener implements MessageListener { + + /** + * 消息类型 + */ + private final Class messageType; + /** + * Redis Channel + */ + private final String channel; + /** + * RedisMQTemplate + */ + @Setter + private RedisMQTemplate redisMQTemplate; + + @SneakyThrows + protected AbstractRedisChannelMessageListener() { + this.messageType = getMessageClass(); + this.channel = messageType.getDeclaredConstructor().newInstance().getChannel(); + } + + /** + * 获得 Sub 订阅的 Redis Channel 通道 + * + * @return channel + */ + public final String getChannel() { + return channel; + } + + @Override + public final void onMessage(Message message, byte[] bytes) { + T messageObj = JsonUtils.parseObject(message.getBody(), messageType); + try { + consumeMessageBefore(messageObj); + // 消费消息 + this.onMessage(messageObj); + } finally { + consumeMessageAfter(messageObj); + } + } + + /** + * 处理消息 + * + * @param message 消息 + */ + public abstract void onMessage(T message); + + /** + * 通过解析类上的泛型,获得消息类型 + * + * @return 消息类型 + */ + @SuppressWarnings("unchecked") + private Class getMessageClass() { + Type type = TypeUtil.getTypeArgument(getClass(), 0); + if (type == null) { + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName())); + } + return (Class) type; + } + + private void consumeMessageBefore(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 正序 + interceptors.forEach(interceptor -> interceptor.consumeMessageBefore(message)); + } + + private void consumeMessageAfter(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).consumeMessageAfter(message); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessage.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessage.java new file mode 100644 index 0000000..c4e7773 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessage.java @@ -0,0 +1,23 @@ +package com.win.framework.mq.redis.core.stream; + +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Redis Stream Message 抽象类 + * + * @author 芋道源码 + */ +public abstract class AbstractRedisStreamMessage extends AbstractRedisMessage { + + /** + * 获得 Redis Stream Key,默认使用类名 + * + * @return Channel + */ + @JsonIgnore // 避免序列化 + public String getStreamKey() { + return getClass().getSimpleName(); + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java new file mode 100644 index 0000000..8330fc3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java @@ -0,0 +1,113 @@ +package com.win.framework.mq.redis.core.stream; + +import cn.hutool.core.util.TypeUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.mq.redis.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.redis.core.message.AbstractRedisMessage; +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.stream.StreamListener; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Redis Stream 监听器抽象类,用于实现集群消费 + * + * @param 消息类型。一定要填写噢,不然会报错 + * + * @author 芋道源码 + */ +public abstract class AbstractRedisStreamMessageListener + implements StreamListener> { + + /** + * 消息类型 + */ + private final Class messageType; + /** + * Redis Channel + */ + @Getter + private final String streamKey; + + /** + * Redis 消费者分组,默认使用 spring.application.name 名字 + */ + @Value("${spring.application.name}") + @Getter + private String group; + /** + * RedisMQTemplate + */ + @Setter + private RedisMQTemplate redisMQTemplate; + + @SneakyThrows + protected AbstractRedisStreamMessageListener() { + this.messageType = getMessageClass(); + this.streamKey = messageType.getDeclaredConstructor().newInstance().getStreamKey(); + } + + @Override + public void onMessage(ObjectRecord message) { + // 消费消息 + T messageObj = JsonUtils.parseObject(message.getValue(), messageType); + try { + consumeMessageBefore(messageObj); + // 消费消息 + this.onMessage(messageObj); + // ack 消息消费完成 + redisMQTemplate.getRedisTemplate().opsForStream().acknowledge(group, message); + // TODO 芋艿:需要额外考虑以下几个点: + // 1. 处理异常的情况 + // 2. 发送日志;以及事务的结合 + // 3. 消费日志;以及通用的幂等性 + // 4. 消费失败的重试,https://zhuanlan.zhihu.com/p/60501638 + } finally { + consumeMessageAfter(messageObj); + } + } + + /** + * 处理消息 + * + * @param message 消息 + */ + public abstract void onMessage(T message); + + /** + * 通过解析类上的泛型,获得消息类型 + * + * @return 消息类型 + */ + @SuppressWarnings("unchecked") + private Class getMessageClass() { + Type type = TypeUtil.getTypeArgument(getClass(), 0); + if (type == null) { + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName())); + } + return (Class) type; + } + + private void consumeMessageBefore(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 正序 + interceptors.forEach(interceptor -> interceptor.consumeMessageBefore(message)); + } + + private void consumeMessageAfter(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).consumeMessageAfter(message); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/package-info.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/package-info.java new file mode 100644 index 0000000..3fef649 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/redis/package-info.java @@ -0,0 +1,6 @@ +/** + * 消息队列,基于 Redis 提供: + * 1. 基于 Pub/Sub 实现广播消费 + * 2. 基于 Stream 实现集群消费 + */ +package com.win.framework.mq.redis; diff --git a/win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..8a3ab9e --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.win.framework.mq.redis.config.WinRedisMQProducerAutoConfiguration +com.win.framework.mq.redis.config.WinRedisMQConsumerAutoConfiguration +com.win.framework.mq.rabbitmq.config.WinRabbitMQAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 事件机制 Event 入门》.md b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 事件机制 Event 入门》.md new file mode 100644 index 0000000..cd15a56 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 事件机制 Event 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 Kafka 入门》.md b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 Kafka 入门》.md new file mode 100644 index 0000000..df3ba15 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 Kafka 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md new file mode 100644 index 0000000..09c7e76 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RocketMQ 入门》.md b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RocketMQ 入门》.md new file mode 100644 index 0000000..cd15a56 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/《芋道 Spring Boot 消息队列 RocketMQ 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mybatis/pom.xml b/win-framework/win-spring-boot-starter-mybatis/pom.xml new file mode 100644 index 0000000..1f48b5e --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/pom.xml @@ -0,0 +1,101 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-mybatis + jar + + ${project.artifactId} + 数据库连接池、多数据源、事务、MyBatis 拓展 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-web + provided + + + + + com.mysql + mysql-connector-j + + + com.oracle.database.jdbc + ojdbc8 + true + + + org.postgresql + postgresql + true + + + com.microsoft.sqlserver + mssql-jdbc + true + + + com.dameng + DmJdbcDriver18 + true + + + cn.com.kingbase + kingbase8 + true + + + org.opengauss + opengauss-jdbc + true + + + + com.alibaba + druid-spring-boot-3-starter + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + com.baomidou + dynamic-datasource-spring-boot3-starter + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + com.github.yulichang + mybatis-plus-join-boot-starter + + + + com.fhs-opensource + easy-trans-spring-boot-starter + + + com.fhs-opensource + easy-trans-mybatis-plus-extend + + + + diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java new file mode 100644 index 0000000..a4d99ff --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java @@ -0,0 +1,40 @@ +package com.win.framework.datasource.config; + +import com.win.framework.datasource.core.filter.DruidAdRemoveFilter; +import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * 数据库配置类 + * + * @author 芋道源码 + */ +@AutoConfiguration +@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理 +@EnableConfigurationProperties(DruidStatProperties.class) +public class WinDataSourceAutoConfiguration { + + /** + * 创建 DruidAdRemoveFilter 过滤器,过滤 common.js 的广告 + */ + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true") + public FilterRegistrationBean druidAdRemoveFilterFilter(DruidStatProperties properties) { + // 获取 druid web 监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取 common.js 的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + // 创建 DruidAdRemoveFilter Bean + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new DruidAdRemoveFilter()); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java new file mode 100644 index 0000000..eb1aa75 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java @@ -0,0 +1,22 @@ +package com.win.framework.datasource.core.enums; + +/** + * 对应于多数据源中不同数据源配置 + * + * 通过在方法上,使用 {@link com.baomidou.dynamic.datasource.annotation.DS} 注解,设置使用的数据源。 + * 注意,默认是 {@link #MASTER} 数据源 + * + * 对应官方文档为 http://dynamic-datasource.com/guide/customize/Annotation.html + */ +public interface DataSourceEnum { + + /** + * 主库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Master} 注解 + */ + String MASTER = "master"; + /** + * 从库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Slave} 注解 + */ + String SLAVE = "slave"; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java new file mode 100644 index 0000000..d49f008 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java @@ -0,0 +1,38 @@ +package com.win.framework.datasource.core.filter; + +import com.alibaba.druid.util.Utils; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Druid 底部广告过滤器 + * + * @author 芋道源码 + */ +public class DruidAdRemoveFilter extends OncePerRequestFilter { + + /** + * common.js 的路径 + */ + private static final String COMMON_JS_ILE_PATH = "support/http/resources/js/common.js"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取 common.js + String text = Utils.readFromResource(COMMON_JS_ILE_PATH); + // 正则替换 banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/package-info.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/package-info.java new file mode 100644 index 0000000..400098e --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/package-info.java @@ -0,0 +1,5 @@ +/** + * 数据库连接池,采用 Druid + * 多数据源,采用爆米花 + */ +package com.win.framework.datasource; diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java new file mode 100644 index 0000000..fbf1393 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java @@ -0,0 +1,108 @@ +package com.win.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.collection.SetUtils; +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.annotation.IdType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.Set; + +/** + * 当 IdType 为 {@link IdType#NONE} 时,根据 PRIMARY 数据源所使用的数据库,自动设置 + * + * @author 芋道源码 + */ +@Slf4j +public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor { + + private static final String ID_TYPE_KEY = "mybatis-plus.global-config.db-config.id-type"; + + private static final String DATASOURCE_DYNAMIC_KEY = "spring.datasource.dynamic"; + + private static final String QUARTZ_JOB_STORE_DRIVER_KEY = "spring.quartz.properties.org.quartz.jobStore.driverDelegateClass"; + + private static final Set INPUT_ID_TYPES = SetUtils.asSet(DbType.ORACLE, DbType.ORACLE_12C, + DbType.POSTGRE_SQL, DbType.KINGBASE_ES, DbType.DB2, DbType.H2); + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + // 如果获取不到 DbType,则不进行处理 + DbType dbType = getDbType(environment); + if (dbType == null) { + return; + } + + // 设置 Quartz JobStore 对应的 Driver + // TODO 芋艿:暂时没有找到特别合适的地方,先放在这里 + setJobStoreDriverIfPresent(environment, dbType); + + // 如果非 NONE,则不进行处理 + IdType idType = getIdType(environment); + if (idType != IdType.NONE) { + return; + } + // 情况一,用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 + if (INPUT_ID_TYPES.contains(dbType)) { + setIdType(environment, IdType.INPUT); + return; + } + // 情况二,自增 ID,适合 MySQL、DM 达梦等直接自增的数据库 + setIdType(environment, IdType.AUTO); + } + + public IdType getIdType(ConfigurableEnvironment environment) { + return environment.getProperty(ID_TYPE_KEY, IdType.class); + } + + public void setIdType(ConfigurableEnvironment environment, IdType idType) { + environment.getSystemProperties().put(ID_TYPE_KEY, idType); + log.info("[setIdType][修改 MyBatis Plus 的 idType 为({})]", idType); + } + + public void setJobStoreDriverIfPresent(ConfigurableEnvironment environment, DbType dbType) { + String driverClass = environment.getProperty(QUARTZ_JOB_STORE_DRIVER_KEY); + if (StrUtil.isNotEmpty(driverClass)) { + return; + } + // 根据 dbType 类型,获取对应的 driverClass + switch (dbType) { + case POSTGRE_SQL: + driverClass = "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"; + break; + case ORACLE: + case ORACLE_12C: + driverClass = "org.quartz.impl.jdbcjobstore.oracle.OracleDelegate"; + break; + case SQL_SERVER: + case SQL_SERVER2005: + driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate"; + break; + case DM: + case KINGBASE_ES: + driverClass = "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"; + break; + } + // 设置 driverClass 变量 + if (StrUtil.isNotEmpty(driverClass)) { + environment.getSystemProperties().put(QUARTZ_JOB_STORE_DRIVER_KEY, driverClass); + } + } + + public static DbType getDbType(ConfigurableEnvironment environment) { + String primary = environment.getProperty(DATASOURCE_DYNAMIC_KEY + "." + "primary"); + if (StrUtil.isEmpty(primary)) { + return null; + } + String url = environment.getProperty(DATASOURCE_DYNAMIC_KEY + ".datasource." + primary + ".url"); + if (StrUtil.isEmpty(url)) { + return null; + } + return JdbcUtils.getDbType(url); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java new file mode 100644 index 0000000..cd2cd76 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java @@ -0,0 +1,76 @@ +package com.win.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.mybatis.core.handler.DefaultDBFieldHandler; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; +import com.baomidou.mybatisplus.extension.incrementer.*; +import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; +import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.concurrent.TimeUnit; + +/** + * MyBaits 配置类 + * + * @author 芋道源码 + */ +@AutoConfiguration(before = MybatisPlusAutoConfiguration.class) // 目的:先于 MyBatis Plus 自动配置,避免 @MapperScan 可能扫描不到 Mapper 打印 warn 日志 +@MapperScan(value = "${win.info.base-package}", annotationClass = Mapper.class, + lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 +public class WinMybatisAutoConfiguration { + + static { + // 动态 SQL 智能优化支持本地缓存加速解析,更完善的租户复杂 XML 动态 SQL 支持,静态注入缓存 + JsqlParserGlobal.setJsqlParseCache(new JdkSerialCaffeineJsqlParseCache( + (cache) -> cache.maximumSize(1024) + .expireAfterWrite(5, TimeUnit.SECONDS)) + ); + } + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件 + return mybatisPlusInterceptor; + } + + @Bean + public MetaObjectHandler defaultMetaObjectHandler() { + return new DefaultDBFieldHandler(); // 自动填充参数类 + } + + @Bean + @ConditionalOnProperty(prefix = "mybatis-plus.global-config.db-config", name = "id-type", havingValue = "INPUT") + public IKeyGenerator keyGenerator(ConfigurableEnvironment environment) { + DbType dbType = IdTypeEnvironmentPostProcessor.getDbType(environment); + if (dbType != null) { + switch (dbType) { + case POSTGRE_SQL: + return new PostgreKeyGenerator(); + case ORACLE: + case ORACLE_12C: + return new OracleKeyGenerator(); + case H2: + return new H2KeyGenerator(); + case KINGBASE_ES: + return new KingbaseKeyGenerator(); + case DM: + return new DmKeyGenerator(); + } + } + // 找不到合适的 IKeyGenerator 实现类 + throw new IllegalArgumentException(StrUtil.format("DbType{} 找不到合适的 IKeyGenerator 实现类", dbType)); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java new file mode 100644 index 0000000..fce6fc0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java @@ -0,0 +1,56 @@ +package com.win.framework.mybatis.core.dataobject; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fhs.core.trans.vo.TransPojo; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 基础实体对象 + * + * 为什么实现 {@link TransPojo} 接口? + * 因为使用 Easy-Trans TransType.SIMPLE 模式,集成 MyBatis Plus 查询 + * + * @author 芋道源码 + */ +@Data +@JsonIgnoreProperties(value = "transMap") // 由于 Easy-Trans 会添加 transMap 属性,避免 Jackson 在 Spring Cache 反序列化报错 +public abstract class BaseDO implements Serializable, TransPojo { + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + /** + * 最后更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + /** + * 创建者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR) + private String creator; + /** + * 更新者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR) + private String updater; + /** + * 是否删除 + */ + @TableLogic + private Boolean deleted; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/DbTypeEnum.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/DbTypeEnum.java new file mode 100644 index 0000000..5ad5b2f --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/DbTypeEnum.java @@ -0,0 +1,95 @@ +package com.win.framework.mybatis.core.enums; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.DbType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 针对 MyBatis Plus 的 {@link DbType} 增强,补充更多信息 + */ +@Getter +@AllArgsConstructor +public enum DbTypeEnum { + + /** + * H2 + * + * 注意:H2 不支持 find_in_set 函数 + */ + H2(DbType.H2, "H2", ""), + + /** + * MySQL + */ + MY_SQL(DbType.MYSQL, "MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0"), + + /** + * Oracle + */ + ORACLE(DbType.ORACLE, "Oracle", "FIND_IN_SET('#{value}', #{column}) <> 0"), + + /** + * PostgreSQL + * + * 华为 openGauss 使用 ProductName 与 PostgreSQL 相同 + */ + POSTGRE_SQL(DbType.POSTGRE_SQL,"PostgreSQL", "POSITION('#{value}' IN #{column}) <> 0"), + + /** + * SQL Server + */ + SQL_SERVER(DbType.SQL_SERVER, "Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"), + /** + * SQL Server 2005 + */ + SQL_SERVER2005(DbType.SQL_SERVER2005, "Microsoft SQL Server 2005", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"), + + /** + * 达梦 + */ + DM(DbType.DM, "DM DBMS", "FIND_IN_SET('#{value}', #{column}) <> 0"), + + /** + * 人大金仓 + */ + KINGBASE_ES(DbType.KINGBASE_ES, "KingbaseES", "POSITION('#{value}' IN #{column}) <> 0"), + ; + + public static final Map MAP_BY_NAME = Arrays.stream(values()) + .collect(Collectors.toMap(DbTypeEnum::getProductName, Function.identity())); + + public static final Map MAP_BY_MP = Arrays.stream(values()) + .collect(Collectors.toMap(DbTypeEnum::getMpDbType, Function.identity())); + + /** + * MyBatis Plus 类型 + */ + private final DbType mpDbType; + /** + * 数据库产品名 + */ + private final String productName; + /** + * SQL FIND_IN_SET 模板 + */ + private final String findInSetTemplate; + + public static DbType find(String databaseProductName) { + if (StrUtil.isBlank(databaseProductName)) { + return null; + } + return MAP_BY_NAME.get(databaseProductName).getMpDbType(); + } + + public static String getFindInSetTemplate(DbType dbType) { + return Optional.of(MAP_BY_MP.get(dbType).getFindInSetTemplate()) + .orElseThrow(() -> new IllegalArgumentException("FIND_IN_SET not supported")); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java new file mode 100644 index 0000000..d97801c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -0,0 +1,62 @@ +package com.win.framework.mybatis.core.handler; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * 通用参数填充实现类 + * + * 如果没有显式的对通用参数进行赋值,这里会对通用参数进行填充、赋值 + * + * @author hexiaowu + */ +public class DefaultDBFieldHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { + BaseDO baseDO = (BaseDO) metaObject.getOriginalObject(); + + LocalDateTime current = LocalDateTime.now(); + // 创建时间为空,则以当前时间为插入时间 + if (Objects.isNull(baseDO.getCreateTime())) { + baseDO.setCreateTime(current); + } + // 更新时间为空,则以当前时间为更新时间 + if (Objects.isNull(baseDO.getUpdateTime())) { + baseDO.setUpdateTime(current); + } + + Long userId = WebFrameworkUtils.getLoginUserId(); + // 当前登录用户不为空,创建人为空,则当前登录用户为创建人 + if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) { + baseDO.setCreator(userId.toString()); + } + // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 + if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) { + baseDO.setUpdater(userId.toString()); + } + } + } + + @Override + public void updateFill(MetaObject metaObject) { + // 更新时间为空,则以当前时间为更新时间 + Object modifyTime = getFieldValByName("updateTime", metaObject); + if (Objects.isNull(modifyTime)) { + setFieldValByName("updateTime", LocalDateTime.now(), metaObject); + } + + // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 + Object modifier = getFieldValByName("updater", metaObject); + Long userId = WebFrameworkUtils.getLoginUserId(); + if (Objects.nonNull(userId) && Objects.isNull(modifier)) { + setFieldValByName("updater", userId.toString(), metaObject); + } + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java new file mode 100644 index 0000000..2a56c5c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java @@ -0,0 +1,192 @@ +package com.win.framework.mybatis.core.mapper; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.SortablePageParam; +import com.win.framework.common.pojo.SortingField; +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.interfaces.MPJBaseJoin; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 + * + * 1. {@link BaseMapper} 为 MyBatis Plus 的基础接口,提供基础的 CRUD 能力 + * 2. {@link MPJBaseMapper} 为 MyBatis Plus Join 的基础接口,提供连表 Join 能力 + */ +public interface BaseMapperX extends MPJBaseMapper { + + default PageResult selectPage(SortablePageParam pageParam, @Param("ew") Wrapper queryWrapper) { + return selectPage(pageParam, pageParam.getSortingFields(), queryWrapper); + } + + default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { + return selectPage(pageParam, null, queryWrapper); + } + + default PageResult selectPage(PageParam pageParam, Collection sortingFields, @Param("ew") Wrapper queryWrapper) { + // 特殊:不分页,直接查询全部 + if (PageParam.PAGE_SIZE_NONE.equals(pageParam.getPageSize())) { + List list = selectList(queryWrapper); + return new PageResult<>(list, (long) list.size()); + } + + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageParam, sortingFields); + selectPage(mpPage, queryWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default PageResult selectJoinPage(PageParam pageParam, Class clazz, MPJLambdaWrapper lambdaWrapper) { + // 特殊:不分页,直接查询全部 + if (PageParam.PAGE_SIZE_NONE.equals(pageParam.getPageSize())) { + List list = selectJoinList(clazz, lambdaWrapper); + return new PageResult<>(list, (long) list.size()); + } + + // MyBatis Plus Join 查询 + IPage mpPage = MyBatisUtils.buildPage(pageParam); + mpPage = selectJoinPage(mpPage, clazz, lambdaWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default PageResult selectJoinPage(PageParam pageParam, Class resultTypeClass, MPJBaseJoin joinQueryWrapper) { + IPage mpPage = MyBatisUtils.buildPage(pageParam); + selectJoinPage(mpPage, resultTypeClass, joinQueryWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default T selectOne(String field, Object value) { + return selectOne(new QueryWrapper().eq(field, value)); + } + + default T selectOne(SFunction field, Object value) { + return selectOne(new LambdaQueryWrapper().eq(field, value)); + } + + default T selectOne(String field1, Object value1, String field2, Object value2) { + return selectOne(new QueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2, + SFunction field3, Object value3) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2) + .eq(field3, value3)); + } + + default Long selectCount() { + return selectCount(new QueryWrapper<>()); + } + + default Long selectCount(String field, Object value) { + return selectCount(new QueryWrapper().eq(field, value)); + } + + default Long selectCount(SFunction field, Object value) { + return selectCount(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList() { + return selectList(new QueryWrapper<>()); + } + + default List selectList(String field, Object value) { + return selectList(new QueryWrapper().eq(field, value)); + } + + default List selectList(SFunction field, Object value) { + return selectList(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList(String field, Collection values) { + if (CollUtil.isEmpty(values)) { + return CollUtil.newArrayList(); + } + return selectList(new QueryWrapper().in(field, values)); + } + + default List selectList(SFunction field, Collection values) { + if (CollUtil.isEmpty(values)) { + return CollUtil.newArrayList(); + } + return selectList(new LambdaQueryWrapper().in(field, values)); + } + + default List selectList(SFunction field1, Object value1, SFunction field2, Object value2) { + return selectList(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + /** + * 批量插入,适合大量数据插入 + * + * @param entities 实体们 + */ + default Boolean insertBatch(Collection entities) { + // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理 + DbType dbType = JdbcUtils.getDbType(); + if (JdbcUtils.isSQLServer(dbType)) { + entities.forEach(this::insert); + return CollUtil.isNotEmpty(entities); + } + return Db.saveBatch(entities); + } + + /** + * 批量插入,适合大量数据插入 + * + * @param entities 实体们 + * @param size 插入数量 Db.saveBatch 默认为 1000 + */ + default Boolean insertBatch(Collection entities, int size) { + // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理 + DbType dbType = JdbcUtils.getDbType(); + if (JdbcUtils.isSQLServer(dbType)) { + entities.forEach(this::insert); + return CollUtil.isNotEmpty(entities); + } + return Db.saveBatch(entities, size); + } + + default int updateBatch(T update) { + return update(update, new QueryWrapper<>()); + } + + default Boolean updateBatch(Collection entities) { + return Db.updateBatchById(entities); + } + + default Boolean updateBatch(Collection entities, int size) { + return Db.updateBatchById(entities, size); + } + + default int delete(String field, String value) { + return delete(new QueryWrapper().eq(field, value)); + } + + default int delete(SFunction field, Object value) { + return delete(new LambdaQueryWrapper().eq(field, value)); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java new file mode 100644 index 0000000..82d9eac --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java @@ -0,0 +1,135 @@ +package com.win.framework.mybatis.core.query; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.util.collection.ArrayUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + *

+ * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class LambdaQueryWrapperX extends LambdaQueryWrapper { + + public LambdaQueryWrapperX likeIfPresent(SFunction column, String val) { + if (StringUtils.hasText(val)) { + return (LambdaQueryWrapperX) super.like(column, val); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Object... values) { + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX eqIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (LambdaQueryWrapperX) super.eq(column, val); + } + return this; + } + + public LambdaQueryWrapperX neIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (LambdaQueryWrapperX) super.ne(column, val); + } + return this; + } + + public LambdaQueryWrapperX gtIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.gt(column, val); + } + return this; + } + + public LambdaQueryWrapperX geIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.ge(column, val); + } + return this; + } + + public LambdaQueryWrapperX ltIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.lt(column, val); + } + return this; + } + + public LambdaQueryWrapperX leIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.le(column, val); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (LambdaQueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (LambdaQueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (LambdaQueryWrapperX) le(column, val2); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object[] values) { + Object val1 = ArrayUtils.get(values, 0); + Object val2 = ArrayUtils.get(values, 1); + return betweenIfPresent(column, val1, val2); + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public LambdaQueryWrapperX eq(boolean condition, SFunction column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public LambdaQueryWrapperX eq(SFunction column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public LambdaQueryWrapperX orderByDesc(SFunction column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public LambdaQueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public LambdaQueryWrapperX in(SFunction column, Collection coll) { + super.in(column, coll); + return this; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/MPJLambdaWrapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/MPJLambdaWrapperX.java new file mode 100644 index 0000000..193775c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/MPJLambdaWrapperX.java @@ -0,0 +1,313 @@ +package com.win.framework.mybatis.core.query; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.util.collection.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.toolkit.MPJWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.springframework.util.StringUtils; + +import java.util.Collection; +import java.util.function.Consumer; + +/** + * 拓展 MyBatis Plus Join QueryWrapper 类,主要增加如下功能: + *

+ * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class MPJLambdaWrapperX extends MPJLambdaWrapper { + + public MPJLambdaWrapperX likeIfPresent(SFunction column, String val) { + MPJWrappers.lambdaJoin().like(column, val); + if (StringUtils.hasText(val)) { + return (MPJLambdaWrapperX) super.like(column, val); + } + return this; + } + + public MPJLambdaWrapperX inIfPresent(SFunction column, Collection values) { + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) { + return (MPJLambdaWrapperX) super.in(column, values); + } + return this; + } + + public MPJLambdaWrapperX inIfPresent(SFunction column, Object... values) { + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) { + return (MPJLambdaWrapperX) super.in(column, values); + } + return this; + } + + public MPJLambdaWrapperX eqIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (MPJLambdaWrapperX) super.eq(column, val); + } + return this; + } + + public MPJLambdaWrapperX neIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (MPJLambdaWrapperX) super.ne(column, val); + } + return this; + } + + public MPJLambdaWrapperX gtIfPresent(SFunction column, Object val) { + if (val != null) { + return (MPJLambdaWrapperX) super.gt(column, val); + } + return this; + } + + public MPJLambdaWrapperX geIfPresent(SFunction column, Object val) { + if (val != null) { + return (MPJLambdaWrapperX) super.ge(column, val); + } + return this; + } + + public MPJLambdaWrapperX ltIfPresent(SFunction column, Object val) { + if (val != null) { + return (MPJLambdaWrapperX) super.lt(column, val); + } + return this; + } + + public MPJLambdaWrapperX leIfPresent(SFunction column, Object val) { + if (val != null) { + return (MPJLambdaWrapperX) super.le(column, val); + } + return this; + } + + public MPJLambdaWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (MPJLambdaWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (MPJLambdaWrapperX) ge(column, val1); + } + if (val2 != null) { + return (MPJLambdaWrapperX) le(column, val2); + } + return this; + } + + public MPJLambdaWrapperX betweenIfPresent(SFunction column, Object[] values) { + Object val1 = ArrayUtils.get(values, 0); + Object val2 = ArrayUtils.get(values, 1); + return betweenIfPresent(column, val1, val2); + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public MPJLambdaWrapperX eq(boolean condition, SFunction column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public MPJLambdaWrapperX eq(SFunction column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public MPJLambdaWrapperX orderByDesc(SFunction column) { + //noinspection unchecked + super.orderByDesc(true, column); + return this; + } + + @Override + public MPJLambdaWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public MPJLambdaWrapperX in(SFunction column, Collection coll) { + super.in(column, coll); + return this; + } + + @Override + public MPJLambdaWrapperX selectAll(Class clazz) { + super.selectAll(clazz); + return this; + } + + @Override + public MPJLambdaWrapperX selectAll(Class clazz, String prefix) { + super.selectAll(clazz, prefix); + return this; + } + + @Override + public MPJLambdaWrapperX selectAs(SFunction column, String alias) { + super.selectAs(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectAs(String column, SFunction alias) { + super.selectAs(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectAs(SFunction column, SFunction alias) { + super.selectAs(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectAs(String index, SFunction column, SFunction alias) { + super.selectAs(index, column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectAsClass(Class source, Class tag) { + super.selectAsClass(source, tag); + return this; + } + + @Override + public MPJLambdaWrapperX selectSub(Class clazz, Consumer> consumer, SFunction alias) { + super.selectSub(clazz, consumer, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectSub(Class clazz, String st, Consumer> consumer, SFunction alias) { + super.selectSub(clazz, st, consumer, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectCount(SFunction column) { + super.selectCount(column); + return this; + } + + @Override + public MPJLambdaWrapperX selectCount(Object column, String alias) { + super.selectCount(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectCount(Object column, SFunction alias) { + super.selectCount(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectCount(SFunction column, String alias) { + super.selectCount(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectCount(SFunction column, SFunction alias) { + super.selectCount(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectSum(SFunction column) { + super.selectSum(column); + return this; + } + + @Override + public MPJLambdaWrapperX selectSum(SFunction column, String alias) { + super.selectSum(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectSum(SFunction column, SFunction alias) { + super.selectSum(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectMax(SFunction column) { + super.selectMax(column); + return this; + } + + @Override + public MPJLambdaWrapperX selectMax(SFunction column, String alias) { + super.selectMax(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectMax(SFunction column, SFunction alias) { + super.selectMax(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectMin(SFunction column) { + super.selectMin(column); + return this; + } + + @Override + public MPJLambdaWrapperX selectMin(SFunction column, String alias) { + super.selectMin(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectMin(SFunction column, SFunction alias) { + super.selectMin(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectAvg(SFunction column) { + super.selectAvg(column); + return this; + } + + @Override + public MPJLambdaWrapperX selectAvg(SFunction column, String alias) { + super.selectAvg(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectAvg(SFunction column, SFunction alias) { + super.selectAvg(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectLen(SFunction column) { + super.selectLen(column); + return this; + } + + @Override + public MPJLambdaWrapperX selectLen(SFunction column, String alias) { + super.selectLen(column, alias); + return this; + } + + @Override + public MPJLambdaWrapperX selectLen(SFunction column, SFunction alias) { + super.selectLen(column, alias); + return this; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java new file mode 100644 index 0000000..9736475 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java @@ -0,0 +1,166 @@ +package com.win.framework.mybatis.core.query; + +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + * + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class QueryWrapperX extends QueryWrapper { + + public QueryWrapperX likeIfPresent(String column, String val) { + if (StringUtils.hasText(val)) { + return (QueryWrapperX) super.like(column, val); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Collection values) { + if (!CollectionUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Object... values) { + if (!ArrayUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX eqIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.eq(column, val); + } + return this; + } + + public QueryWrapperX neIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ne(column, val); + } + return this; + } + + public QueryWrapperX gtIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.gt(column, val); + } + return this; + } + + public QueryWrapperX geIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ge(column, val); + } + return this; + } + + public QueryWrapperX ltIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.lt(column, val); + } + return this; + } + + public QueryWrapperX leIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.le(column, val); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (QueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (QueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (QueryWrapperX) le(column, val2); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object[] values) { + if (values!= null && values.length != 0 && values[0] != null && values[1] != null) { + return (QueryWrapperX) super.between(column, values[0], values[1]); + } + if (values!= null && values.length != 0 && values[0] != null) { + return (QueryWrapperX) ge(column, values[0]); + } + if (values!= null && values.length != 0 && values[1] != null) { + return (QueryWrapperX) le(column, values[1]); + } + return this; + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public QueryWrapperX eq(boolean condition, String column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public QueryWrapperX eq(String column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public QueryWrapperX orderByDesc(String column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public QueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public QueryWrapperX in(String column, Collection coll) { + super.in(column, coll); + return this; + } + + /** + * 设置只返回最后一条 + * + * TODO 芋艿:不是完美解,需要在思考下。如果使用多数据源,并且数据源是多种类型时,可能会存在问题:实现之返回一条的语法不同 + * + * @return this + */ + public QueryWrapperX limitN(int n) { + DbType dbType = JdbcUtils.getDbType(); + switch (dbType) { + case ORACLE: + case ORACLE_12C: + super.le("ROWNUM", n); + break; + case SQL_SERVER: + case SQL_SERVER2005: + super.select("TOP " + n + " *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段 + break; + default: // MySQL、PostgreSQL、DM 达梦、KingbaseES 大金都是采用 LIMIT 实现 + super.last("LIMIT " + n); + } + return this; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java new file mode 100644 index 0000000..520fadb --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java @@ -0,0 +1,75 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.lang.Assert; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.extra.spring.SpringUtil; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 字段字段的 TypeHandler 实现类,基于 {@link cn.hutool.crypto.symmetric.AES} 实现 + * 可通过 jasypt.encryptor.password 配置项,设置密钥 + * + * @author 芋道源码 + */ +public class EncryptTypeHandler extends BaseTypeHandler { + + private static final String ENCRYPTOR_PROPERTY_NAME = "mybatis-plus.encryptor.password"; + + private static AES aes; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, encrypt(parameter)); + } + + @Override + public String getNullableResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return decrypt(value); + } + + @Override + public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return decrypt(value); + } + + @Override + public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return decrypt(value); + } + + private static String decrypt(String value) { + if (value == null) { + return null; + } + return getEncryptor().decryptStr(value); + } + + public static String encrypt(String rawValue) { + if (rawValue == null) { + return null; + } + return getEncryptor().encryptBase64(rawValue); + } + + private static AES getEncryptor() { + if (aes != null) { + return aes; + } + // 构建 AES + String password = SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME); + Assert.notEmpty(password, "配置项({}) 不能为空", ENCRYPTOR_PROPERTY_NAME); + aes = SecureUtil.aes(password.getBytes()); + return aes; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java new file mode 100644 index 0000000..0032617 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java @@ -0,0 +1,56 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.string.StrUtils; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author jason + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class IntegerListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtils.splitToInteger(value, COMMA); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java new file mode 100644 index 0000000..79aae89 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java @@ -0,0 +1,57 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.string.StrUtils; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author 芋道源码 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class LongListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + // 设置占位符 + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtils.splitToLong(value, COMMA); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java new file mode 100644 index 0000000..fcc4958 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java @@ -0,0 +1,58 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author 永不言败 + * @since 2022 3/23 12:50:15 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class StringListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + // 设置占位符 + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtil.splitTrim(value, COMMA); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java new file mode 100644 index 0000000..db18c8f --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java @@ -0,0 +1,89 @@ +package com.win.framework.mybatis.core.util; + +import com.win.framework.common.util.object.ObjectUtils; +import com.win.framework.common.util.spring.SpringUtils; +import com.win.framework.mybatis.core.enums.DbTypeEnum; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +/** + * JDBC 工具类 + * + * @author 芋道源码 + */ +public class JdbcUtils { + + /** + * 判断连接是否正确 + * + * @param url 数据源连接 + * @param username 账号 + * @param password 密码 + * @return 是否正确 + */ + public static boolean isConnectionOK(String url, String username, String password) { + try (Connection ignored = DriverManager.getConnection(url, username, password)) { + return true; + } catch (Exception ex) { + return false; + } + } + + /** + * 获得 URL 对应的 DB 类型 + * + * @param url URL + * @return DB 类型 + */ + public static DbType getDbType(String url) { + return com.baomidou.mybatisplus.extension.toolkit.JdbcUtils.getDbType(url); + } + + /** + * 通过当前数据库连接获得对应的 DB 类型 + * + * @return DB 类型 + */ + public static DbType getDbType() { + DataSource dataSource; + try { + DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class); + dataSource = dynamicRoutingDataSource.determineDataSource(); + } catch (NoSuchBeanDefinitionException e) { + dataSource = SpringUtils.getBean(DataSource.class); + } + try (Connection conn = dataSource.getConnection()) { + return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName()); + } catch (SQLException e) { + throw new IllegalArgumentException(e.getMessage()); + } + } + + /** + * 判断 JDBC 连接是否为 SQLServer 数据库 + * + * @param url JDBC 连接 + * @return 是否为 SQLServer 数据库 + */ + public static boolean isSQLServer(String url) { + DbType dbType = getDbType(url); + return isSQLServer(dbType); + } + + /** + * 判断 JDBC 连接是否为 SQLServer 数据库 + * + * @param dbType DB 类型 + * @return 是否为 SQLServer 数据库 + */ + public static boolean isSQLServer(DbType dbType) { + return ObjectUtils.equalsAny(dbType, DbType.SQL_SERVER, DbType.SQL_SERVER2005); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java new file mode 100644 index 0000000..9478bc6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java @@ -0,0 +1,105 @@ +package com.win.framework.mybatis.core.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.SortingField; +import com.win.framework.mybatis.core.enums.DbTypeEnum; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * MyBatis 工具类 + */ +public class MyBatisUtils { + + private static final String MYSQL_ESCAPE_CHARACTER = "`"; + + public static Page buildPage(PageParam pageParam) { + return buildPage(pageParam, null); + } + + public static Page buildPage(PageParam pageParam, Collection sortingFields) { + // 页码 + 数量 + Page page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize()); + // 排序字段 + if (!CollectionUtil.isEmpty(sortingFields)) { + page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? + OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField())) + .collect(Collectors.toList())); + } + return page; + } + + /** + * 将拦截器添加到链中 + * 由于 MybatisPlusInterceptor 不支持添加拦截器,所以只能全量设置 + * + * @param interceptor 链 + * @param inner 拦截器 + * @param index 位置 + */ + public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) { + List inners = new ArrayList<>(interceptor.getInterceptors()); + inners.add(index, inner); + interceptor.setInterceptors(inners); + } + + /** + * 获得 Table 对应的表名 + *

+ * 兼容 MySQL 转义表名 `t_xxx` + * + * @param table 表 + * @return 去除转移字符后的表名 + */ + public static String getTableName(Table table) { + String tableName = table.getName(); + if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) { + tableName = tableName.substring(1, tableName.length() - 1); + } + return tableName; + } + + /** + * 构建 Column 对象 + * + * @param tableName 表名 + * @param tableAlias 别名 + * @param column 字段名 + * @return Column 对象 + */ + public static Column buildColumn(String tableName, Alias tableAlias, String column) { + if (tableAlias != null) { + tableName = tableAlias.getName(); + } + return new Column(tableName + StringPool.DOT + column); + } + + /** + * 跨数据库的 find_in_set 实现 + * + * @param column 字段名称 + * @param value 查询值(不带单引号) + * @return sql + */ + public static String findInSet(String column, Object value) { + DbType dbType = JdbcUtils.getDbType(); + return DbTypeEnum.getFindInSetTemplate(dbType) + .replace("#{column}", column) + .replace("#{value}", StrUtil.toString(value)); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/package-info.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/package-info.java new file mode 100644 index 0000000..bf3f1ec --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 MyBatis Plus 提升使用 MyBatis 的开发效率 + */ +package com.win.framework.mybatis; diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/config/WinTranslateAutoConfiguration.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/config/WinTranslateAutoConfiguration.java new file mode 100644 index 0000000..fe2498c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/config/WinTranslateAutoConfiguration.java @@ -0,0 +1,18 @@ +package com.win.framework.translate.config; + +import com.win.framework.translate.core.TranslateUtils; +import com.fhs.trans.service.impl.TransService; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +public class WinTranslateAutoConfiguration { + + @Bean + @SuppressWarnings({"InstantiationOfUtilityClass", "SpringJavaInjectionPointsAutowiringInspection"}) + public TranslateUtils translateUtils(TransService transService) { + TranslateUtils.init(transService); + return new TranslateUtils(); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/core/TranslateUtils.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/core/TranslateUtils.java new file mode 100644 index 0000000..d0eb30a --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/core/TranslateUtils.java @@ -0,0 +1,37 @@ +package com.win.framework.translate.core; + +import cn.hutool.core.collection.CollUtil; +import com.fhs.core.trans.vo.VO; +import com.fhs.trans.service.impl.TransService; + +import java.util.List; + +/** + * VO 数据翻译 Utils + * + * @author 芋道源码 + */ +public class TranslateUtils { + + private static TransService transService; + + public static void init(TransService transService) { + TranslateUtils.transService = transService; + } + + /** + * 数据翻译 + * + * 使用场景:无法使用 @TransMethodResult 注解的场景,只能通过手动触发翻译 + * + * @param data 数据 + * @return 翻译结果 + */ + public static List translate(List data) { + if (CollUtil.isNotEmpty((data))) { + transService.transBatch(data); + } + return data; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/package-info.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/package-info.java new file mode 100644 index 0000000..997ad12 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/translate/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Easy-Trans 提升使用 VO 数据翻译的开发效率 + */ +package com.win.framework.translate; diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..4c2b1ed --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ + com.win.framework.mybatis.config.IdTypeEnvironmentPostProcessor diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..78b9148 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.win.framework.datasource.config.WinDataSourceAutoConfiguration +com.win.framework.mybatis.config.WinMybatisAutoConfiguration +com.win.framework.translate.config.WinTranslateAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md b/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md new file mode 100644 index 0000000..7c6d724 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md b/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md new file mode 100644 index 0000000..ad52a19 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md b/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md new file mode 100644 index 0000000..fc9ef1c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-protection/pom.xml b/win-framework/win-spring-boot-starter-protection/pom.xml new file mode 100644 index 0000000..faf2d84 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/pom.xml @@ -0,0 +1,40 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-protection + jar + + ${project.artifactId} + 服务保证,提供分布式锁、幂等、限流、熔断、API 签名等等功能 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + com.win + win-spring-boot-starter-web + provided + + + + + com.win + win-spring-boot-starter-redis + + + + + com.baomidou + lock4j-redisson-spring-boot-starter + true + + + + diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java new file mode 100644 index 0000000..6694ea5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java @@ -0,0 +1,46 @@ +package com.win.framework.idempotent.config; + +import com.win.framework.idempotent.core.aop.IdempotentAspect; +import com.win.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver; +import com.win.framework.idempotent.core.redis.IdempotentRedisDAO; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.List; + +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinIdempotentConfiguration { + + @Bean + public IdempotentAspect idempotentAspect(List keyResolvers, IdempotentRedisDAO idempotentRedisDAO) { + return new IdempotentAspect(keyResolvers, idempotentRedisDAO); + } + + @Bean + public IdempotentRedisDAO idempotentRedisDAO(StringRedisTemplate stringRedisTemplate) { + return new IdempotentRedisDAO(stringRedisTemplate); + } + + // ========== 各种 IdempotentKeyResolver Bean ========== + + @Bean + public DefaultIdempotentKeyResolver defaultIdempotentKeyResolver() { + return new DefaultIdempotentKeyResolver(); + } + + @Bean + public UserIdempotentKeyResolver userIdempotentKeyResolver() { + return new UserIdempotentKeyResolver(); + } + + @Bean + public ExpressionIdempotentKeyResolver expressionIdempotentKeyResolver() { + return new ExpressionIdempotentKeyResolver(); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java new file mode 100644 index 0000000..46a4a1d --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java @@ -0,0 +1,63 @@ +package com.win.framework.idempotent.core.annotation; + +import com.win.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +/** + * 幂等注解 + * + * @author 芋道源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Idempotent { + + /** + * 幂等的超时时间,默认为 1 秒 + * + * 注意,如果执行时间超过它,请求还是会进来 + */ + int timeout() default 1; + /** + * 时间单位,默认为 SECONDS 秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * 提示信息,正在执行中的提示 + */ + String message() default "重复请求,请稍后重试"; + + /** + * 使用的 Key 解析器 + * + * @see DefaultIdempotentKeyResolver 全局级别 + * @see UserIdempotentKeyResolver 用户级别 + * @see ExpressionIdempotentKeyResolver 自定义表达式,通过 {@link #keyArg()} 计算 + */ + Class keyResolver() default DefaultIdempotentKeyResolver.class; + /** + * 使用的 Key 参数 + */ + String keyArg() default ""; + + /** + * 删除 Key,当发生异常时候 + * + * 问题:为什么发生异常时,需要删除 Key 呢? + * 回答:发生异常时,说明业务发生错误,此时需要删除 Key,避免下次请求无法正常执行。 + * + * 问题:为什么不搞 deleteWhenSuccess 执行成功时,需要删除 Key 呢? + * 回答:这种情况下,本质上是分布式锁,推荐使用 @Lock4j 注解 + */ + boolean deleteKeyWhenException() default true; + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java new file mode 100644 index 0000000..eb39221 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java @@ -0,0 +1,68 @@ +package com.win.framework.idempotent.core.aop; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.win.framework.idempotent.core.redis.IdempotentRedisDAO; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.util.Assert; + +import java.util.List; +import java.util.Map; + +/** + * 拦截声明了 {@link Idempotent} 注解的方法,实现幂等操作 + * + * @author 芋道源码 + */ +@Aspect +@Slf4j +public class IdempotentAspect { + + /** + * IdempotentKeyResolver 集合 + */ + private final Map, IdempotentKeyResolver> keyResolvers; + + private final IdempotentRedisDAO idempotentRedisDAO; + + public IdempotentAspect(List keyResolvers, IdempotentRedisDAO idempotentRedisDAO) { + this.keyResolvers = CollectionUtils.convertMap(keyResolvers, IdempotentKeyResolver::getClass); + this.idempotentRedisDAO = idempotentRedisDAO; + } + + @Around(value = "@annotation(idempotent)") + public Object aroundPointCut(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable { + // 获得 IdempotentKeyResolver + IdempotentKeyResolver keyResolver = keyResolvers.get(idempotent.keyResolver()); + Assert.notNull(keyResolver, "找不到对应的 IdempotentKeyResolver"); + // 解析 Key + String key = keyResolver.resolver(joinPoint, idempotent); + + // 1. 锁定 Key + boolean success = idempotentRedisDAO.setIfAbsent(key, idempotent.timeout(), idempotent.timeUnit()); + // 锁定失败,抛出异常 + if (!success) { + log.info("[aroundPointCut][方法({}) 参数({}) 存在重复请求]", joinPoint.getSignature().toString(), joinPoint.getArgs()); + throw new ServiceException(GlobalErrorCodeConstants.REPEATED_REQUESTS.getCode(), idempotent.message()); + } + + // 2. 执行逻辑 + try { + return joinPoint.proceed(); + } catch (Throwable throwable) { + // 3. 异常时,删除 Key + // 参考美团 GTIS 思路:https://tech.meituan.com/2016/09/29/distributed-system-mutually-exclusive-idempotence-cerberus-gtis.html + if (idempotent.deleteKeyWhenException()) { + idempotentRedisDAO.delete(key); + } + throw throwable; + } + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java new file mode 100644 index 0000000..412443c --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java @@ -0,0 +1,22 @@ +package com.win.framework.idempotent.core.keyresolver; + +import com.win.framework.idempotent.core.annotation.Idempotent; +import org.aspectj.lang.JoinPoint; + +/** + * 幂等 Key 解析器接口 + * + * @author 芋道源码 + */ +public interface IdempotentKeyResolver { + + /** + * 解析一个 Key + * + * @param idempotent 幂等注解 + * @param joinPoint AOP 切面 + * @return Key + */ + String resolver(JoinPoint joinPoint, Idempotent idempotent); + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java new file mode 100644 index 0000000..f4c8e59 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java @@ -0,0 +1,25 @@ +package com.win.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import org.aspectj.lang.JoinPoint; + +/** + * 默认(全局级别)幂等 Key 解析器,使用方法名 + 方法参数,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 芋道源码 + */ +public class DefaultIdempotentKeyResolver implements IdempotentKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + return SecureUtil.md5(methodName + argsStr); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java new file mode 100644 index 0000000..6b5d727 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java @@ -0,0 +1,64 @@ +package com.win.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; + +/** + * 基于 Spring EL 表达式, + * + * @author 芋道源码 + */ +public class ExpressionIdempotentKeyResolver implements IdempotentKeyResolver { + + private final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); + + private final ExpressionParser expressionParser = new SpelExpressionParser(); + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + // 获得被拦截方法参数名列表 + Method method = getMethod(joinPoint); + Object[] args = joinPoint.getArgs(); + String[] parameterNames = this.parameterNameDiscoverer.getParameterNames(method); + // 准备 Spring EL 表达式解析的上下文 + StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); + if (ArrayUtil.isNotEmpty(parameterNames)) { + for (int i = 0; i < parameterNames.length; i++) { + evaluationContext.setVariable(parameterNames[i], args[i]); + } + } + + // 解析参数 + Expression expression = expressionParser.parseExpression(idempotent.keyArg()); + return expression.getValue(evaluationContext, String.class); + } + + private static Method getMethod(JoinPoint point) { + // 处理,声明在类上的情况 + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + if (!method.getDeclaringClass().isInterface()) { + return method; + } + + // 处理,声明在接口上的情况 + try { + return point.getTarget().getClass().getDeclaredMethod( + point.getSignature().getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/UserIdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/UserIdempotentKeyResolver.java new file mode 100644 index 0000000..af74a3a --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/UserIdempotentKeyResolver.java @@ -0,0 +1,28 @@ +package com.win.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.aspectj.lang.JoinPoint; + +/** + * 用户级别的幂等 Key 解析器,使用方法名 + 方法参数 + userId + userType,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 芋道源码 + */ +public class UserIdempotentKeyResolver implements IdempotentKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + Long userId = WebFrameworkUtils.getLoginUserId(); + Integer userType = WebFrameworkUtils.getLoginUserType(); + return SecureUtil.md5(methodName + argsStr + userId + userType); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java new file mode 100644 index 0000000..2a7d359 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java @@ -0,0 +1,41 @@ +package com.win.framework.idempotent.core.redis; + +import lombok.AllArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * 幂等 Redis DAO + * + * @author 芋道源码 + */ +@AllArgsConstructor +public class IdempotentRedisDAO { + + /** + * 幂等操作 + * + * KEY 格式:idempotent:%s // 参数为 uuid + * VALUE 格式:String + * 过期时间:不固定 + */ + private static final String IDEMPOTENT = "idempotent:%s"; + + private final StringRedisTemplate redisTemplate; + + public Boolean setIfAbsent(String key, long timeout, TimeUnit timeUnit) { + String redisKey = formatKey(key); + return redisTemplate.opsForValue().setIfAbsent(redisKey, "", timeout, timeUnit); + } + + public void delete(String key) { + String redisKey = formatKey(key); + redisTemplate.delete(redisKey); + } + + private static String formatKey(String key) { + return String.format(IDEMPOTENT, key); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java new file mode 100644 index 0000000..7a0327a --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java @@ -0,0 +1,12 @@ +/** + * 幂等组件,参考 https://github.com/it4alla/idempotent 项目实现 + * 实现原理是,相同参数的方法,一段时间内,有且仅能执行一次。通过这样的方式,保证幂等性。 + * + * 使用场景:例如说,用户快速的双击了某个按钮,前端没有禁用该按钮,导致发送了两次重复的请求。 + * + * 和 it4alla/idempotent 组件的差异点,主要体现在两点: + * 1. 我们去掉了 @Idempotent 注解的 delKey 属性。原因是,本质上 delKey 为 true 时,实现的是分布式锁的能力 + * 此时,我们偏向使用 Lock4j 组件。原则上,一个组件只提供一种单一的能力。 + * 2. 考虑到组件的通用性,我们并未像 it4alla/idempotent 组件一样使用 Redisson RMap 结构,而是直接使用 Redis 的 String 数据格式。 + */ +package com.win.framework.idempotent; diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java new file mode 100644 index 0000000..08184bf --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java @@ -0,0 +1,18 @@ +package com.win.framework.lock4j.config; + +import com.win.framework.lock4j.core.DefaultLockFailureStrategy; +import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration(before = LockAutoConfiguration.class) +@ConditionalOnClass(name = "com.baomidou.lock.annotation.Lock4j") +public class WinLock4jConfiguration { + + @Bean + public DefaultLockFailureStrategy lockFailureStrategy() { + return new DefaultLockFailureStrategy(); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java new file mode 100644 index 0000000..4ac4020 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java @@ -0,0 +1,21 @@ +package com.win.framework.lock4j.core; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.baomidou.lock.LockFailureStrategy; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Method; + +/** + * 自定义获取锁失败策略,抛出 {@link ServiceException} 异常 + */ +@Slf4j +public class DefaultLockFailureStrategy implements LockFailureStrategy { + + @Override + public void onLockFailure(String key, Method method, Object[] arguments) { + log.debug("[onLockFailure][线程:{} 获取锁失败,key:{} 获取失败:{} ]", Thread.currentThread().getName(), key, arguments); + throw new ServiceException(GlobalErrorCodeConstants.LOCKED); + } +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java new file mode 100644 index 0000000..5fded71 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java @@ -0,0 +1,19 @@ +package com.win.framework.lock4j.core; + +/** + * Lock4j Redis Key 枚举类 + * + * @author 芋道源码 + */ +public interface Lock4jRedisKeyConstants { + + /** + * 分布式锁 + * + * KEY 格式:lock4j:%s // 参数来自 DefaultLockKeyBuilder 类 + * VALUE 数据格式:HASH // RLock.class:Redisson 的 Lock 锁,使用 Hash 数据结构 + * 过期时间:不固定 + */ + String LOCK4J = "lock4j:%s"; + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java new file mode 100644 index 0000000..b76745e --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java @@ -0,0 +1,4 @@ +/** + * 分布式锁组件,使用 https://gitee.com/baomidou/lock4j 开源项目 + */ +package com.win.framework.lock4j; diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/config/WinRateLimiterConfiguration.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/config/WinRateLimiterConfiguration.java new file mode 100644 index 0000000..e644a7c --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/config/WinRateLimiterConfiguration.java @@ -0,0 +1,55 @@ +package com.win.framework.ratelimiter.config; + +import com.win.framework.ratelimiter.core.aop.RateLimiterAspect; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import com.win.framework.ratelimiter.core.keyresolver.impl.*; +import com.win.framework.ratelimiter.core.redis.RateLimiterRedisDAO; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import org.redisson.api.RedissonClient; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.util.List; + +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinRateLimiterConfiguration { + + @Bean + public RateLimiterAspect rateLimiterAspect(List keyResolvers, RateLimiterRedisDAO rateLimiterRedisDAO) { + return new RateLimiterAspect(keyResolvers, rateLimiterRedisDAO); + } + + @Bean + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") + public RateLimiterRedisDAO rateLimiterRedisDAO(RedissonClient redissonClient) { + return new RateLimiterRedisDAO(redissonClient); + } + + // ========== 各种 RateLimiterRedisDAO Bean ========== + + @Bean + public DefaultRateLimiterKeyResolver defaultRateLimiterKeyResolver() { + return new DefaultRateLimiterKeyResolver(); + } + + @Bean + public UserRateLimiterKeyResolver userRateLimiterKeyResolver() { + return new UserRateLimiterKeyResolver(); + } + + @Bean + public ClientIpRateLimiterKeyResolver clientIpRateLimiterKeyResolver() { + return new ClientIpRateLimiterKeyResolver(); + } + + @Bean + public ServerNodeRateLimiterKeyResolver serverNodeRateLimiterKeyResolver() { + return new ServerNodeRateLimiterKeyResolver(); + } + + @Bean + public ExpressionRateLimiterKeyResolver expressionRateLimiterKeyResolver() { + return new ExpressionRateLimiterKeyResolver(); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/annotation/RateLimiter.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/annotation/RateLimiter.java new file mode 100644 index 0000000..3019bb1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/annotation/RateLimiter.java @@ -0,0 +1,62 @@ +package com.win.framework.ratelimiter.core.annotation; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import com.win.framework.ratelimiter.core.keyresolver.impl.ClientIpRateLimiterKeyResolver; +import com.win.framework.ratelimiter.core.keyresolver.impl.DefaultRateLimiterKeyResolver; +import com.win.framework.ratelimiter.core.keyresolver.impl.ServerNodeRateLimiterKeyResolver; +import com.win.framework.ratelimiter.core.keyresolver.impl.UserRateLimiterKeyResolver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +/** + * 限流注解 + * + * @author 芋道源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RateLimiter { + + /** + * 限流的时间,默认为 1 秒 + */ + int time() default 1; + /** + * 时间单位,默认为 SECONDS 秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * 限流次数 + */ + int count() default 100; + + /** + * 提示信息,请求过快的提示 + * + * @see GlobalErrorCodeConstants#TOO_MANY_REQUESTS + */ + String message() default ""; // 为空时,使用 TOO_MANY_REQUESTS 错误提示 + + /** + * 使用的 Key 解析器 + * + * @see DefaultRateLimiterKeyResolver 全局级别 + * @see UserRateLimiterKeyResolver 用户 ID 级别 + * @see ClientIpRateLimiterKeyResolver 用户 IP 级别 + * @see ServerNodeRateLimiterKeyResolver 服务器 Node 级别 + * @see ExpressionIdempotentKeyResolver 自定义表达式,通过 {@link #keyArg()} 计算 + */ + Class keyResolver() default DefaultRateLimiterKeyResolver.class; + /** + * 使用的 Key 参数 + */ + String keyArg() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/aop/RateLimiterAspect.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/aop/RateLimiterAspect.java new file mode 100644 index 0000000..af2664c --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/aop/RateLimiterAspect.java @@ -0,0 +1,60 @@ +package com.win.framework.ratelimiter.core.aop; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import com.win.framework.ratelimiter.core.redis.RateLimiterRedisDAO; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.util.Assert; + +import java.util.List; +import java.util.Map; + +/** + * 拦截声明了 {@link RateLimiter} 注解的方法,实现限流操作 + * + * @author 芋道源码 + */ +@Aspect +@Slf4j +public class RateLimiterAspect { + + /** + * RateLimiterKeyResolver 集合 + */ + private final Map, RateLimiterKeyResolver> keyResolvers; + + private final RateLimiterRedisDAO rateLimiterRedisDAO; + + public RateLimiterAspect(List keyResolvers, RateLimiterRedisDAO rateLimiterRedisDAO) { + this.keyResolvers = CollectionUtils.convertMap(keyResolvers, RateLimiterKeyResolver::getClass); + this.rateLimiterRedisDAO = rateLimiterRedisDAO; + } + + @Before("@annotation(rateLimiter)") + public void beforePointCut(JoinPoint joinPoint, RateLimiter rateLimiter) { + // 获得 IdempotentKeyResolver 对象 + RateLimiterKeyResolver keyResolver = keyResolvers.get(rateLimiter.keyResolver()); + Assert.notNull(keyResolver, "找不到对应的 RateLimiterKeyResolver"); + // 解析 Key + String key = keyResolver.resolver(joinPoint, rateLimiter); + + // 获取 1 次限流 + boolean success = rateLimiterRedisDAO.tryAcquire(key, + rateLimiter.count(), rateLimiter.time(), rateLimiter.timeUnit()); + if (!success) { + log.info("[beforePointCut][方法({}) 参数({}) 请求过于频繁]", joinPoint.getSignature().toString(), joinPoint.getArgs()); + String message = StrUtil.blankToDefault(rateLimiter.message(), + GlobalErrorCodeConstants.TOO_MANY_REQUESTS.getMsg()); + throw new ServiceException(GlobalErrorCodeConstants.TOO_MANY_REQUESTS.getCode(), message); + } + } + +} + diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/RateLimiterKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/RateLimiterKeyResolver.java new file mode 100644 index 0000000..85c3d85 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/RateLimiterKeyResolver.java @@ -0,0 +1,22 @@ +package com.win.framework.ratelimiter.core.keyresolver; + +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import org.aspectj.lang.JoinPoint; + +/** + * 限流 Key 解析器接口 + * + * @author 芋道源码 + */ +public interface RateLimiterKeyResolver { + + /** + * 解析一个 Key + * + * @param rateLimiter 限流注解 + * @param joinPoint AOP 切面 + * @return Key + */ + String resolver(JoinPoint joinPoint, RateLimiter rateLimiter); + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ClientIpRateLimiterKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ClientIpRateLimiterKeyResolver.java new file mode 100644 index 0000000..80cb090 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ClientIpRateLimiterKeyResolver.java @@ -0,0 +1,27 @@ +package com.win.framework.ratelimiter.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import org.aspectj.lang.JoinPoint; + +/** + * IP 级别的限流 Key 解析器,使用方法名 + 方法参数 + IP,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 芋道源码 + */ +public class ClientIpRateLimiterKeyResolver implements RateLimiterKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, RateLimiter rateLimiter) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + String clientIp = ServletUtils.getClientIP(); + return SecureUtil.md5(methodName + argsStr + clientIp); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/DefaultRateLimiterKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/DefaultRateLimiterKeyResolver.java new file mode 100644 index 0000000..01b5259 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/DefaultRateLimiterKeyResolver.java @@ -0,0 +1,25 @@ +package com.win.framework.ratelimiter.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import org.aspectj.lang.JoinPoint; + +/** + * 默认(全局级别)限流 Key 解析器,使用方法名 + 方法参数,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 芋道源码 + */ +public class DefaultRateLimiterKeyResolver implements RateLimiterKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, RateLimiter rateLimiter) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + return SecureUtil.md5(methodName + argsStr); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ExpressionRateLimiterKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ExpressionRateLimiterKeyResolver.java new file mode 100644 index 0000000..7c0d507 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ExpressionRateLimiterKeyResolver.java @@ -0,0 +1,64 @@ +package com.win.framework.ratelimiter.core.keyresolver.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; + +/** + * 基于 Spring EL 表达式的 {@link RateLimiterKeyResolver} 实现类 + * + * @author 芋道源码 + */ +public class ExpressionRateLimiterKeyResolver implements RateLimiterKeyResolver { + + private final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); + + private final ExpressionParser expressionParser = new SpelExpressionParser(); + + @Override + public String resolver(JoinPoint joinPoint, RateLimiter rateLimiter) { + // 获得被拦截方法参数名列表 + Method method = getMethod(joinPoint); + Object[] args = joinPoint.getArgs(); + String[] parameterNames = this.parameterNameDiscoverer.getParameterNames(method); + // 准备 Spring EL 表达式解析的上下文 + StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); + if (ArrayUtil.isNotEmpty(parameterNames)) { + for (int i = 0; i < parameterNames.length; i++) { + evaluationContext.setVariable(parameterNames[i], args[i]); + } + } + + // 解析参数 + Expression expression = expressionParser.parseExpression(rateLimiter.keyArg()); + return expression.getValue(evaluationContext, String.class); + } + + private static Method getMethod(JoinPoint point) { + // 处理,声明在类上的情况 + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + if (!method.getDeclaringClass().isInterface()) { + return method; + } + + // 处理,声明在接口上的情况 + try { + return point.getTarget().getClass().getDeclaredMethod( + point.getSignature().getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ServerNodeRateLimiterKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ServerNodeRateLimiterKeyResolver.java new file mode 100644 index 0000000..b249f15 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/ServerNodeRateLimiterKeyResolver.java @@ -0,0 +1,27 @@ +package com.win.framework.ratelimiter.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.system.SystemUtil; +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import org.aspectj.lang.JoinPoint; + +/** + * Server 节点级别的限流 Key 解析器,使用方法名 + 方法参数 + IP,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 芋道源码 + */ +public class ServerNodeRateLimiterKeyResolver implements RateLimiterKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, RateLimiter rateLimiter) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + String serverNode = String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID()); + return SecureUtil.md5(methodName + argsStr + serverNode); + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/UserRateLimiterKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/UserRateLimiterKeyResolver.java new file mode 100644 index 0000000..19131e2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/keyresolver/impl/UserRateLimiterKeyResolver.java @@ -0,0 +1,28 @@ +package com.win.framework.ratelimiter.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.win.framework.ratelimiter.core.annotation.RateLimiter; +import com.win.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.aspectj.lang.JoinPoint; + +/** + * 用户级别的限流 Key 解析器,使用方法名 + 方法参数 + userId + userType,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 芋道源码 + */ +public class UserRateLimiterKeyResolver implements RateLimiterKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, RateLimiter rateLimiter) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + Long userId = WebFrameworkUtils.getLoginUserId(); + Integer userType = WebFrameworkUtils.getLoginUserType(); + return SecureUtil.md5(methodName + argsStr + userId + userType); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java new file mode 100644 index 0000000..a0b0b17 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java @@ -0,0 +1,60 @@ +package com.win.framework.ratelimiter.core.redis; + +import lombok.AllArgsConstructor; +import org.redisson.api.*; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * 限流 Redis DAO + * + * @author 芋道源码 + */ +@AllArgsConstructor +public class RateLimiterRedisDAO { + + /** + * 限流操作 + * + * KEY 格式:rate_limiter:%s // 参数为 uuid + * VALUE 格式:String + * 过期时间:不固定 + */ + private static final String RATE_LIMITER = "rate_limiter:%s"; + + private final RedissonClient redissonClient; + + public Boolean tryAcquire(String key, int count, int time, TimeUnit timeUnit) { + // 1. 获得 RRateLimiter,并设置 rate 速率 + RRateLimiter rateLimiter = getRRateLimiter(key, count, time, timeUnit); + // 2. 尝试获取 1 个 + return rateLimiter.tryAcquire(); + } + + private static String formatKey(String key) { + return String.format(RATE_LIMITER, key); + } + + private RRateLimiter getRRateLimiter(String key, long count, int time, TimeUnit timeUnit) { + String redisKey = formatKey(key); + RRateLimiter rateLimiter = redissonClient.getRateLimiter(redisKey); + long rateInterval = timeUnit.toSeconds(time); + // 1. 如果不存在,设置 rate 速率 + RateLimiterConfig config = rateLimiter.getConfig(); + if (config == null) { + rateLimiter.trySetRate(RateType.OVERALL, count, rateInterval, RateIntervalUnit.SECONDS); + return rateLimiter; + } + // 2. 如果存在,并且配置相同,则直接返回 + if (config.getRateType() == RateType.OVERALL + && Objects.equals(config.getRate(), count) + && Objects.equals(config.getRateInterval(), TimeUnit.SECONDS.toMillis(rateInterval))) { + return rateLimiter; + } + // 3. 如果存在,并且配置不同,则进行新建 + rateLimiter.setRate(RateType.OVERALL, count, rateInterval, RateIntervalUnit.SECONDS); + return rateLimiter; + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/package-info.java new file mode 100644 index 0000000..bd26afa --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/ratelimiter/package-info.java @@ -0,0 +1,4 @@ +/** + * 限流组件,基于 Redisson {@link org.redisson.api.RRateLimiter} 限流实现 + */ +package com.win.framework.ratelimiter; \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/config/WinApiSignatureAutoConfiguration.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/config/WinApiSignatureAutoConfiguration.java new file mode 100644 index 0000000..e41f2bd --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/config/WinApiSignatureAutoConfiguration.java @@ -0,0 +1,28 @@ +package com.win.framework.signature.config; + +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import com.win.framework.signature.core.aop.ApiSignatureAspect; +import com.win.framework.signature.core.redis.ApiSignatureRedisDAO; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.core.StringRedisTemplate; + +/** + * HTTP API 签名的自动配置类 + * + * @author Zhougang + */ +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinApiSignatureAutoConfiguration { + + @Bean + public ApiSignatureAspect signatureAspect(ApiSignatureRedisDAO signatureRedisDAO) { + return new ApiSignatureAspect(signatureRedisDAO); + } + + @Bean + public ApiSignatureRedisDAO signatureRedisDAO(StringRedisTemplate stringRedisTemplate) { + return new ApiSignatureRedisDAO(stringRedisTemplate); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/annotation/ApiSignature.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/annotation/ApiSignature.java new file mode 100644 index 0000000..5de9db0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/annotation/ApiSignature.java @@ -0,0 +1,59 @@ +package com.win.framework.signature.core.annotation; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; + +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + + +/** + * HTTP API 签名注解 + * + * @author Zhougang + */ +@Inherited +@Documented +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiSignature { + + /** + * 同一个请求多长时间内有效 默认 60 秒 + */ + int timeout() default 60; + + /** + * 时间单位,默认为 SECONDS 秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + // ========================== 签名参数 ========================== + + /** + * 提示信息,签名失败的提示 + * + * @see GlobalErrorCodeConstants#BAD_REQUEST + */ + String message() default "签名不正确"; // 为空时,使用 BAD_REQUEST 错误提示 + + /** + * 签名字段:appId 应用ID + */ + String appId() default "appId"; + + /** + * 签名字段:timestamp 时间戳 + */ + String timestamp() default "timestamp"; + + /** + * 签名字段:nonce 随机数,10 位以上 + */ + String nonce() default "nonce"; + + /** + * sign 客户端签名 + */ + String sign() default "sign"; + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/aop/ApiSignatureAspect.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/aop/ApiSignatureAspect.java new file mode 100644 index 0000000..76398fe --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/aop/ApiSignatureAspect.java @@ -0,0 +1,168 @@ +package com.win.framework.signature.core.aop; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.signature.core.annotation.ApiSignature; +import com.win.framework.signature.core.redis.ApiSignatureRedisDAO; +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; + +import java.util.Map; +import java.util.Objects; +import java.util.SortedMap; +import java.util.TreeMap; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; + +/** + * 拦截声明了 {@link ApiSignature} 注解的方法,实现签名 + * + * @author Zhougang + */ +@Aspect +@Slf4j +@AllArgsConstructor +public class ApiSignatureAspect { + + private final ApiSignatureRedisDAO signatureRedisDAO; + + @Before("@annotation(signature)") + public void beforePointCut(JoinPoint joinPoint, ApiSignature signature) { + // 1. 验证通过,直接结束 + if (verifySignature(signature, Objects.requireNonNull(ServletUtils.getRequest()))) { + return; + } + + // 2. 验证不通过,抛出异常 + log.error("[beforePointCut][方法{} 参数({}) 签名失败]", joinPoint.getSignature().toString(), + joinPoint.getArgs()); + throw new ServiceException(BAD_REQUEST.getCode(), + StrUtil.blankToDefault(signature.message(), BAD_REQUEST.getMsg())); + } + + public boolean verifySignature(ApiSignature signature, HttpServletRequest request) { + // 1.1 校验 Header + if (!verifyHeaders(signature, request)) { + return false; + } + // 1.2 校验 appId 是否能获取到对应的 appSecret + String appId = request.getHeader(signature.appId()); + String appSecret = signatureRedisDAO.getAppSecret(appId); + Assert.notNull(appSecret, "[appId({})] 找不到对应的 appSecret", appId); + + // 2. 校验签名【重要!】 + String clientSignature = request.getHeader(signature.sign()); // 客户端签名 + String serverSignatureString = buildSignatureString(signature, request, appSecret); // 服务端签名字符串 + String serverSignature = DigestUtil.sha256Hex(serverSignatureString); // 服务端签名 + if (ObjUtil.notEqual(clientSignature, serverSignature)) { + return false; + } + + // 3. 将 nonce 记入缓存,防止重复使用(重点二:此处需要将 ttl 设定为允许 timestamp 时间差的值 x 2 ) + String nonce = request.getHeader(signature.nonce()); + signatureRedisDAO.setNonce(appId, nonce, signature.timeout() * 2, signature.timeUnit()); + return true; + } + + /** + * 校验请求头加签参数 + * + * 1. appId 是否为空 + * 2. timestamp 是否为空,请求是否已经超时,默认 10 分钟 + * 3. nonce 是否为空,随机数是否 10 位以上,是否在规定时间内已经访问过了 + * 4. sign 是否为空 + * + * @param signature signature + * @param request request + * @return 是否校验 Header 通过 + */ + private boolean verifyHeaders(ApiSignature signature, HttpServletRequest request) { + // 1. 非空校验 + String appId = request.getHeader(signature.appId()); + if (StrUtil.isBlank(appId)) { + return false; + } + String timestamp = request.getHeader(signature.timestamp()); + if (StrUtil.isBlank(timestamp)) { + return false; + } + String nonce = request.getHeader(signature.nonce()); + if (StrUtil.length(nonce) < 10) { + return false; + } + String sign = request.getHeader(signature.sign()); + if (StrUtil.isBlank(sign)) { + return false; + } + + // 2. 检查 timestamp 是否超出允许的范围 (重点一:此处需要取绝对值) + long expireTime = signature.timeUnit().toMillis(signature.timeout()); + long requestTimestamp = Long.parseLong(timestamp); + long timestampDisparity = Math.abs(System.currentTimeMillis() - requestTimestamp); + if (timestampDisparity > expireTime) { + return false; + } + + // 3. 检查 nonce 是否存在,有且仅能使用一次 + return signatureRedisDAO.getNonce(appId, nonce) == null; + } + + /** + * 构建签名字符串 + * + * 格式为 = 请求参数 + 请求体 + 请求头 + 密钥 + * + * @param signature signature + * @param request request + * @param appSecret appSecret + * @return 签名字符串 + */ + private String buildSignatureString(ApiSignature signature, HttpServletRequest request, String appSecret) { + SortedMap parameterMap = getRequestParameterMap(request); // 请求头 + SortedMap headerMap = getRequestHeaderMap(signature, request); // 请求参数 + String requestBody = StrUtil.nullToDefault(ServletUtils.getBody(request), ""); // 请求体 + return MapUtil.join(parameterMap, "&", "=") + + requestBody + + MapUtil.join(headerMap, "&", "=") + + appSecret; + } + + /** + * 获取请求头加签参数 Map + * + * @param request 请求 + * @param signature 签名注解 + * @return signature params + */ + private static SortedMap getRequestHeaderMap(ApiSignature signature, HttpServletRequest request) { + SortedMap sortedMap = new TreeMap<>(); + sortedMap.put(signature.appId(), request.getHeader(signature.appId())); + sortedMap.put(signature.timestamp(), request.getHeader(signature.timestamp())); + sortedMap.put(signature.nonce(), request.getHeader(signature.nonce())); + return sortedMap; + } + + /** + * 获取请求参数 Map + * + * @param request 请求 + * @return queryParams + */ + private static SortedMap getRequestParameterMap(HttpServletRequest request) { + SortedMap sortedMap = new TreeMap<>(); + for (Map.Entry entry : request.getParameterMap().entrySet()) { + sortedMap.put(entry.getKey(), entry.getValue()[0]); + } + return sortedMap; + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/redis/ApiSignatureRedisDAO.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/redis/ApiSignatureRedisDAO.java new file mode 100644 index 0000000..ff47a28 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/core/redis/ApiSignatureRedisDAO.java @@ -0,0 +1,57 @@ +package com.win.framework.signature.core.redis; + +import lombok.AllArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * HTTP API 签名 Redis DAO + * + * @author Zhougang + */ +@AllArgsConstructor +public class ApiSignatureRedisDAO { + + private final StringRedisTemplate stringRedisTemplate; + + /** + * 验签随机数 + * + * KEY 格式:signature_nonce:%s // 参数为 随机数 + * VALUE 格式:String + * 过期时间:不固定 + */ + private static final String SIGNATURE_NONCE = "api_signature_nonce:%s:%s"; + + /** + * 签名密钥 + * + * HASH 结构 + * KEY 格式:%s // 参数为 appid + * VALUE 格式:String + * 过期时间:永不过期(预加载到 Redis) + */ + private static final String SIGNATURE_APPID = "api_signature_app"; + + // ========== 验签随机数 ========== + + public String getNonce(String appId, String nonce) { + return stringRedisTemplate.opsForValue().get(formatNonceKey(appId, nonce)); + } + + public void setNonce(String appId, String nonce, int time, TimeUnit timeUnit) { + stringRedisTemplate.opsForValue().set(formatNonceKey(appId, nonce), "", time, timeUnit); + } + + private static String formatNonceKey(String appId, String nonce) { + return String.format(SIGNATURE_NONCE, appId, nonce); + } + + // ========== 签名密钥 ========== + + public String getAppSecret(String appId) { + return (String) stringRedisTemplate.opsForHash().get(SIGNATURE_APPID, appId); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/package-info.java new file mode 100644 index 0000000..c4d3d83 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/signature/package-info.java @@ -0,0 +1,6 @@ +/** + * HTTP API 签名,校验安全性 + * + * @see + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-redis + jar + + ${project.artifactId} + Redis 封装拓展 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.redisson + redisson-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-cache + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java new file mode 100644 index 0000000..7be6cdd --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java @@ -0,0 +1,82 @@ +package com.win.framework.redis.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.redis.core.TimeoutRedisCacheManager; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.cache.CacheProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.BatchStrategies; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.util.StringUtils; + +import java.util.Objects; + +import static com.win.framework.redis.config.WinRedisAutoConfiguration.buildRedisSerializer; + +/** + * Cache 配置类,基于 Redis 实现 + */ +@AutoConfiguration +@EnableConfigurationProperties({CacheProperties.class, WinCacheProperties.class}) +@EnableCaching +public class WinCacheAutoConfiguration { + + /** + * RedisCacheConfiguration Bean + *

+ * 参考 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 的 createConfiguration 方法 + */ + @Bean + @Primary + public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) { + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); + // 设置使用 : 单冒号,而不是双 :: 冒号,避免 Redis Desktop Manager 多余空格 + // 详细可见 https://blog.csdn.net/chuixue24/article/details/103928965 博客 + // 再次修复单冒号,而不是双 :: 冒号问题,Issues 详情:https://gitee.com/zhijiantianya/win-cloud/issues/I86VY2 + config = config.computePrefixWith(cacheName -> { + String keyPrefix = cacheProperties.getRedis().getKeyPrefix(); + if (StringUtils.hasText(keyPrefix)) { + keyPrefix = keyPrefix.lastIndexOf(StrUtil.COLON) == -1 ? keyPrefix + StrUtil.COLON : keyPrefix; + return keyPrefix + cacheName + StrUtil.COLON; + } + return cacheName + StrUtil.COLON; + }); + // 设置使用 JSON 序列化方式 + config = config.serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer(buildRedisSerializer())); + + // 设置 CacheProperties.Redis 的属性 + CacheProperties.Redis redisProperties = cacheProperties.getRedis(); + if (redisProperties.getTimeToLive() != null) { + config = config.entryTtl(redisProperties.getTimeToLive()); + } + if (!redisProperties.isCacheNullValues()) { + config = config.disableCachingNullValues(); + } + if (!redisProperties.isUseKeyPrefix()) { + config = config.disableKeyPrefix(); + } + return config; + } + + @Bean + public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate, + RedisCacheConfiguration redisCacheConfiguration, + WinCacheProperties winCacheProperties) { + // 创建 RedisCacheWriter 对象 + RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory()); + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, + BatchStrategies.scan(winCacheProperties.getRedisScanBatchSize())); + // 创建 TenantRedisCacheManager 对象 + return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration); + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java new file mode 100644 index 0000000..7c45681 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java @@ -0,0 +1,27 @@ +package com.win.framework.redis.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +/** + * Cache 配置项 + * + * @author Wanwan + */ +@ConfigurationProperties("win.cache") +@Data +@Validated +public class WinCacheProperties { + + /** + * {@link #redisScanBatchSize} 默认值 + */ + private static final Integer REDIS_SCAN_BATCH_SIZE_DEFAULT = 30; + + /** + * redis scan 一次返回数量 + */ + private Integer redisScanBatchSize = REDIS_SCAN_BATCH_SIZE_DEFAULT; + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java new file mode 100644 index 0000000..8df7914 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java @@ -0,0 +1,45 @@ +package com.win.framework.redis.config; + +import cn.hutool.core.util.ReflectUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.redisson.spring.starter.RedissonAutoConfigurationV2; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * Redis 配置类 + */ +@AutoConfiguration(before = RedissonAutoConfigurationV2.class) // 目的:使用自己定义的 RedisTemplate Bean +public class WinRedisAutoConfiguration { + + /** + * 创建 RedisTemplate Bean,使用 JSON 序列化方式 + */ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + // 创建 RedisTemplate 对象 + RedisTemplate template = new RedisTemplate<>(); + // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。 + template.setConnectionFactory(factory); + // 使用 String 序列化方式,序列化 KEY 。 + template.setKeySerializer(RedisSerializer.string()); + template.setHashKeySerializer(RedisSerializer.string()); + // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。 + template.setValueSerializer(buildRedisSerializer()); + template.setHashValueSerializer(buildRedisSerializer()); + return template; + } + + public static RedisSerializer buildRedisSerializer() { + RedisSerializer json = RedisSerializer.json(); + // 解决 LocalDateTime 的序列化 + ObjectMapper objectMapper = (ObjectMapper) ReflectUtil.getFieldValue(json, "mapper"); + objectMapper.registerModules(new JavaTimeModule()); + return json; + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java new file mode 100644 index 0000000..b604b06 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java @@ -0,0 +1,86 @@ +package com.win.framework.redis.core; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; + +import java.time.Duration; + +/** + * 支持自定义过期时间的 {@link RedisCacheManager} 实现类 + * + * 在 {@link Cacheable#cacheNames()} 格式为 "key#ttl" 时,# 后面的 ttl 为过期时间。 + * 单位为最后一个字母(支持的单位有:d 天,h 小时,m 分钟,s 秒),默认单位为 s 秒 + * + * @author 芋道源码 + */ +public class TimeoutRedisCacheManager extends RedisCacheManager { + + private static final String SPLIT = "#"; + + public TimeoutRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) { + super(cacheWriter, defaultCacheConfiguration); + } + + @Override + protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { + if (StrUtil.isEmpty(name)) { + return super.createRedisCache(name, cacheConfig); + } + // 如果使用 # 分隔,大小不为 2,则说明不使用自定义过期时间 + String[] names = StrUtil.splitToArray(name, SPLIT); + if (names.length != 2) { + return super.createRedisCache(name, cacheConfig); + } + + // 核心:通过修改 cacheConfig 的过期时间,实现自定义过期时间 + if (cacheConfig != null) { + // 移除 # 后面的 : 以及后面的内容,避免影响解析 + String ttlStr = StrUtil.subBefore(names[1], StrUtil.COLON, false); // 获得 ttlStr 时间部分 + names[1] = StrUtil.subAfter(names[1], ttlStr, false); // 移除掉 ttlStr 时间部分 + // 解析时间 + Duration duration = parseDuration(ttlStr); + cacheConfig = cacheConfig.entryTtl(duration); + } + + // 创建 RedisCache 对象,需要忽略掉 ttlStr + return super.createRedisCache(names[0] + names[1], cacheConfig); + } + + /** + * 解析过期时间 Duration + * + * @param ttlStr 过期时间字符串 + * @return 过期时间 Duration + */ + private Duration parseDuration(String ttlStr) { + String timeUnit = StrUtil.subSuf(ttlStr, -1); + switch (timeUnit) { + case "d": + return Duration.ofDays(removeDurationSuffix(ttlStr)); + case "h": + return Duration.ofHours(removeDurationSuffix(ttlStr)); + case "m": + return Duration.ofMinutes(removeDurationSuffix(ttlStr)); + case "s": + return Duration.ofSeconds(removeDurationSuffix(ttlStr)); + default: + return Duration.ofSeconds(Long.parseLong(ttlStr)); + } + } + + /** + * 移除多余的后缀,返回具体的时间 + * + * @param ttlStr 过期时间字符串 + * @return 时间 + */ + private Long removeDurationSuffix(String ttlStr) { + return NumberUtil.parseLong(StrUtil.sub(ttlStr, 0, ttlStr.length() - 1)); + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/package-info.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/package-info.java new file mode 100644 index 0000000..7be362f --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/package-info.java @@ -0,0 +1,4 @@ +/** + * 采用 Spring Data Redis 操作 Redis,底层使用 Redisson 作为客户端 + */ +package com.win.framework.redis; diff --git a/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..28b3458 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.redis.config.WinRedisAutoConfiguration +com.win.framework.redis.config.WinCacheAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md b/win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md new file mode 100644 index 0000000..50ce4c7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md b/win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md new file mode 100644 index 0000000..c5c959b --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-security/pom.xml b/win-framework/win-spring-boot-starter-security/pom.xml new file mode 100644 index 0000000..a6710a8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/pom.xml @@ -0,0 +1,71 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-security + jar + + ${project.artifactId} + + 1. security:用户的认证、权限的校验,实现「谁」可以做「什么事」 + 2. operatelog:操作日志,实现「谁」在「什么时间」对「什么」做了「什么事」 + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.win + win-spring-boot-starter-web + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.google.guava + guava + + + + + + io.github.mouzt + bizlog-sdk + + + + + com.win + win-module-system-api + ${revision} + + + + diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/config/WinOperateLogConfiguration.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/config/WinOperateLogConfiguration.java new file mode 100644 index 0000000..79eaed3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/config/WinOperateLogConfiguration.java @@ -0,0 +1,27 @@ +package com.win.framework.operatelog.config; + +import com.win.framework.operatelog.core.service.LogRecordServiceImpl; +import com.mzt.logapi.service.ILogRecordService; +import com.mzt.logapi.starter.annotation.EnableLogRecord; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; + +/** + * 操作日志配置类 + * + * @author HUIHUI + */ +@EnableLogRecord(tenant = "") // 貌似用不上 tenant 这玩意给个空好啦 +@AutoConfiguration +@Slf4j +public class WinOperateLogConfiguration { + + @Bean + @Primary + public ILogRecordService iLogRecordServiceImpl() { + return new LogRecordServiceImpl(); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/package-info.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/package-info.java new file mode 100644 index 0000000..1075c61 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,无特殊作用 + */ +package com.win.framework.operatelog.core; \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/service/LogRecordServiceImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/service/LogRecordServiceImpl.java new file mode 100644 index 0000000..7d6f2d9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/core/service/LogRecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.win.framework.operatelog.core.service; + +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.api.logger.OperateLogApi; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.mzt.logapi.beans.LogRecord; +import com.mzt.logapi.service.ILogRecordService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 操作日志 ILogRecordService 实现类 + * + * 基于 {@link OperateLogApi} 实现,记录操作日志 + * + * @author HUIHUI + */ +@Slf4j +public class LogRecordServiceImpl implements ILogRecordService { + + @Resource + private OperateLogApi operateLogApi; + + @Override + public void record(LogRecord logRecord) { + OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO(); + try { + reqDTO.setTraceId(TracerUtils.getTraceId()); + // 补充用户信息 + fillUserFields(reqDTO); + // 补全模块信息 + fillModuleFields(reqDTO, logRecord); + // 补全请求信息 + fillRequestFields(reqDTO); + + // 2. 异步记录日志 + operateLogApi.createOperateLogAsync(reqDTO); + } catch (Throwable ex) { + // 由于 @Async 异步调用,这里打印下日志,更容易跟进 + log.error("[record][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); + } + } + + private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { + // 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web; + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) { + return; + } + reqDTO.setUserId(loginUser.getId()); + reqDTO.setUserType(loginUser.getUserType()); + } + + public static void fillModuleFields(OperateLogCreateReqDTO reqDTO, LogRecord logRecord) { + reqDTO.setType(logRecord.getType()); // 大模块类型,例如:CRM 客户 + reqDTO.setSubType(logRecord.getSubType());// 操作名称,例如:转移客户 + reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 业务编号,例如:客户编号 + reqDTO.setAction(logRecord.getAction());// 操作内容,例如:修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 + reqDTO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"} + } + + private static void fillRequestFields(OperateLogCreateReqDTO reqDTO) { + // 获得 Request 对象 + HttpServletRequest request = ServletUtils.getRequest(); + if (request == null) { + return; + } + // 补全请求信息 + reqDTO.setRequestMethod(request.getMethod()); + reqDTO.setRequestUrl(request.getRequestURI()); + reqDTO.setUserIp(ServletUtils.getClientIP(request)); + reqDTO.setUserAgent(ServletUtils.getUserAgent(request)); + } + + @Override + public List queryLog(String bizNo, String type) { + throw new UnsupportedOperationException("使用 OperateLogApi 进行操作日志的查询"); + } + + @Override + public List queryLogByBizNo(String bizNo, String type, String subType) { + throw new UnsupportedOperationException("使用 OperateLogApi 进行操作日志的查询"); + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/package-info.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/package-info.java new file mode 100644 index 0000000..010dd8e --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/operatelog/package-info.java @@ -0,0 +1,7 @@ +/** + * 基于 mzt-log 框架 + * 实现操作日志功能 + * + * @author HUIHUI + */ +package com.win.framework.operatelog; diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java new file mode 100644 index 0000000..da40121 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java @@ -0,0 +1,35 @@ +package com.win.framework.security.config; + +import com.win.framework.web.config.WebProperties; +import jakarta.annotation.Resource; +import org.springframework.core.Ordered; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; + +/** + * 自定义的 URL 的安全配置 + * 目的:每个 Maven Module 可以自定义规则! + * + * @author 芋道源码 + */ +public abstract class AuthorizeRequestsCustomizer + implements Customizer.AuthorizationManagerRequestMatcherRegistry>, Ordered { + + @Resource + private WebProperties webProperties; + + protected String buildAdminApi(String url) { + return webProperties.getAdminApi().getPrefix() + url; + } + + protected String buildAppApi(String url) { + return webProperties.getAppApi().getPrefix() + url; + } + + @Override + public int getOrder() { + return 0; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java new file mode 100644 index 0000000..c041a1c --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java @@ -0,0 +1,51 @@ +package com.win.framework.security.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Collections; +import java.util.List; + +@ConfigurationProperties(prefix = "win.security") +@Validated +@Data +public class SecurityProperties { + + /** + * HTTP 请求时,访问令牌的请求 Header + */ + @NotEmpty(message = "Token Header 不能为空") + private String tokenHeader = "Authorization"; + /** + * HTTP 请求时,访问令牌的请求参数 + * + * 初始目的:解决 WebSocket 无法通过 header 传参,只能通过 token 参数拼接 + */ + @NotEmpty(message = "Token Parameter 不能为空") + private String tokenParameter = "token"; + + /** + * mock 模式的开关 + */ + @NotNull(message = "mock 模式的开关不能为空") + private Boolean mockEnable = false; + /** + * mock 模式的密钥 + * 一定要配置密钥,保证安全性 + */ + @NotEmpty(message = "mock 模式的密钥不能为空") // 这里设置了一个默认值,因为实际上只有 mockEnable 为 true 时才需要配置。 + private String mockSecret = "test"; + + /** + * 免登录的 URL 列表 + */ + private List permitAllUrls = Collections.emptyList(); + + /** + * PasswordEncoder 加密复杂度,越高开销越大 + */ + private Integer passwordEncoderLength = 4; +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java new file mode 100644 index 0000000..c1233b3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java @@ -0,0 +1,94 @@ +package com.win.framework.security.config; + +import com.win.framework.security.core.context.TransmittableThreadLocalSecurityContextHolderStrategy; +import com.win.framework.security.core.filter.TokenAuthenticationFilter; +import com.win.framework.security.core.handler.AccessDeniedHandlerImpl; +import com.win.framework.security.core.handler.AuthenticationEntryPointImpl; +import com.win.framework.security.core.service.SecurityFrameworkService; +import com.win.framework.security.core.service.SecurityFrameworkServiceImpl; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.module.system.api.oauth2.OAuth2TokenApi; +import com.win.module.system.api.permission.PermissionApi; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.config.MethodInvokingFactoryBean; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.AccessDeniedHandler; + +/** + * Spring Security 自动配置类,主要用于相关组件的配置 + * + * 注意,不能和 {@link WinWebSecurityConfigurerAdapter} 用一个,原因是会导致初始化报错。 + * 参见 https://stackoverflow.com/questions/53847050/spring-boot-delegatebuilder-cannot-be-null-on-autowiring-authenticationmanager 文档。 + * + * @author 芋道源码 + */ +@AutoConfiguration +@AutoConfigureOrder(-1) // 目的:先于 Spring Security 自动配置,避免一键改包后,org.* 基础包无法生效 +@EnableConfigurationProperties(SecurityProperties.class) +public class WinSecurityAutoConfiguration { + + @Resource + private SecurityProperties securityProperties; + + /** + * 认证失败处理类 Bean + */ + @Bean + public AuthenticationEntryPoint authenticationEntryPoint() { + return new AuthenticationEntryPointImpl(); + } + + /** + * 权限不够处理器 Bean + */ + @Bean + public AccessDeniedHandler accessDeniedHandler() { + return new AccessDeniedHandlerImpl(); + } + + /** + * Spring Security 加密器 + * 考虑到安全性,这里采用 BCryptPasswordEncoder 加密器 + * + * @see Password Encoding with Spring Security + */ + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(securityProperties.getPasswordEncoderLength()); + } + + /** + * Token 认证过滤器 Bean + */ + @Bean + public TokenAuthenticationFilter authenticationTokenFilter(GlobalExceptionHandler globalExceptionHandler, + OAuth2TokenApi oauth2TokenApi) { + return new TokenAuthenticationFilter(securityProperties, globalExceptionHandler, oauth2TokenApi); + } + + @Bean("ss") // 使用 Spring Security 的缩写,方便使用 + public SecurityFrameworkService securityFrameworkService(PermissionApi permissionApi) { + return new SecurityFrameworkServiceImpl(permissionApi); + } + + /** + * 声明调用 {@link SecurityContextHolder#setStrategyName(String)} 方法, + * 设置使用 {@link TransmittableThreadLocalSecurityContextHolderStrategy} 作为 Security 的上下文策略 + */ + @Bean + public MethodInvokingFactoryBean securityContextHolderMethodInvokingFactoryBean() { + MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean(); + methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class); + methodInvokingFactoryBean.setTargetMethod("setStrategyName"); + methodInvokingFactoryBean.setArguments(TransmittableThreadLocalSecurityContextHolderStrategy.class.getName()); + return methodInvokingFactoryBean; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java new file mode 100644 index 0000000..6b000f9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java @@ -0,0 +1,217 @@ +package com.win.framework.security.config; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.security.core.filter.TokenAuthenticationFilter; +import com.win.framework.web.config.WebProperties; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import org.springframework.web.util.pattern.PathPattern; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 自定义的 Spring Security 配置适配器实现 + * + * @author 芋道源码 + */ +@AutoConfiguration +@AutoConfigureOrder(-1) // 目的:先于 Spring Security 自动配置,避免一键改包后,org.* 基础包无法生效 +@EnableMethodSecurity(securedEnabled = true) +public class WinWebSecurityConfigurerAdapter { + + @Resource + private WebProperties webProperties; + @Resource + private SecurityProperties securityProperties; + + /** + * 认证失败处理类 Bean + */ + @Resource + private AuthenticationEntryPoint authenticationEntryPoint; + /** + * 权限不够处理器 Bean + */ + @Resource + private AccessDeniedHandler accessDeniedHandler; + /** + * Token 认证过滤器 Bean + */ + @Resource + private TokenAuthenticationFilter authenticationTokenFilter; + + /** + * 自定义的权限映射 Bean 们 + * + * @see #filterChain(HttpSecurity) + */ + @Resource + private List authorizeRequestsCustomizers; + + @Resource + private ApplicationContext applicationContext; + + /** + * 由于 Spring Security 创建 AuthenticationManager 对象时,没声明 @Bean 注解,导致无法被注入 + * 通过覆写父类的该方法,添加 @Bean 注解,解决该问题 + */ + @Bean + public AuthenticationManager authenticationManagerBean(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); + } + + /** + * 配置 URL 的安全配置 + * + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Bean + protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + // 登出 + httpSecurity + // 开启跨域 + .cors(Customizer.withDefaults()) + // CSRF 禁用,因为不使用 Session + .csrf(AbstractHttpConfigurer::disable) + // 基于 token 机制,所以不需要 Session + .sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .headers(c -> c.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + // 一堆自定义的 Spring Security 处理器 + .exceptionHandling(c -> c.authenticationEntryPoint(authenticationEntryPoint) + .accessDeniedHandler(accessDeniedHandler)); + // 登录、登录暂时不使用 Spring Security 的拓展点,主要考虑一方面拓展多用户、多种登录方式相对复杂,一方面用户的学习成本较高 + + // 获得 @PermitAll 带来的 URL 列表,免登录 + Multimap permitAllUrls = getPermitAllUrlsFromAnnotations(); + // 设置每个请求的权限 + httpSecurity + // ①:全局共享规则 + .authorizeHttpRequests(c -> c + // 1.1 静态资源,可匿名访问 + .requestMatchers(HttpMethod.GET, "/*.html", "/*.html", "/*.css", "/*.js").permitAll() + // 1.2 设置 @PermitAll 无需认证 + .requestMatchers(HttpMethod.GET, permitAllUrls.get(HttpMethod.GET).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.POST, permitAllUrls.get(HttpMethod.POST).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.PUT, permitAllUrls.get(HttpMethod.PUT).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.DELETE, permitAllUrls.get(HttpMethod.DELETE).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.HEAD, permitAllUrls.get(HttpMethod.HEAD).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.PATCH, permitAllUrls.get(HttpMethod.PATCH).toArray(new String[0])).permitAll() + // 1.3 基于 win.security.permit-all-urls 无需认证 + .requestMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll() + ) + // ②:每个项目的自定义规则 + .authorizeHttpRequests(c -> authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(c))) + // ③:兜底规则,必须认证 + .authorizeHttpRequests(c -> c.anyRequest().authenticated()); + + // 添加 Token Filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + return httpSecurity.build(); + } + + private String buildAppApi(String url) { + return webProperties.getAppApi().getPrefix() + url; + } + + private Multimap getPermitAllUrlsFromAnnotations() { + Multimap result = HashMultimap.create(); + // 获得接口对应的 HandlerMethod 集合 + RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) + applicationContext.getBean("requestMappingHandlerMapping"); + Map handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); + // 获得有 @PermitAll 注解的接口 + for (Map.Entry entry : handlerMethodMap.entrySet()) { + HandlerMethod handlerMethod = entry.getValue(); + if (!handlerMethod.hasMethodAnnotation(PermitAll.class)) { + continue; + } + Set urls = new HashSet<>(); + if (entry.getKey().getPatternsCondition() != null) { + urls.addAll(entry.getKey().getPatternsCondition().getPatterns()); + } + if (entry.getKey().getPathPatternsCondition() != null) { + urls.addAll(convertList(entry.getKey().getPathPatternsCondition().getPatterns(), PathPattern::getPatternString)); + } + if (urls.isEmpty()) { + continue; + } + + // 特殊:使用 @RequestMapping 注解,并且未写 method 属性,此时认为都需要免登录 + Set methods = entry.getKey().getMethodsCondition().getMethods(); + if (CollUtil.isEmpty(methods)) { + result.putAll(HttpMethod.GET, urls); + result.putAll(HttpMethod.POST, urls); + result.putAll(HttpMethod.PUT, urls); + result.putAll(HttpMethod.DELETE, urls); + result.putAll(HttpMethod.HEAD, urls); + result.putAll(HttpMethod.PATCH, urls); + continue; + } + // 根据请求方法,添加到 result 结果 + entry.getKey().getMethodsCondition().getMethods().forEach(requestMethod -> { + switch (requestMethod) { + case GET: + result.putAll(HttpMethod.GET, urls); + break; + case POST: + result.putAll(HttpMethod.POST, urls); + break; + case PUT: + result.putAll(HttpMethod.PUT, urls); + break; + case DELETE: + result.putAll(HttpMethod.DELETE, urls); + break; + case HEAD: + result.putAll(HttpMethod.HEAD, urls); + break; + case PATCH: + result.putAll(HttpMethod.PATCH, urls); + break; + } + }); + } + return result; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java new file mode 100644 index 0000000..693c91c --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java @@ -0,0 +1,71 @@ +package com.win.framework.security.core; + +import cn.hutool.core.map.MapUtil; +import com.win.framework.common.enums.UserTypeEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 登录用户信息 + * + * @author 芋道源码 + */ +@Data +public class LoginUser { + + public static final String INFO_KEY_NICKNAME = "nickname"; + public static final String INFO_KEY_DEPT_ID = "deptId"; + + /** + * 用户编号 + */ + private Long id; + /** + * 用户类型 + * + * 关联 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 额外的用户信息 + */ + private Map info; + /** + * 租户编号 + */ + private Long tenantId; + /** + * 授权范围 + */ + private List scopes; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + + // ========== 上下文 ========== + /** + * 上下文字段,不进行持久化 + * + * 1. 用于基于 LoginUser 维度的临时缓存 + */ + @JsonIgnore + private Map context; + + public void setContext(String key, Object value) { + if (context == null) { + context = new HashMap<>(); + } + context.put(key, value); + } + + public T getContext(String key, Class type) { + return MapUtil.get(context, key, type); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java new file mode 100644 index 0000000..dfc7f9c --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java @@ -0,0 +1,48 @@ +package com.win.framework.security.core.context; + +import com.alibaba.ttl.TransmittableThreadLocal; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolderStrategy; +import org.springframework.security.core.context.SecurityContextImpl; +import org.springframework.util.Assert; + +/** + * 基于 TransmittableThreadLocal 实现的 Security Context 持有者策略 + * 目的是,避免 @Async 等异步执行时,原生 ThreadLocal 的丢失问题 + * + * @author 芋道源码 + */ +public class TransmittableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy { + + /** + * 使用 TransmittableThreadLocal 作为上下文 + */ + private static final ThreadLocal CONTEXT_HOLDER = new TransmittableThreadLocal<>(); + + @Override + public void clearContext() { + CONTEXT_HOLDER.remove(); + } + + @Override + public SecurityContext getContext() { + SecurityContext ctx = CONTEXT_HOLDER.get(); + if (ctx == null) { + ctx = createEmptyContext(); + CONTEXT_HOLDER.set(ctx); + } + return ctx; + } + + @Override + public void setContext(SecurityContext context) { + Assert.notNull(context, "Only non-null SecurityContext instances are permitted"); + CONTEXT_HOLDER.set(context); + } + + @Override + public SecurityContext createEmptyContext() { + return new SecurityContextImpl(); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java new file mode 100644 index 0000000..5b99cec --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java @@ -0,0 +1,119 @@ +package com.win.framework.security.core.filter; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.security.config.SecurityProperties; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.win.module.system.api.oauth2.OAuth2TokenApi; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Token 过滤器,验证 token 的有效性 + * 验证通过后,获得 {@link LoginUser} 信息,并加入到 Spring Security 上下文 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class TokenAuthenticationFilter extends OncePerRequestFilter { + + private final SecurityProperties securityProperties; + + private final GlobalExceptionHandler globalExceptionHandler; + + private final OAuth2TokenApi oauth2TokenApi; + + @Override + @SuppressWarnings("NullableProblems") + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + String token = SecurityFrameworkUtils.obtainAuthorization(request, + securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); + if (StrUtil.isNotEmpty(token)) { + Integer userType = WebFrameworkUtils.getLoginUserType(request); + try { + // 1.1 基于 token 构建登录用户 + LoginUser loginUser = buildLoginUserByToken(token, userType); + // 1.2 模拟 Login 功能,方便日常开发调试 + if (loginUser == null) { + loginUser = mockLoginUser(request, token, userType); + } + + // 2. 设置当前用户 + if (loginUser != null) { + SecurityFrameworkUtils.setLoginUser(loginUser, request); + } + } catch (Throwable ex) { + CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); + ServletUtils.writeJSON(response, result); + return; + } + } + + // 继续过滤链 + chain.doFilter(request, response); + } + + private LoginUser buildLoginUserByToken(String token, Integer userType) { + try { + OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); + if (accessToken == null) { + return null; + } + // 用户类型不匹配,无权限 + // 注意:只有 /admin-api/* 和 /app-api/* 有 userType,才需要比对用户类型 + // 类似 WebSocket 的 /ws/* 连接地址,是不需要比对用户类型的 + if (userType != null + && ObjectUtil.notEqual(accessToken.getUserType(), userType)) { + throw new AccessDeniedException("错误的用户类型"); + } + // 构建登录用户 + return new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType()) + .setInfo(accessToken.getUserInfo()) // 额外的用户信息 + .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()) + .setExpiresTime(accessToken.getExpiresTime()); + } catch (ServiceException serviceException) { + // 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可 + return null; + } + } + + /** + * 模拟登录用户,方便日常开发调试 + * + * 注意,在线上环境下,一定要关闭该功能!!! + * + * @param request 请求 + * @param token 模拟的 token,格式为 {@link SecurityProperties#getMockSecret()} + 用户编号 + * @param userType 用户类型 + * @return 模拟的 LoginUser + */ + private LoginUser mockLoginUser(HttpServletRequest request, String token, Integer userType) { + if (!securityProperties.getMockEnable()) { + return null; + } + // 必须以 mockSecret 开头 + if (!token.startsWith(securityProperties.getMockSecret())) { + return null; + } + // 构建模拟用户 + Long userId = Long.valueOf(token.substring(securityProperties.getMockSecret().length())); + return new LoginUser().setId(userId).setUserType(userType) + .setTenantId(WebFrameworkUtils.getTenantId(request)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java new file mode 100644 index 0000000..1607f1e --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java @@ -0,0 +1,41 @@ +package com.win.framework.security.core.handler; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.access.ExceptionTranslationFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN; + +/** + * 访问一个需要认证的 URL 资源,已经认证(登录)但是没有权限的情况下,返回 {@link GlobalErrorCodeConstants#FORBIDDEN} 错误码。 + * + * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#handleAccessDeniedException(HttpServletRequest, HttpServletResponse, FilterChain, AccessDeniedException)} 方法,调用当前类 + * + * @author 芋道源码 + */ +@Slf4j +@SuppressWarnings("JavadocReference") +public class AccessDeniedHandlerImpl implements AccessDeniedHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) + throws IOException, ServletException { + // 打印 warn 的原因是,不定期合并 warn,看看有没恶意破坏 + log.warn("[commence][访问 URL({}) 时,用户({}) 权限不够]", request.getRequestURI(), + SecurityFrameworkUtils.getLoginUserId(), e); + // 返回 403 + ServletUtils.writeJSON(response, CommonResult.error(FORBIDDEN)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..ecd1666 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java @@ -0,0 +1,35 @@ +package com.win.framework.security.core.handler; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.ExceptionTranslationFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; + +/** + * 访问一个需要认证的 URL 资源,但是此时自己尚未认证(登录)的情况下,返回 {@link GlobalErrorCodeConstants#UNAUTHORIZED} 错误码,从而使前端重定向到登录页 + * + * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#sendStartAuthentication(HttpServletRequest, HttpServletResponse, FilterChain, AuthenticationException)} 方法,调用当前类 + * + * @author ruoyi + */ +@Slf4j +@SuppressWarnings("JavadocReference") // 忽略文档引用报错 +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) { + log.debug("[commence][访问 URL({}) 时,没有登录]", request.getRequestURI(), e); + // 返回 401 + ServletUtils.writeJSON(response, CommonResult.error(UNAUTHORIZED)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java new file mode 100644 index 0000000..442768e --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java @@ -0,0 +1,59 @@ +package com.win.framework.security.core.service; + +/** + * Security 框架 Service 接口,定义权限相关的校验操作 + * + * @author 芋道源码 + */ +public interface SecurityFrameworkService { + + /** + * 判断是否有权限 + * + * @param permission 权限 + * @return 是否 + */ + boolean hasPermission(String permission); + + /** + * 判断是否有权限,任一一个即可 + * + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(String... permissions); + + /** + * 判断是否有角色 + * + * 注意,角色使用的是 SysRoleDO 的 code 标识 + * + * @param role 角色 + * @return 是否 + */ + boolean hasRole(String role); + + /** + * 判断是否有角色,任一一个即可 + * + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(String... roles); + + /** + * 判断是否有授权 + * + * @param scope 授权 + * @return 是否 + */ + boolean hasScope(String scope); + + /** + * 判断是否有授权范围,任一一个即可 + * + * @param scope 授权范围数组 + * @return 是否 + */ + boolean hasAnyScopes(String... scope); +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java new file mode 100644 index 0000000..f9e319d --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java @@ -0,0 +1,65 @@ +package com.win.framework.security.core.service; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.api.permission.PermissionApi; +import lombok.AllArgsConstructor; + +import java.util.Arrays; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 默认的 {@link SecurityFrameworkService} 实现类 + * + * @author 芋道源码 + */ +@AllArgsConstructor +public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { + + private final PermissionApi permissionApi; + + @Override + public boolean hasPermission(String permission) { + return hasAnyPermissions(permission); + } + + @Override + public boolean hasAnyPermissions(String... permissions) { + Long userId = getLoginUserId(); + if (userId == null) { + return false; + } + return permissionApi.hasAnyPermissions(userId, permissions); + } + + @Override + public boolean hasRole(String role) { + return hasAnyRoles(role); + } + + @Override + public boolean hasAnyRoles(String... roles) { + Long userId = getLoginUserId(); + if (userId == null) { + return false; + } + return permissionApi.hasAnyRoles(userId, roles); + } + + @Override + public boolean hasScope(String scope) { + return hasAnyScopes(scope); + } + + @Override + public boolean hasAnyScopes(String... scope) { + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if (user == null) { + return false; + } + return CollUtil.containsAny(user.getScopes(), Arrays.asList(scope)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java new file mode 100644 index 0000000..d744ff6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java @@ -0,0 +1,140 @@ +package com.win.framework.security.core.util; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.security.core.LoginUser; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.lang.Nullable; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.util.StringUtils; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.Collections; + +/** + * 安全服务工具类 + * + * @author 芋道源码 + */ +public class SecurityFrameworkUtils { + + /** + * HEADER 认证头 value 的前缀 + */ + public static final String AUTHORIZATION_BEARER = "Bearer"; + + private SecurityFrameworkUtils() {} + + /** + * 从请求中,获得认证 Token + * + * @param request 请求 + * @param headerName 认证 Token 对应的 Header 名字 + * @param parameterName 认证 Token 对应的 Parameter 名字 + * @return 认证 Token + */ + public static String obtainAuthorization(HttpServletRequest request, + String headerName, String parameterName) { + // 1. 获得 Token。优先级:Header > Parameter + String token = request.getHeader(headerName); + if (StrUtil.isEmpty(token)) { + token = request.getParameter(parameterName); + } + if (!StringUtils.hasText(token)) { + return null; + } + // 2. 去除 Token 中带的 Bearer + int index = token.indexOf(AUTHORIZATION_BEARER + " "); + return index >= 0 ? token.substring(index + 7).trim() : token; + } + + /** + * 获得当前认证信息 + * + * @return 认证信息 + */ + public static Authentication getAuthentication() { + SecurityContext context = SecurityContextHolder.getContext(); + if (context == null) { + return null; + } + return context.getAuthentication(); + } + + /** + * 获取当前用户 + * + * @return 当前用户 + */ + @Nullable + public static LoginUser getLoginUser() { + Authentication authentication = getAuthentication(); + if (authentication == null) { + return null; + } + return authentication.getPrincipal() instanceof LoginUser ? (LoginUser) authentication.getPrincipal() : null; + } + + /** + * 获得当前用户的编号,从上下文中 + * + * @return 用户编号 + */ + @Nullable + public static Long getLoginUserId() { + LoginUser loginUser = getLoginUser(); + return loginUser != null ? loginUser.getId() : null; + } + + /** + * 获得当前用户的昵称,从上下文中 + * + * @return 昵称 + */ + @Nullable + public static String getLoginUserNickname() { + LoginUser loginUser = getLoginUser(); + return loginUser != null ? MapUtil.getStr(loginUser.getInfo(), LoginUser.INFO_KEY_NICKNAME) : null; + } + + /** + * 获得当前用户的部门编号,从上下文中 + * + * @return 部门编号 + */ + @Nullable + public static Long getLoginUserDeptId() { + LoginUser loginUser = getLoginUser(); + return loginUser != null ? MapUtil.getLong(loginUser.getInfo(), LoginUser.INFO_KEY_DEPT_ID) : null; + } + + /** + * 设置当前用户 + * + * @param loginUser 登录用户 + * @param request 请求 + */ + public static void setLoginUser(LoginUser loginUser, HttpServletRequest request) { + // 创建 Authentication,并设置到上下文 + Authentication authentication = buildAuthentication(loginUser, request); + SecurityContextHolder.getContext().setAuthentication(authentication); + + // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号; + // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息 + WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); + WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType()); + } + + private static Authentication buildAuthentication(LoginUser loginUser, HttpServletRequest request) { + // 创建 UsernamePasswordAuthenticationToken 对象 + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginUser, null, Collections.emptyList()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + return authenticationToken; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java new file mode 100644 index 0000000..ade6ce0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java @@ -0,0 +1,7 @@ +/** + * 基于 Spring Security 框架 + * 实现安全认证功能 + * + * @author 芋道源码 + */ +package com.win.framework.security; diff --git a/win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..6253e90 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.win.framework.security.config.WinSecurityAutoConfiguration +com.win.framework.security.config.WinWebSecurityConfigurerAdapter +com.win.framework.operatelog.config.WinOperateLogConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md b/win-framework/win-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md new file mode 100644 index 0000000..e42ca54 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md @@ -0,0 +1,2 @@ +* 芋道 Spring Security 入门: +* Spring Security 基本概念: diff --git a/win-framework/win-spring-boot-starter-web/pom.xml b/win-framework/win-spring-boot-starter-web/pom.xml new file mode 100644 index 0000000..80e0b3c --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/pom.xml @@ -0,0 +1,87 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-web + jar + + ${project.artifactId} + Web 框架,全局异常、API 日志、脱敏、错误码等 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.aspectj + aspectjweaver + provided + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + org.springdoc + springdoc-openapi-starter-webmvc-api + + + + org.springframework.security + spring-security-core + provided + + + + + com.win + win-module-infra-api + ${revision} + + + com.win + win-module-system-api + ${revision} + + + + + org.jsoup + jsoup + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.mockito + mockito-inline + test + + + + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java new file mode 100644 index 0000000..4d307c5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java @@ -0,0 +1,44 @@ +package com.win.framework.apilog.config; + +import com.win.framework.apilog.core.filter.ApiAccessLogFilter; +import com.win.framework.apilog.core.interceptor.ApiAccessLogInterceptor; +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.config.WinWebAutoConfiguration; +import com.win.module.infra.api.logger.ApiAccessLogApi; +import jakarta.servlet.Filter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@AutoConfiguration(after = WinWebAutoConfiguration.class) +public class WinApiLogAutoConfiguration implements WebMvcConfigurer { + + /** + * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 + */ + @Bean + @ConditionalOnProperty(prefix = "win.access-log", value = "enable", matchIfMissing = true) // 允许使用 win.access-log.enable=false 禁用访问日志 + public FilterRegistrationBean apiAccessLogFilter(WebProperties webProperties, + @Value("${spring.application.name}") String applicationName, + ApiAccessLogApi apiAccessLogApi) { + ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogApi); + return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); + } + + private static FilterRegistrationBean createFilterBean(T filter, Integer order) { + FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); + bean.setOrder(order); + return bean; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new ApiAccessLogInterceptor()); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/annotation/ApiAccessLog.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/annotation/ApiAccessLog.java new file mode 100644 index 0000000..2a081e9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/annotation/ApiAccessLog.java @@ -0,0 +1,65 @@ +package com.win.framework.apilog.core.annotation; + +import com.win.framework.apilog.core.enums.OperateTypeEnum; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 访问日志注解 + * + * @author 芋道源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiAccessLog { + + // ========== 开关字段 ========== + + /** + * 是否记录访问日志 + */ + boolean enable() default true; + /** + * 是否记录请求参数 + * + * 默认记录,主要考虑请求数据一般不大。可手动设置为 false 进行关闭 + */ + boolean requestEnable() default true; + /** + * 是否记录响应结果 + * + * 默认不记录,主要考虑响应数据可能比较大。可手动设置为 true 进行打开 + */ + boolean responseEnable() default false; + /** + * 敏感参数数组 + * + * 添加后,请求参数、响应结果不会记录该参数 + */ + String[] sanitizeKeys() default {}; + + // ========== 模块字段 ========== + + /** + * 操作模块 + * + * 为空时,会尝试读取 {@link io.swagger.v3.oas.annotations.tags.Tag#name()} 属性 + */ + String operateModule() default ""; + /** + * 操作名 + * + * 为空时,会尝试读取 {@link io.swagger.v3.oas.annotations.Operation#summary()} 属性 + */ + String operateName() default ""; + /** + * 操作分类 + * + * 实际并不是数组,因为枚举不能设置 null 作为默认值 + */ + OperateTypeEnum[] operateType() default {}; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/enums/OperateTypeEnum.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/enums/OperateTypeEnum.java new file mode 100644 index 0000000..70fda87 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/enums/OperateTypeEnum.java @@ -0,0 +1,51 @@ +package com.win.framework.apilog.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 操作日志的操作类型 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum OperateTypeEnum { + + /** + * 查询 + */ + GET(1), + /** + * 新增 + */ + CREATE(2), + /** + * 修改 + */ + UPDATE(3), + /** + * 删除 + */ + DELETE(4), + /** + * 导出 + */ + EXPORT(5), + /** + * 导入 + */ + IMPORT(6), + /** + * 其它 + * + * 在无法归类时,可以选择使用其它。因为还有操作名可以进一步标识 + */ + OTHER(0); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java new file mode 100644 index 0000000..ed8627b --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -0,0 +1,250 @@ +package com.win.framework.apilog.core.filter; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.apilog.core.enums.OperateTypeEnum; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.core.filter.ApiRequestFilter; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.win.module.infra.api.logger.ApiAccessLogApi; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.fasterxml.jackson.databind.JsonNode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.method.HandlerMethod; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Iterator; +import java.util.Map; + +import static com.win.framework.apilog.core.interceptor.ApiAccessLogInterceptor.ATTRIBUTE_HANDLER_METHOD; +import static com.win.framework.common.util.json.JsonUtils.toJsonString; + +/** + * API 访问日志 Filter + * + * 目的:记录 API 访问日志到数据库中 + * + * @author 芋道源码 + */ +@Slf4j +public class ApiAccessLogFilter extends ApiRequestFilter { + + private static final String[] SANITIZE_KEYS = new String[]{"password", "token", "accessToken", "refreshToken"}; + + private final String applicationName; + + private final ApiAccessLogApi apiAccessLogApi; + + public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogApi apiAccessLogApi) { + super(webProperties); + this.applicationName = applicationName; + this.apiAccessLogApi = apiAccessLogApi; + } + + @Override + @SuppressWarnings("NullableProblems") + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + // 获得开始时间 + LocalDateTime beginTime = LocalDateTime.now(); + // 提前获得参数,避免 XssFilter 过滤处理 + Map queryString = ServletUtils.getParamMap(request); + String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null; + + try { + // 继续过滤器 + filterChain.doFilter(request, response); + // 正常执行,记录日志 + createApiAccessLog(request, beginTime, queryString, requestBody, null); + } catch (Exception ex) { + // 异常执行,记录日志 + createApiAccessLog(request, beginTime, queryString, requestBody, ex); + throw ex; + } + } + + private void createApiAccessLog(HttpServletRequest request, LocalDateTime beginTime, + Map queryString, String requestBody, Exception ex) { + ApiAccessLogCreateReqDTO accessLog = new ApiAccessLogCreateReqDTO(); + try { + boolean enable = buildApiAccessLog(accessLog, request, beginTime, queryString, requestBody, ex); + if (!enable) { + return; + } + apiAccessLogApi.createApiAccessLogAsync(accessLog); + } catch (Throwable th) { + log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); + } + } + + private boolean buildApiAccessLog(ApiAccessLogCreateReqDTO accessLog, HttpServletRequest request, LocalDateTime beginTime, + Map queryString, String requestBody, Exception ex) { + // 判断:是否要记录操作日志 + HandlerMethod handlerMethod = (HandlerMethod) request.getAttribute(ATTRIBUTE_HANDLER_METHOD); + ApiAccessLog accessLogAnnotation = null; + if (handlerMethod != null) { + accessLogAnnotation = handlerMethod.getMethodAnnotation(ApiAccessLog.class); + if (accessLogAnnotation != null && BooleanUtil.isFalse(accessLogAnnotation.enable())) { + return false; + } + } + + // 处理用户信息 + accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request)) + .setUserType(WebFrameworkUtils.getLoginUserType(request)); + // 设置访问结果 + CommonResult result = WebFrameworkUtils.getCommonResult(request); + if (result != null) { + accessLog.setResultCode(result.getCode()).setResultMsg(result.getMsg()); + } else if (ex != null) { + accessLog.setResultCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode()) + .setResultMsg(ExceptionUtil.getRootCauseMessage(ex)); + } else { + accessLog.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()).setResultMsg(""); + } + // 设置请求字段 + accessLog.setTraceId(TracerUtils.getTraceId()).setApplicationName(applicationName) + .setRequestUrl(request.getRequestURI()).setRequestMethod(request.getMethod()) + .setUserAgent(ServletUtils.getUserAgent(request)).setUserIp(ServletUtils.getClientIP(request)); + String[] sanitizeKeys = accessLogAnnotation != null ? accessLogAnnotation.sanitizeKeys() : null; + Boolean requestEnable = accessLogAnnotation != null ? accessLogAnnotation.requestEnable() : Boolean.TRUE; + if (!BooleanUtil.isFalse(requestEnable)) { // 默认记录,所以判断 !false + Map requestParams = MapUtil.builder() + .put("query", sanitizeMap(queryString, sanitizeKeys)) + .put("body", sanitizeJson(requestBody, sanitizeKeys)).build(); + accessLog.setRequestParams(toJsonString(requestParams)); + } + Boolean responseEnable = accessLogAnnotation != null ? accessLogAnnotation.responseEnable() : Boolean.FALSE; + if (BooleanUtil.isTrue(responseEnable)) { // 默认不记录,默认强制要求 true + accessLog.setResponseBody(sanitizeJson(result, sanitizeKeys)); + } + // 持续时间 + accessLog.setBeginTime(beginTime).setEndTime(LocalDateTime.now()) + .setDuration((int) LocalDateTimeUtil.between(accessLog.getBeginTime(), accessLog.getEndTime(), ChronoUnit.MILLIS)); + + // 操作模块 + if (handlerMethod != null) { + Tag tagAnnotation = handlerMethod.getBeanType().getAnnotation(Tag.class); + Operation operationAnnotation = handlerMethod.getMethodAnnotation(Operation.class); + String operateModule = accessLogAnnotation != null ? accessLogAnnotation.operateModule() : + tagAnnotation != null ? StrUtil.nullToDefault(tagAnnotation.name(), tagAnnotation.description()) : null; + String operateName = accessLogAnnotation != null ? accessLogAnnotation.operateName() : + operationAnnotation != null ? operationAnnotation.summary() : null; + OperateTypeEnum operateType = accessLogAnnotation != null && accessLogAnnotation.operateType().length > 0 ? + accessLogAnnotation.operateType()[0] : parseOperateLogType(request); + accessLog.setOperateModule(operateModule).setOperateName(operateName).setOperateType(operateType.getType()); + } + return true; + } + + // ========== 解析 @ApiAccessLog、@Swagger 注解 ========== + + private static OperateTypeEnum parseOperateLogType(HttpServletRequest request) { + RequestMethod requestMethod = RequestMethod.resolve(request.getMethod()); + if (requestMethod == null) { + return OperateTypeEnum.OTHER; + } + switch (requestMethod) { + case GET: + return OperateTypeEnum.GET; + case POST: + return OperateTypeEnum.CREATE; + case PUT: + return OperateTypeEnum.UPDATE; + case DELETE: + return OperateTypeEnum.DELETE; + default: + return OperateTypeEnum.OTHER; + } + } + + // ========== 请求和响应的脱敏逻辑,移除类似 password、token 等敏感字段 ========== + + private static String sanitizeMap(Map map, String[] sanitizeKeys) { + if (CollUtil.isEmpty(map)) { + return null; + } + if (sanitizeKeys != null) { + MapUtil.removeAny(map, sanitizeKeys); + } + MapUtil.removeAny(map, SANITIZE_KEYS); + return JsonUtils.toJsonString(map); + } + + private static String sanitizeJson(String jsonString, String[] sanitizeKeys) { + if (StrUtil.isEmpty(jsonString)) { + return null; + } + try { + JsonNode rootNode = JsonUtils.parseTree(jsonString); + sanitizeJson(rootNode, sanitizeKeys); + return JsonUtils.toJsonString(rootNode); + } catch (Exception e) { + // 脱敏失败的情况下,直接忽略异常,避免影响用户请求 + log.error("[sanitizeJson][脱敏({}) 发生异常]", jsonString, e); + return jsonString; + } + } + + private static String sanitizeJson(CommonResult commonResult, String[] sanitizeKeys) { + if (commonResult == null) { + return null; + } + String jsonString = toJsonString(commonResult); + try { + JsonNode rootNode = JsonUtils.parseTree(jsonString); + sanitizeJson(rootNode.get("data"), sanitizeKeys); // 只处理 data 字段,不处理 code、msg 字段,避免错误被脱敏掉 + return JsonUtils.toJsonString(rootNode); + } catch (Exception e) { + // 脱敏失败的情况下,直接忽略异常,避免影响用户请求 + log.error("[sanitizeJson][脱敏({}) 发生异常]", jsonString, e); + return jsonString; + } + } + + private static void sanitizeJson(JsonNode node, String[] sanitizeKeys) { + // 情况一:数组,遍历处理 + if (node.isArray()) { + for (JsonNode childNode : node) { + sanitizeJson(childNode, sanitizeKeys); + } + return; + } + // 情况二:非 Object,只是某个值,直接返回 + if (!node.isObject()) { + return; + } + // 情况三:Object,遍历处理 + Iterator> iterator = node.properties().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (ArrayUtil.contains(sanitizeKeys, entry.getKey()) + || ArrayUtil.contains(SANITIZE_KEYS, entry.getKey())) { + iterator.remove(); + continue; + } + sanitizeJson(entry.getValue(), sanitizeKeys); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java new file mode 100644 index 0000000..40f471c --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java @@ -0,0 +1,103 @@ +package com.win.framework.apilog.core.interceptor; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.common.util.spring.SpringUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StopWatch; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.IntStream; + +/** + * API 访问日志 Interceptor + * + * 目的:在非 prod 环境时,打印 request 和 response 两条日志到日志文件(控制台)中。 + * + * @author 芋道源码 + */ +@Slf4j +public class ApiAccessLogInterceptor implements HandlerInterceptor { + + public static final String ATTRIBUTE_HANDLER_METHOD = "HANDLER_METHOD"; + + private static final String ATTRIBUTE_STOP_WATCH = "ApiAccessLogInterceptor.StopWatch"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + // 记录 HandlerMethod,提供给 ApiAccessLogFilter 使用 + HandlerMethod handlerMethod = handler instanceof HandlerMethod ? (HandlerMethod) handler : null; + if (handlerMethod != null) { + request.setAttribute(ATTRIBUTE_HANDLER_METHOD, handlerMethod); + } + + // 打印 request 日志 + if (!SpringUtils.isProd()) { + Map queryString = ServletUtils.getParamMap(request); + String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null; + if (CollUtil.isEmpty(queryString) && StrUtil.isEmpty(requestBody)) { + log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI()); + } else { + log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(), + StrUtil.blankToDefault(requestBody, queryString.toString())); + } + // 计时 + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + request.setAttribute(ATTRIBUTE_STOP_WATCH, stopWatch); + // 打印 Controller 路径 + printHandlerMethodPosition(handlerMethod); + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + // 打印 response 日志 + if (!SpringUtils.isProd()) { + StopWatch stopWatch = (StopWatch) request.getAttribute(ATTRIBUTE_STOP_WATCH); + stopWatch.stop(); + log.info("[afterCompletion][完成请求 URL({}) 耗时({} ms)]", + request.getRequestURI(), stopWatch.getTotalTimeMillis()); + } + } + + /** + * 打印 Controller 方法路径 + */ + private void printHandlerMethodPosition(HandlerMethod handlerMethod) { + if (handlerMethod == null) { + return; + } + Method method = handlerMethod.getMethod(); + Class clazz = method.getDeclaringClass(); + try { + // 获取 method 的 lineNumber + List clazzContents = FileUtil.readUtf8Lines( + ResourceUtil.getResource(null, clazz).getPath().replace("/target/classes/", "/src/main/java/") + + clazz.getSimpleName() + ".java"); + Optional lineNumber = IntStream.range(0, clazzContents.size()) + .filter(i -> clazzContents.get(i).contains(" " + method.getName() + "(")) // 简单匹配,不考虑方法重名 + .mapToObj(i -> i + 1) // 行号从 1 开始 + .findFirst(); + if (!lineNumber.isPresent()) { + return; + } + // 打印结果 + System.out.printf("\tController 方法路径:%s(%s.java:%d)\n", clazz.getName(), clazz.getSimpleName(), lineNumber.get()); + } catch (Exception ignore) { + // 忽略异常。原因:仅仅打印,非重要逻辑 + } + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java new file mode 100644 index 0000000..df97937 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java @@ -0,0 +1,8 @@ +/** + * API 日志:包含两类 + * 1. API 访问日志:记录用户访问 API 的访问日志,定期归档历史日志。 + * 2. 异常日志:记录用户访问 API 的系统异常,方便日常排查问题与告警。 + * + * @author 芋道源码 + */ +package com.win.framework.apilog; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java new file mode 100644 index 0000000..58012af --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java @@ -0,0 +1,20 @@ +package com.win.framework.banner.config; + +import com.win.framework.banner.core.BannerApplicationRunner; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +/** + * Banner 的自动配置类 + * + * @author 芋道源码 + */ +@AutoConfiguration +public class WinBannerAutoConfiguration { + + @Bean + public BannerApplicationRunner bannerApplicationRunner() { + return new BannerApplicationRunner(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java new file mode 100644 index 0000000..cc73a5d --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java @@ -0,0 +1,76 @@ +package com.win.framework.banner.core; + +import cn.hutool.core.thread.ThreadUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.util.ClassUtils; + +import java.util.concurrent.TimeUnit; + +/** + * 项目启动成功后,提供文档相关的地址 + * + * @author 芋道源码 + */ +@Slf4j +public class BannerApplicationRunner implements ApplicationRunner { + + @Override + public void run(ApplicationArguments args) { + ThreadUtil.execute(() -> { + ThreadUtil.sleep(1, TimeUnit.SECONDS); // 延迟 1 秒,保证输出到结尾 + log.info("\n----------------------------------------------------------\n\t" + + "项目启动成功!\n\t" + + "接口文档: \t{} \n\t" + + "开发文档: \t{} \n\t" + + "视频教程: \t{} \n" + + "----------------------------------------------------------", + "https://doc.iocoder.cn/api-doc/", + "https://doc.iocoder.cn", + "https://t.zsxq.com/02Yf6M7Qn"); + + // 数据报表 + if (isNotPresent("com.win.module.report.framework.security.config.SecurityConfiguration")) { + System.out.println("[报表模块 win-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]"); + } + // 工作流 + if (isNotPresent("com.win.module.bpm.framework.flowable.config.BpmFlowableConfiguration")) { + System.out.println("[工作流模块 win-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); + } + // 商城系统 + if (isNotPresent("com.win.module.trade.framework.web.config.TradeWebConfiguration")) { + System.out.println("[商城系统 win-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); + } + // ERP 系统 + if (isNotPresent("com.win.module.erp.framework.web.config.ErpWebConfiguration")) { + System.out.println("[ERP 系统 win-module-erp - 已禁用][参考 https://doc.iocoder.cn/erp/build/ 开启]"); + } + // CRM 系统 + if (isNotPresent("com.win.module.crm.framework.web.config.CrmWebConfiguration")) { + System.out.println("[CRM 系统 win-module-crm - 已禁用][参考 https://doc.iocoder.cn/crm/build/ 开启]"); + } + // 微信公众号 + if (isNotPresent("com.win.module.mp.framework.mp.config.MpConfiguration")) { + System.out.println("[微信公众号 win-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]"); + } + // 支付平台 + if (isNotPresent("com.win.module.pay.framework.pay.config.PayConfiguration")) { + System.out.println("[支付系统 win-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]"); + } + // AI 大模型 + if (isNotPresent("com.win.module.ai.framework.web.config.AiWebConfiguration")) { + System.out.println("[AI 大模型 win-module-ai - 已禁用][参考 https://doc.iocoder.cn/ai/build/ 开启]"); + } + // IOT 物联网 + if (isNotPresent("com.win.module.iot.framework.web.config.IotWebConfiguration")) { + System.out.println("[IOT 物联网 win-module-iot - 已禁用][参考 https://doc.iocoder.cn/iot/build/ 开启]"); + } + }); + } + + private static boolean isNotPresent(String className) { + return !ClassUtils.isPresent(className, ClassUtils.getDefaultClassLoader()); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/package-info.java new file mode 100644 index 0000000..72ceca5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/banner/package-info.java @@ -0,0 +1,6 @@ +/** + * Banner 用于在 console 控制台,打印开发文档、接口文档等 + * + * @author 芋道源码 + */ +package com.win.framework.banner; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java new file mode 100644 index 0000000..f70f9c4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java @@ -0,0 +1,32 @@ +package com.win.framework.desensitize.core.base.annotation; + +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; +import com.win.framework.desensitize.core.base.serializer.StringDesensitizeSerializer; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 顶级脱敏注解,自定义注解需要使用此注解 + * + * @author gaibu + */ +@Documented +@Target(ElementType.ANNOTATION_TYPE) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside // 此注解是其他所有 jackson 注解的元注解,打上了此注解的注解表明是 jackson 注解的一部分 +@JsonSerialize(using = StringDesensitizeSerializer.class) // 指定序列化器 +public @interface DesensitizeBy { + + /** + * 脱敏处理器 + */ + @SuppressWarnings("rawtypes") + Class handler(); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java new file mode 100644 index 0000000..09838d1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.base.handler; + +import cn.hutool.core.util.ReflectUtil; + +import java.lang.annotation.Annotation; + +/** + * 脱敏处理器接口 + * + * @author gaibu + */ +public interface DesensitizationHandler { + + /** + * 脱敏 + * + * @param origin 原始字符串 + * @param annotation 注解信息 + * @return 脱敏后的字符串 + */ + String desensitize(String origin, T annotation); + + /** + * 是否禁用脱敏的 Spring EL 表达式 + * + * 如果返回 true 则跳过脱敏 + * + * @param annotation 注解信息 + * @return 是否禁用脱敏的 Spring EL 表达式 + */ + default String getDisable(T annotation) { + // 约定:默认就是 enable() 属性。如果不符合,子类重写 + try { + return (String) ReflectUtil.invoke(annotation, "disable"); + } catch (Exception ex) { + return ""; + } + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java new file mode 100644 index 0000000..2050129 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java @@ -0,0 +1,92 @@ +package com.win.framework.desensitize.core.base.serializer; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.lang.Singleton; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import lombok.Getter; +import lombok.Setter; + +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; + +/** + * 脱敏序列化器 + * + * 实现 JSON 返回数据时,使用 {@link DesensitizationHandler} 对声明脱敏注解的字段,进行脱敏处理。 + * + * @author gaibu + */ +@SuppressWarnings("rawtypes") +public class StringDesensitizeSerializer extends StdSerializer implements ContextualSerializer { + + @Getter + @Setter + private DesensitizationHandler desensitizationHandler; + + protected StringDesensitizeSerializer() { + super(String.class); + } + + @Override + public JsonSerializer createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) { + DesensitizeBy annotation = beanProperty.getAnnotation(DesensitizeBy.class); + if (annotation == null) { + return this; + } + // 创建一个 StringDesensitizeSerializer 对象,使用 DesensitizeBy 对应的处理器 + StringDesensitizeSerializer serializer = new StringDesensitizeSerializer(); + serializer.setDesensitizationHandler(Singleton.get(annotation.handler())); + return serializer; + } + + @Override + @SuppressWarnings("unchecked") + public void serialize(String value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { + if (StrUtil.isBlank(value)) { + gen.writeNull(); + return; + } + // 获取序列化字段 + Field field = getField(gen); + + // 自定义处理器 + DesensitizeBy[] annotations = AnnotationUtil.getCombinationAnnotations(field, DesensitizeBy.class); + if (ArrayUtil.isEmpty(annotations)) { + gen.writeString(value); + return; + } + for (Annotation annotation : field.getAnnotations()) { + if (AnnotationUtil.hasAnnotation(annotation.annotationType(), DesensitizeBy.class)) { + value = this.desensitizationHandler.desensitize(value, annotation); + gen.writeString(value); + return; + } + } + gen.writeString(value); + } + + /** + * 获取字段 + * + * @param generator JsonGenerator + * @return 字段 + */ + private Field getField(JsonGenerator generator) { + String currentName = generator.getOutputContext().getCurrentName(); + Object currentValue = generator.getCurrentValue(); + Class currentValueClass = currentValue.getClass(); + return ReflectUtil.getField(currentValueClass, currentName); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java new file mode 100644 index 0000000..f7eb61d --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java @@ -0,0 +1,44 @@ +package com.win.framework.desensitize.core.regex.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.regex.handler.EmailDesensitizationHandler; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 邮箱脱敏注解 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = EmailDesensitizationHandler.class) +public @interface EmailDesensitize { + + /** + * 匹配的正则表达式 + */ + String regex() default "(^.)[^@]*(@.*$)"; + + /** + * 替换规则,邮箱; + * + * 比如:example@gmail.com 脱敏之后为 e****@gmail.com + */ + String replacer() default "$1****$2"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java new file mode 100644 index 0000000..79bc1ed --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java @@ -0,0 +1,46 @@ +package com.win.framework.desensitize.core.regex.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.regex.handler.DefaultRegexDesensitizationHandler; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 正则脱敏注解 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = DefaultRegexDesensitizationHandler.class) +public @interface RegexDesensitize { + + /** + * 匹配的正则表达式(默认匹配所有) + */ + String regex() default "^[\\s\\S]*$"; + + /** + * 替换规则,会将匹配到的字符串全部替换成 replacer + * + * 例如:regex=123; replacer=****** + * 原始字符串 123456789 + * 脱敏后字符串 ******456789 + */ + String replacer() default "******"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java new file mode 100644 index 0000000..10c7d83 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java @@ -0,0 +1,46 @@ +package com.win.framework.desensitize.core.regex.handler; + +import com.win.framework.common.util.spring.SpringExpressionUtils; +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; + +import java.lang.annotation.Annotation; + +/** + * 正则表达式脱敏处理器抽象类,已实现通用的方法 + * + * @author gaibu + */ +public abstract class AbstractRegexDesensitizationHandler + implements DesensitizationHandler { + + @Override + public String desensitize(String origin, T annotation) { + // 1. 判断是否禁用脱敏 + Object disable = SpringExpressionUtils.parseExpression(getDisable(annotation)); + if (Boolean.TRUE.equals(disable)) { + return origin; + } + + // 2. 执行脱敏 + String regex = getRegex(annotation); + String replacer = getReplacer(annotation); + return origin.replaceAll(regex, replacer); + } + + /** + * 获取注解上的 regex 参数 + * + * @param annotation 注解信息 + * @return 正则表达式 + */ + abstract String getRegex(T annotation); + + /** + * 获取注解上的 replacer 参数 + * + * @param annotation 注解信息 + * @return 待替换的字符串 + */ + abstract String getReplacer(T annotation); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java new file mode 100644 index 0000000..c05a13e --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.regex.handler; + +import com.win.framework.desensitize.core.regex.annotation.RegexDesensitize; + +/** + * {@link RegexDesensitize} 的正则脱敏处理器 + * + * @author gaibu + */ +public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitizationHandler { + + @Override + String getRegex(RegexDesensitize annotation) { + return annotation.regex(); + } + + @Override + String getReplacer(RegexDesensitize annotation) { + return annotation.replacer(); + } + + @Override + public String getDisable(RegexDesensitize annotation) { + return annotation.disable(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java new file mode 100644 index 0000000..3872264 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java @@ -0,0 +1,22 @@ +package com.win.framework.desensitize.core.regex.handler; + +import com.win.framework.desensitize.core.regex.annotation.EmailDesensitize; + +/** + * {@link EmailDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class EmailDesensitizationHandler extends AbstractRegexDesensitizationHandler { + + @Override + String getRegex(EmailDesensitize annotation) { + return annotation.regex(); + } + + @Override + String getReplacer(EmailDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java new file mode 100644 index 0000000..6159238 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java @@ -0,0 +1,47 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.BankCardDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 银行卡号 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = BankCardDesensitization.class) +public @interface BankCardDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 6; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 2; + + /** + * 替换规则,银行卡号; 比如:9988002866797031 脱敏之后为 998800********31 + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java new file mode 100644 index 0000000..f6440de --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java @@ -0,0 +1,47 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.CarLicenseDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 车牌号 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = CarLicenseDesensitization.class) +public @interface CarLicenseDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 3; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 1; + + /** + * 替换规则,车牌号;比如:粤A66666 脱敏之后为粤A6***6 + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java new file mode 100644 index 0000000..f27f902 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java @@ -0,0 +1,47 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.ChineseNameDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 中文名 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = ChineseNameDesensitization.class) +public @interface ChineseNameDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 1; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 0; + + /** + * 替换规则,中文名;比如:刘子豪脱敏之后为刘** + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java new file mode 100644 index 0000000..35c8733 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java @@ -0,0 +1,47 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.FixedPhoneDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 固定电话 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = FixedPhoneDesensitization.class) +public @interface FixedPhoneDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 4; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 2; + + /** + * 替换规则,固定电话;比如:01086551122 脱敏之后为 0108*****22 + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java new file mode 100644 index 0000000..5d1cd1a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java @@ -0,0 +1,47 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.IdCardDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 身份证 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = IdCardDesensitization.class) +public @interface IdCardDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 6; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 2; + + /** + * 替换规则,身份证号码;比如:530321199204074611 脱敏之后为 530321**********11 + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java new file mode 100644 index 0000000..404a219 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java @@ -0,0 +1,47 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.MobileDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 手机号 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = MobileDesensitization.class) +public @interface MobileDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 3; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 4; + + /** + * 替换规则,手机号;比如:13248765917 脱敏之后为 132****5917 + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java new file mode 100644 index 0000000..15c4cb6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java @@ -0,0 +1,49 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.PasswordDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 密码 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = PasswordDesensitization.class) +public @interface PasswordDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 0; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 0; + + /** + * 替换规则,密码; + * + * 比如:123456 脱敏之后为 ****** + */ + String replacer() default "*"; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java new file mode 100644 index 0000000..ee817e5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java @@ -0,0 +1,51 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.DefaultDesensitizationHandler; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 滑动脱敏注解 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = DefaultDesensitizationHandler.class) +public @interface SliderDesensitize { + + /** + * 后缀保留长度 + */ + int suffixKeep() default 0; + + /** + * 替换规则,会将前缀后缀保留后,全部替换成 replacer + * + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*"; + * 原始字符串 123456 + * 脱敏后 1***56 + */ + String replacer() default "*"; + + /** + * 前缀保留长度 + */ + int prefixKeep() default 0; + + /** + * 是否禁用脱敏 + * + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 + */ + String disable() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java new file mode 100644 index 0000000..19ce484 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java @@ -0,0 +1,86 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.common.util.spring.SpringExpressionUtils; +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; + +import java.lang.annotation.Annotation; + +/** + * 滑动脱敏处理器抽象类,已实现通用的方法 + * + * @author gaibu + */ +public abstract class AbstractSliderDesensitizationHandler + implements DesensitizationHandler { + + @Override + public String desensitize(String origin, T annotation) { + // 1. 判断是否禁用脱敏 + Object disable = SpringExpressionUtils.parseExpression(getDisable(annotation)); + if (Boolean.FALSE.equals(disable)) { + return origin; + } + + // 2. 执行脱敏 + int prefixKeep = getPrefixKeep(annotation); + int suffixKeep = getSuffixKeep(annotation); + String replacer = getReplacer(annotation); + int length = origin.length(); + + // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换 + if (prefixKeep >= length || suffixKeep >= length) { + return buildReplacerByLength(replacer, length); + } + + // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换 + if ((prefixKeep + suffixKeep) >= length) { + return buildReplacerByLength(replacer, length); + } + + // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串 + int interval = length - prefixKeep - suffixKeep; + return origin.substring(0, prefixKeep) + + buildReplacerByLength(replacer, interval) + + origin.substring(prefixKeep + interval); + } + + /** + * 根据长度循环构建替换符 + * + * @param replacer 替换符 + * @param length 长度 + * @return 构建后的替换符 + */ + private String buildReplacerByLength(String replacer, int length) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < length; i++) { + builder.append(replacer); + } + return builder.toString(); + } + + /** + * 前缀保留长度 + * + * @param annotation 注解信息 + * @return 前缀保留长度 + */ + abstract Integer getPrefixKeep(T annotation); + + /** + * 后缀保留长度 + * + * @param annotation 注解信息 + * @return 后缀保留长度 + */ + abstract Integer getSuffixKeep(T annotation); + + /** + * 替换符 + * + * @param annotation 注解信息 + * @return 替换符 + */ + abstract String getReplacer(T annotation); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java new file mode 100644 index 0000000..49ad64a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java @@ -0,0 +1,32 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.BankCardDesensitize; + +/** + * {@link BankCardDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class BankCardDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(BankCardDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(BankCardDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(BankCardDesensitize annotation) { + return annotation.replacer(); + } + + @Override + public String getDisable(BankCardDesensitize annotation) { + return ""; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java new file mode 100644 index 0000000..24a0aab --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java @@ -0,0 +1,32 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.CarLicenseDesensitize; + +/** + * {@link CarLicenseDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class CarLicenseDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(CarLicenseDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(CarLicenseDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(CarLicenseDesensitize annotation) { + return annotation.replacer(); + } + + @Override + public String getDisable(CarLicenseDesensitize annotation) { + return annotation.disable(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java new file mode 100644 index 0000000..04eb5a4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.ChineseNameDesensitize; + +/** + * {@link ChineseNameDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class ChineseNameDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(ChineseNameDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(ChineseNameDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(ChineseNameDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java new file mode 100644 index 0000000..508e794 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.SliderDesensitize; + +/** + * {@link SliderDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class DefaultDesensitizationHandler extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(SliderDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(SliderDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(SliderDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java new file mode 100644 index 0000000..e97ae10 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.FixedPhoneDesensitize; + +/** + * {@link FixedPhoneDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(FixedPhoneDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(FixedPhoneDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(FixedPhoneDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java new file mode 100644 index 0000000..852eddd --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java @@ -0,0 +1,26 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.IdCardDesensitize; + +/** + * {@link IdCardDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class IdCardDesensitization extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(IdCardDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(IdCardDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(IdCardDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java new file mode 100644 index 0000000..2ec80f3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.MobileDesensitize; + +/** + * {@link MobileDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class MobileDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(MobileDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(MobileDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(MobileDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java new file mode 100644 index 0000000..9d4b5c2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java @@ -0,0 +1,26 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.PasswordDesensitize; + +/** + * {@link PasswordDesensitize} 的码脱敏处理器 + * + * @author gaibu + */ +public class PasswordDesensitization extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(PasswordDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(PasswordDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(PasswordDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/package-info.java new file mode 100644 index 0000000..9c6dcb9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/desensitize/package-info.java @@ -0,0 +1,4 @@ +/** + * 脱敏组件:支持 JSON 返回数据时,将邮箱、手机等字段进行脱敏 + */ +package com.win.framework.desensitize; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java new file mode 100644 index 0000000..d4f26a6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java @@ -0,0 +1,52 @@ +package com.win.framework.jackson.config; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.json.databind.NumberSerializer; +import com.win.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; +import com.win.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +@AutoConfiguration +@Slf4j +public class WinJacksonAutoConfiguration { + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public JsonUtils jsonUtils(List objectMappers) { + // 1.1 创建 SimpleModule 对象 + SimpleModule simpleModule = new SimpleModule(); + simpleModule + // 新增 Long 类型序列化规则,数值超过 2^53-1,在 JS 会出现精度丢失问题,因此 Long 自动序列化为字符串类型 + .addSerializer(Long.class, NumberSerializer.INSTANCE) + .addSerializer(Long.TYPE, NumberSerializer.INSTANCE) + .addSerializer(LocalDate.class, LocalDateSerializer.INSTANCE) + .addDeserializer(LocalDate.class, LocalDateDeserializer.INSTANCE) + .addSerializer(LocalTime.class, LocalTimeSerializer.INSTANCE) + .addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE) + // 新增 LocalDateTime 序列化、反序列化规则,使用 Long 时间戳 + .addSerializer(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE) + .addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE); + // 1.2 注册到 objectMapper + objectMappers.forEach(objectMapper -> objectMapper.registerModule(simpleModule)); + + // 2. 设置 objectMapper 到 JsonUtils + JsonUtils.init(CollUtil.getFirst(objectMappers)); + log.info("[init][初始化 JsonUtils 成功]"); + return new JsonUtils(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java new file mode 100644 index 0000000..d1951c2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java @@ -0,0 +1 @@ +package com.win.framework.jackson.core; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/package-info.java new file mode 100644 index 0000000..e00af68 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/package-info.java @@ -0,0 +1,4 @@ +/** + * Web 框架,全局异常、API 日志等 + */ +package com.win.framework; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java new file mode 100644 index 0000000..acf9a8f --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java @@ -0,0 +1,60 @@ +package com.win.framework.swagger.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import jakarta.validation.constraints.NotEmpty; + +/** + * Swagger 配置属性 + * + * @author 芋道源码 + */ +@ConfigurationProperties("win.swagger") +@Data +public class SwaggerProperties { + + /** + * 标题 + */ + @NotEmpty(message = "标题不能为空") + private String title; + /** + * 描述 + */ + @NotEmpty(message = "描述不能为空") + private String description; + /** + * 作者 + */ + @NotEmpty(message = "作者不能为空") + private String author; + /** + * 版本 + */ + @NotEmpty(message = "版本不能为空") + private String version; + /** + * url + */ + @NotEmpty(message = "扫描的 package 不能为空") + private String url; + /** + * email + */ + @NotEmpty(message = "扫描的 email 不能为空") + private String email; + + /** + * license + */ + @NotEmpty(message = "扫描的 license 不能为空") + private String license; + + /** + * license-url + */ + @NotEmpty(message = "扫描的 license-url 不能为空") + private String licenseUrl; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java new file mode 100644 index 0000000..37d55bb --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java @@ -0,0 +1,160 @@ +package com.win.framework.swagger.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.media.IntegerSchema; +import io.swagger.v3.oas.models.media.StringSchema; +import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springdoc.core.customizers.OpenApiBuilderCustomizer; +import org.springdoc.core.customizers.ServerBaseUrlCustomizer; +import org.springdoc.core.models.GroupedOpenApi; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springdoc.core.providers.JavadocProvider; +import org.springdoc.core.service.OpenAPIService; +import org.springdoc.core.service.SecurityService; +import org.springdoc.core.utils.PropertyResolverUtils; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.http.HttpHeaders; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * Swagger 自动配置类,基于 OpenAPI + Springdoc 实现。 + * + * 友情提示: + * 1. Springdoc 文档地址:仓库 + * 2. Swagger 规范,于 2015 更名为 OpenAPI 规范,本质是一个东西 + * + * @author 芋道源码 + */ +@AutoConfiguration +@ConditionalOnClass({OpenAPI.class}) +@EnableConfigurationProperties(SwaggerProperties.class) +@ConditionalOnProperty(prefix = "springdoc.api-docs", name = "enabled", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用 +public class WinSwaggerAutoConfiguration { + + // ========== 全局 OpenAPI 配置 ========== + + @Bean + public OpenAPI createApi(SwaggerProperties properties) { + Map securitySchemas = buildSecuritySchemes(); + OpenAPI openAPI = new OpenAPI() + // 接口信息 + .info(buildInfo(properties)) + // 接口安全配置 + .components(new Components().securitySchemes(securitySchemas)) + .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)); + securitySchemas.keySet().forEach(key -> openAPI.addSecurityItem(new SecurityRequirement().addList(key))); + return openAPI; + } + + /** + * API 摘要信息 + */ + private Info buildInfo(SwaggerProperties properties) { + return new Info() + .title(properties.getTitle()) + .description(properties.getDescription()) + .version(properties.getVersion()) + .contact(new Contact().name(properties.getAuthor()).url(properties.getUrl()).email(properties.getEmail())) + .license(new License().name(properties.getLicense()).url(properties.getLicenseUrl())); + } + + /** + * 安全模式,这里配置通过请求头 Authorization 传递 token 参数 + */ + private Map buildSecuritySchemes() { + Map securitySchemes = new HashMap<>(); + SecurityScheme securityScheme = new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) // 类型 + .name(HttpHeaders.AUTHORIZATION) // 请求头的 name + .in(SecurityScheme.In.HEADER); // token 所在位置 + securitySchemes.put(HttpHeaders.AUTHORIZATION, securityScheme); + return securitySchemes; + } + + /** + * 自定义 OpenAPI 处理器 + */ + @Bean + @Primary // 目的:以我们创建的 OpenAPIService Bean 为主,避免一键改包后,启动报错! + public OpenAPIService openApiBuilder(Optional openAPI, + SecurityService securityParser, + SpringDocConfigProperties springDocConfigProperties, + PropertyResolverUtils propertyResolverUtils, + Optional> openApiBuilderCustomizers, + Optional> serverBaseUrlCustomizers, + Optional javadocProvider) { + return new OpenAPIService(openAPI, securityParser, springDocConfigProperties, + propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); + } + + // ========== 分组 OpenAPI 配置 ========== + + /** + * 所有模块的 API 分组 + */ + @Bean + public GroupedOpenApi allGroupedOpenApi() { + return buildGroupedOpenApi("all", ""); + } + + public static GroupedOpenApi buildGroupedOpenApi(String group) { + return buildGroupedOpenApi(group, group); + } + + public static GroupedOpenApi buildGroupedOpenApi(String group, String path) { + return GroupedOpenApi.builder() + .group(group) + .pathsToMatch("/admin-api/" + path + "/**", "/app-api/" + path + "/**") + .addOperationCustomizer((operation, handlerMethod) -> operation + .addParametersItem(buildTenantHeaderParameter()) + .addParametersItem(buildSecurityHeaderParameter())) + .build(); + } + + /** + * 构建 Tenant 租户编号请求头参数 + * + * @return 多租户参数 + */ + private static Parameter buildTenantHeaderParameter() { + return new Parameter() + .name(HEADER_TENANT_ID) // header 名 + .description("租户编号") // 描述 + .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header + .schema(new IntegerSchema()._default(1L).name(HEADER_TENANT_ID).description("租户编号")); // 默认:使用租户编号为 1 + } + + /** + * 构建 Authorization 认证请求头参数 + * + * 解决 Knife4j Authorize 未生效,请求header里未包含参数 + * + * @return 认证参数 + */ + private static Parameter buildSecurityHeaderParameter() { + return new Parameter() + .name(HttpHeaders.AUTHORIZATION) // header 名 + .description("认证 Token") // 描述 + .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header + .schema(new StringSchema()._default("Bearer test1").name(HEADER_TENANT_ID).description("认证 Token")); // 默认:使用用户编号为 1 + } + +} + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java new file mode 100644 index 0000000..8fafb3b --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java @@ -0,0 +1,6 @@ +/** + * 基于 Swagger + Knife4j 实现 API 接口文档 + * + * @author 芋道源码 + */ +package com.win.framework.swagger; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java new file mode 100644 index 0000000..a560ac2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java @@ -0,0 +1,66 @@ +package com.win.framework.web.config; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@ConfigurationProperties(prefix = "win.web") +@Validated +@Data +public class WebProperties { + + @NotNull(message = "APP API 不能为空") + private Api appApi = new Api("/app-api", "**.controller.app.**"); + @NotNull(message = "Admin API 不能为空") + private Api adminApi = new Api("/admin-api", "**.controller.admin.**"); + + @NotNull(message = "Admin UI 不能为空") + private Ui adminUi; + + @Data + @AllArgsConstructor + @NoArgsConstructor + @Valid + public static class Api { + + /** + * API 前缀,实现所有 Controller 提供的 RESTFul API 的统一前缀 + * + * + * 意义:通过该前缀,避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部,带来安全性问题 + * 这样,Nginx 只需要配置转发到 /api/* 的所有接口即可。 + * + * @see WinWebAutoConfiguration#configurePathMatch(PathMatchConfigurer) + */ + @NotEmpty(message = "API 前缀不能为空") + private String prefix; + + /** + * Controller 所在包的 Ant 路径规则 + * + * 主要目的是,给该 Controller 设置指定的 {@link #prefix} + */ + @NotEmpty(message = "Controller 所在包不能为空") + private String controller; + + } + + @Data + @Valid + public static class Ui { + + /** + * 访问地址 + */ + private String url; + + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java new file mode 100644 index 0000000..9d459fa --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java @@ -0,0 +1,131 @@ +package com.win.framework.web.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.web.core.filter.CacheRequestBodyFilter; +import com.win.framework.web.core.filter.DemoFilter; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.framework.web.core.handler.GlobalResponseBodyHandler; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.win.module.infra.api.logger.ApiErrorLogApi; +import jakarta.annotation.Resource; +import jakarta.servlet.Filter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@AutoConfiguration +@EnableConfigurationProperties(WebProperties.class) +public class WinWebAutoConfiguration implements WebMvcConfigurer { + + @Resource + private WebProperties webProperties; + /** + * 应用名 + */ + @Value("${spring.application.name}") + private String applicationName; + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurePathMatch(configurer, webProperties.getAdminApi()); + configurePathMatch(configurer, webProperties.getAppApi()); + } + + /** + * 设置 API 前缀,仅仅匹配 controller 包下的 + * + * @param configurer 配置 + * @param api API 配置 + */ + private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) { + AntPathMatcher antPathMatcher = new AntPathMatcher("."); + configurer.addPathPrefix(api.getPrefix(), clazz -> clazz.isAnnotationPresent(RestController.class) + && antPathMatcher.match(api.getController(), clazz.getPackage().getName())); // 仅仅匹配 controller 包 + } + + @Bean + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") + public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogApi apiErrorLogApi) { + return new GlobalExceptionHandler(applicationName, apiErrorLogApi); + } + + @Bean + public GlobalResponseBodyHandler globalResponseBodyHandler() { + return new GlobalResponseBodyHandler(); + } + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public WebFrameworkUtils webFrameworkUtils(WebProperties webProperties) { + // 由于 WebFrameworkUtils 需要使用到 webProperties 属性,所以注册为一个 Bean + return new WebFrameworkUtils(webProperties); + } + + // ========== Filter 相关 ========== + + /** + * 创建 CorsFilter Bean,解决跨域问题 + */ + @Bean + public FilterRegistrationBean corsFilterBean() { + // 创建 CorsConfiguration 对象 + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOriginPattern("*"); // 设置访问源地址 + config.addAllowedHeader("*"); // 设置访问源请求头 + config.addAllowedMethod("*"); // 设置访问源请求方法 + // 创建 UrlBasedCorsConfigurationSource 对象 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); // 对接口配置跨域设置 + return createFilterBean(new CorsFilter(source), WebFilterOrderEnum.CORS_FILTER); + } + + /** + * 创建 RequestBodyCacheFilter Bean,可重复读取请求内容 + */ + @Bean + public FilterRegistrationBean requestBodyCacheFilter() { + return createFilterBean(new CacheRequestBodyFilter(), WebFilterOrderEnum.REQUEST_BODY_CACHE_FILTER); + } + + /** + * 创建 DemoFilter Bean,演示模式 + */ + @Bean + @ConditionalOnProperty(value = "win.demo", havingValue = "true") + public FilterRegistrationBean demoFilter() { + return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER); + } + + public static FilterRegistrationBean createFilterBean(T filter, Integer order) { + FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); + bean.setOrder(order); + return bean; + } + + /** + * 创建 RestTemplate 实例 + * + * @param restTemplateBuilder {@link RestTemplateAutoConfiguration#restTemplateBuilder} + */ + @Bean + @ConditionalOnMissingBean + public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { + return restTemplateBuilder.build(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java new file mode 100644 index 0000000..39be32f --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java @@ -0,0 +1,27 @@ +package com.win.framework.web.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.web.config.WebProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.http.HttpServletRequest; + +/** + * 过滤 /admin-api、/app-api 等 API 请求的过滤器 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public abstract class ApiRequestFilter extends OncePerRequestFilter { + + protected final WebProperties webProperties; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 只过滤 API 请求的地址 + return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAdminApi().getPrefix(), + webProperties.getAppApi().getPrefix()); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java new file mode 100644 index 0000000..ac92884 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java @@ -0,0 +1,31 @@ +package com.win.framework.web.core.filter; + +import com.win.framework.common.util.servlet.ServletUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Request Body 缓存 Filter,实现它的可重复读取 + * + * @author 芋道源码 + */ +public class CacheRequestBodyFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(new CacheRequestBodyWrapper(request), response); + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 只处理 json 请求内容 + return !ServletUtils.isJsonRequest(request); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java new file mode 100644 index 0000000..c1de5fe --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java @@ -0,0 +1,68 @@ +package com.win.framework.web.core.filter; + +import com.win.framework.common.util.servlet.ServletUtils; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Request Body 缓存 Wrapper + * + * @author 芋道源码 + */ +public class CacheRequestBodyWrapper extends HttpServletRequestWrapper { + + /** + * 缓存的内容 + */ + private final byte[] body; + + public CacheRequestBodyWrapper(HttpServletRequest request) { + super(request); + body = ServletUtils.getBodyBytes(request); + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream inputStream = new ByteArrayInputStream(body); + // 返回 ServletInputStream + return new ServletInputStream() { + + @Override + public int read() { + return inputStream.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) {} + + @Override + public int available() { + return body.length; + } + + }; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java new file mode 100644 index 0000000..79c49eb --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java @@ -0,0 +1,35 @@ +package com.win.framework.web.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.DEMO_DENY; + +/** + * 演示 Filter,禁止用户发起写操作,避免影响测试数据 + * + * @author 芋道源码 + */ +public class DemoFilter extends OncePerRequestFilter { + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String method = request.getMethod(); + return !StrUtil.equalsAnyIgnoreCase(method, "POST", "PUT", "DELETE") // 写操作时,不进行过滤率 + || WebFrameworkUtils.getLoginUserId(request) == null; // 非登录用户时,不进行过滤 + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { + // 直接返回 DEMO_DENY 的结果。即,请求不继续 + ServletUtils.writeJSON(response, CommonResult.error(DEMO_DENY)); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..8b867d4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java @@ -0,0 +1,390 @@ +package com.win.framework.web.core.handler; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.collection.SetUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.win.module.infra.api.logger.ApiErrorLogApi; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.ValidationException; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.util.Assert; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.NoHandlerFoundException; +import org.springframework.web.servlet.resource.NoResourceFoundException; + +import java.time.LocalDateTime; +import java.util.Map; +import java.util.Set; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.*; + +/** + * 全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 + * + * @author 芋道源码 + */ +@RestControllerAdvice +@AllArgsConstructor +@Slf4j +public class GlobalExceptionHandler { + + /** + * 忽略的 ServiceException 错误提示,避免打印过多 logger + */ + public static final Set IGNORE_ERROR_MESSAGES = SetUtils.asSet("无效的刷新令牌"); + + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") + private final String applicationName; + + private final ApiErrorLogApi apiErrorLogApi; + + /** + * 处理所有异常,主要是提供给 Filter 使用 + * 因为 Filter 不走 SpringMVC 的流程,但是我们又需要兜底处理异常,所以这里提供一个全量的异常处理过程,保持逻辑统一。 + * + * @param request 请求 + * @param ex 异常 + * @return 通用返回 + */ + public CommonResult allExceptionHandler(HttpServletRequest request, Throwable ex) { + if (ex instanceof MissingServletRequestParameterException) { + return missingServletRequestParameterExceptionHandler((MissingServletRequestParameterException) ex); + } + if (ex instanceof MethodArgumentTypeMismatchException) { + return methodArgumentTypeMismatchExceptionHandler((MethodArgumentTypeMismatchException) ex); + } + if (ex instanceof MethodArgumentNotValidException) { + return methodArgumentNotValidExceptionExceptionHandler((MethodArgumentNotValidException) ex); + } + if (ex instanceof BindException) { + return bindExceptionHandler((BindException) ex); + } + if (ex instanceof ConstraintViolationException) { + return constraintViolationExceptionHandler((ConstraintViolationException) ex); + } + if (ex instanceof ValidationException) { + return validationException((ValidationException) ex); + } + if (ex instanceof NoHandlerFoundException) { + return noHandlerFoundExceptionHandler((NoHandlerFoundException) ex); + } + if (ex instanceof NoResourceFoundException) { + return noResourceFoundExceptionHandler(request, (NoResourceFoundException) ex); + } + if (ex instanceof HttpRequestMethodNotSupportedException) { + return httpRequestMethodNotSupportedExceptionHandler((HttpRequestMethodNotSupportedException) ex); + } + if (ex instanceof ServiceException) { + return serviceExceptionHandler((ServiceException) ex); + } + if (ex instanceof AccessDeniedException) { + return accessDeniedExceptionHandler(request, (AccessDeniedException) ex); + } + return defaultExceptionHandler(request, ex); + } + + /** + * 处理 SpringMVC 请求参数缺失 + * + * 例如说,接口上设置了 @RequestParam("xx") 参数,结果并未传递 xx 参数 + */ + @ExceptionHandler(value = MissingServletRequestParameterException.class) + public CommonResult missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException ex) { + log.warn("[missingServletRequestParameterExceptionHandler]", ex); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数缺失:%s", ex.getParameterName())); + } + + /** + * 处理 SpringMVC 请求参数类型错误 + * + * 例如说,接口上设置了 @RequestParam("xx") 参数为 Integer,结果传递 xx 参数类型为 String + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public CommonResult methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) { + log.warn("[methodArgumentTypeMismatchExceptionHandler]", ex); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage())); + } + + /** + * 处理 SpringMVC 参数校验不正确 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public CommonResult methodArgumentNotValidExceptionExceptionHandler(MethodArgumentNotValidException ex) { + log.warn("[methodArgumentNotValidExceptionExceptionHandler]", ex); + FieldError fieldError = ex.getBindingResult().getFieldError(); + assert fieldError != null; // 断言,避免告警 + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage())); + } + + /** + * 处理 SpringMVC 参数绑定不正确,本质上也是通过 Validator 校验 + */ + @ExceptionHandler(BindException.class) + public CommonResult bindExceptionHandler(BindException ex) { + log.warn("[handleBindException]", ex); + FieldError fieldError = ex.getFieldError(); + assert fieldError != null; // 断言,避免告警 + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage())); + } + + /** + * 处理 SpringMVC 请求参数类型错误 + * + * 例如说,接口上设置了 @RequestBody实体中 xx 属性类型为 Integer,结果传递 xx 参数类型为 String + */ + @ExceptionHandler(HttpMessageNotReadableException.class) + public CommonResult methodArgumentTypeInvalidFormatExceptionHandler(HttpMessageNotReadableException ex) { + log.warn("[methodArgumentTypeInvalidFormatExceptionHandler]", ex); + if(ex.getCause() instanceof InvalidFormatException) { + InvalidFormatException invalidFormatException = (InvalidFormatException) ex.getCause(); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", invalidFormatException.getValue())); + }else { + return defaultExceptionHandler(ServletUtils.getRequest(), ex); + } + } + + /** + * 处理 Validator 校验不通过产生的异常 + */ + @ExceptionHandler(value = ConstraintViolationException.class) + public CommonResult constraintViolationExceptionHandler(ConstraintViolationException ex) { + log.warn("[constraintViolationExceptionHandler]", ex); + ConstraintViolation constraintViolation = ex.getConstraintViolations().iterator().next(); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", constraintViolation.getMessage())); + } + + /** + * 处理 Dubbo Consumer 本地参数校验时,抛出的 ValidationException 异常 + */ + @ExceptionHandler(value = ValidationException.class) + public CommonResult validationException(ValidationException ex) { + log.warn("[constraintViolationExceptionHandler]", ex); + // 无法拼接明细的错误信息,因为 Dubbo Consumer 抛出 ValidationException 异常时,是直接的字符串信息,且人类不可读 + return CommonResult.error(BAD_REQUEST); + } + + /** + * 处理 SpringMVC 请求地址不存在 + * + * 注意,它需要设置如下两个配置项: + * 1. spring.mvc.throw-exception-if-no-handler-found 为 true + * 2. spring.mvc.static-path-pattern 为 /statics/** + */ + @ExceptionHandler(NoHandlerFoundException.class) + public CommonResult noHandlerFoundExceptionHandler(NoHandlerFoundException ex) { + log.warn("[noHandlerFoundExceptionHandler]", ex); + return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL())); + } + + /** + * 处理 SpringMVC 请求地址不存在 + */ + @ExceptionHandler(NoResourceFoundException.class) + private CommonResult noResourceFoundExceptionHandler(HttpServletRequest req, NoResourceFoundException ex) { + log.warn("[noResourceFoundExceptionHandler]", ex); + return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getResourcePath())); + } + + /** + * 处理 SpringMVC 请求方法不正确 + * + * 例如说,A 接口的方法为 GET 方式,结果请求方法为 POST 方式,导致不匹配 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public CommonResult httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException ex) { + log.warn("[httpRequestMethodNotSupportedExceptionHandler]", ex); + return CommonResult.error(METHOD_NOT_ALLOWED.getCode(), String.format("请求方法不正确:%s", ex.getMessage())); + } + + /** + * 处理 Spring Security 权限不足的异常 + * + * 来源是,使用 @PreAuthorize 注解,AOP 进行权限拦截 + */ + @ExceptionHandler(value = AccessDeniedException.class) + public CommonResult accessDeniedExceptionHandler(HttpServletRequest req, AccessDeniedException ex) { + log.warn("[accessDeniedExceptionHandler][userId({}) 无法访问 url({})]", WebFrameworkUtils.getLoginUserId(req), + req.getRequestURL(), ex); + return CommonResult.error(FORBIDDEN); + } + + /** + * 处理业务异常 ServiceException + * + * 例如说,商品库存不足,用户手机号已存在。 + */ + @ExceptionHandler(value = ServiceException.class) + public CommonResult serviceExceptionHandler(ServiceException ex) { + // 不包含的时候,才进行打印,避免 ex 堆栈过多 + if (!IGNORE_ERROR_MESSAGES.contains(ex.getMessage())) { + // 即使打印,也只打印第一层 StackTraceElement,并且使用 warn 在控制台输出,更容易看到 + try { + StackTraceElement[] stackTraces = ex.getStackTrace(); + for (StackTraceElement stackTrace : stackTraces) { + if (ObjUtil.notEqual(stackTrace.getClassName(), ServiceExceptionUtil.class.getName())) { + log.warn("[serviceExceptionHandler]\n\t{}", stackTrace); + break; + } + } + } catch (Exception ignored) { + // 忽略日志,避免影响主流程 + } + } + return CommonResult.error(ex.getCode(), ex.getMessage()); + } + + /** + * 处理系统异常,兜底处理所有的一切 + */ + @ExceptionHandler(value = Exception.class) + public CommonResult defaultExceptionHandler(HttpServletRequest req, Throwable ex) { + // 情况一:处理表不存在的异常 + CommonResult tableNotExistsResult = handleTableNotExists(ex); + if (tableNotExistsResult != null) { + return tableNotExistsResult; + } + + // 情况二:处理异常 + log.error("[defaultExceptionHandler]", ex); + // 插入异常日志 + createExceptionLog(req, ex); + // 返回 ERROR CommonResult + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); + } + + private void createExceptionLog(HttpServletRequest req, Throwable e) { + // 插入错误日志 + ApiErrorLogCreateReqDTO errorLog = new ApiErrorLogCreateReqDTO(); + try { + // 初始化 errorLog + buildExceptionLog(errorLog, req, e); + // 执行插入 errorLog + apiErrorLogApi.createApiErrorLogAsync(errorLog); + } catch (Throwable th) { + log.error("[createExceptionLog][url({}) log({}) 发生异常]", req.getRequestURI(), JsonUtils.toJsonString(errorLog), th); + } + } + + private void buildExceptionLog(ApiErrorLogCreateReqDTO errorLog, HttpServletRequest request, Throwable e) { + // 处理用户信息 + errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); + errorLog.setUserType(WebFrameworkUtils.getLoginUserType(request)); + // 设置异常字段 + errorLog.setExceptionName(e.getClass().getName()); + errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); + errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e)); + errorLog.setExceptionStackTrace(ExceptionUtil.stacktraceToString(e)); + StackTraceElement[] stackTraceElements = e.getStackTrace(); + Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空"); + StackTraceElement stackTraceElement = stackTraceElements[0]; + errorLog.setExceptionClassName(stackTraceElement.getClassName()); + errorLog.setExceptionFileName(stackTraceElement.getFileName()); + errorLog.setExceptionMethodName(stackTraceElement.getMethodName()); + errorLog.setExceptionLineNumber(stackTraceElement.getLineNumber()); + // 设置其它字段 + errorLog.setTraceId(TracerUtils.getTraceId()); + errorLog.setApplicationName(applicationName); + errorLog.setRequestUrl(request.getRequestURI()); + Map requestParams = MapUtil.builder() + .put("query", JakartaServletUtil.getParamMap(request)) + .put("body", JakartaServletUtil.getBody(request)).build(); + errorLog.setRequestParams(JsonUtils.toJsonString(requestParams)); + errorLog.setRequestMethod(request.getMethod()); + errorLog.setUserAgent(ServletUtils.getUserAgent(request)); + errorLog.setUserIp(JakartaServletUtil.getClientIP(request)); + errorLog.setExceptionTime(LocalDateTime.now()); + } + + /** + * 处理 Table 不存在的异常情况 + * + * @param ex 异常 + * @return 如果是 Table 不存在的异常,则返回对应的 CommonResult + */ + private CommonResult handleTableNotExists(Throwable ex) { + String message = ExceptionUtil.getRootCauseMessage(ex); + if (!message.contains("doesn't exist")) { + return null; + } + // 1. 数据报表 + if (message.contains("report_")) { + log.error("[报表模块 win-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[报表模块 win-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); + } + // 2. 工作流 + if (message.contains("bpm_")) { + log.error("[工作流模块 win-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[工作流模块 win-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); + } + // 3. 微信公众号 + if (message.contains("mp_")) { + log.error("[微信公众号 win-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[微信公众号 win-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); + } + // 4. 商城系统 + if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { + log.error("[商城系统 win-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[商城系统 win-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); + } + // 5. ERP 系统 + if (message.contains("erp_")) { + log.error("[ERP 系统 win-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[ERP 系统 win-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); + } + // 6. CRM 系统 + if (message.contains("crm_")) { + log.error("[CRM 系统 win-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[CRM 系统 win-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); + } + // 7. 支付平台 + if (message.contains("pay_")) { + log.error("[支付模块 win-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[支付模块 win-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); + } + // 8. AI 大模型 + if (message.contains("ai_")) { + log.error("[AI 大模型 win-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[AI 大模型 win-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); + } + // 9. IOT 物联网 + if (message.contains("iot_")) { + log.error("[IOT 物联网 win-module-iot - 表结构未导入][参考 https://doc.iocoder.cn/iot/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[IOT 物联网 win-module-iot - 表结构未导入][参考 https://doc.iocoder.cn/iot/build/ 开启]"); + } + return null; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java new file mode 100644 index 0000000..f006b3a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java @@ -0,0 +1,45 @@ +package com.win.framework.web.core.handler; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * 全局响应结果(ResponseBody)处理器 + * + * 不同于在网上看到的很多文章,会选择自动将 Controller 返回结果包上 {@link CommonResult}, + * 在 onemall 中,是 Controller 在返回时,主动自己包上 {@link CommonResult}。 + * 原因是,GlobalResponseBodyHandler 本质上是 AOP,它不应该改变 Controller 返回的数据结构 + * + * 目前,GlobalResponseBodyHandler 的主要作用是,记录 Controller 的返回结果, + * 方便 {@link com.win.framework.apilog.core.filter.ApiAccessLogFilter} 记录访问日志 + */ +@ControllerAdvice +public class GlobalResponseBodyHandler implements ResponseBodyAdvice { + + @Override + @SuppressWarnings("NullableProblems") // 避免 IDEA 警告 + public boolean supports(MethodParameter returnType, Class converterType) { + if (returnType.getMethod() == null) { + return false; + } + // 只拦截返回结果为 CommonResult 类型 + return returnType.getMethod().getReturnType() == CommonResult.class; + } + + @Override + @SuppressWarnings("NullableProblems") // 避免 IDEA 警告 + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, + ServerHttpRequest request, ServerHttpResponse response) { + // 记录 Controller 结果 + WebFrameworkUtils.setCommonResult(((ServletServerHttpRequest) request).getServletRequest(), (CommonResult) body); + return body; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java new file mode 100644 index 0000000..94350ed --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java @@ -0,0 +1,146 @@ +package com.win.framework.web.core.util; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.win.framework.common.enums.TerminalEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.config.WebProperties; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; + +/** + * 专属于 web 包的工具类 + * + * @author 芋道源码 + */ +public class WebFrameworkUtils { + + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id"; + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type"; + + private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result"; + + public static final String HEADER_TENANT_ID = "tenant-id"; + + /** + * 终端的 Header + * + * @see com.win.framework.common.enums.TerminalEnum + */ + public static final String HEADER_TERMINAL = "terminal"; + + private static WebProperties properties; + + public WebFrameworkUtils(WebProperties webProperties) { + WebFrameworkUtils.properties = webProperties; + } + + /** + * 获得租户编号,从 header 中 + * 考虑到其它 framework 组件也会使用到租户编号,所以不得不放在 WebFrameworkUtils 统一提供 + * + * @param request 请求 + * @return 租户编号 + */ + public static Long getTenantId(HttpServletRequest request) { + String tenantId = request.getHeader(HEADER_TENANT_ID); + return NumberUtil.isNumber(tenantId) ? Long.valueOf(tenantId) : null; + } + + public static void setLoginUserId(ServletRequest request, Long userId) { + request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); + } + + /** + * 设置用户类型 + * + * @param request 请求 + * @param userType 用户类型 + */ + public static void setLoginUserType(ServletRequest request, Integer userType) { + request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType); + } + + /** + * 获得当前用户的编号,从请求中 + * 注意:该方法仅限于 framework 框架使用!!! + * + * @param request 请求 + * @return 用户编号 + */ + public static Long getLoginUserId(HttpServletRequest request) { + if (request == null) { + return null; + } + return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); + } + + /** + * 获得当前用户的类型 + * 注意:该方法仅限于 web 相关的 framework 组件使用!!! + * + * @param request 请求 + * @return 用户编号 + */ + public static Integer getLoginUserType(HttpServletRequest request) { + if (request == null) { + return null; + } + // 1. 优先,从 Attribute 中获取 + Integer userType = (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE); + if (userType != null) { + return userType; + } + // 2. 其次,基于 URL 前缀的约定 + if (request.getServletPath().startsWith(properties.getAdminApi().getPrefix())) { + return UserTypeEnum.ADMIN.getValue(); + } + if (request.getServletPath().startsWith(properties.getAppApi().getPrefix())) { + return UserTypeEnum.MEMBER.getValue(); + } + return null; + } + + public static Integer getLoginUserType() { + HttpServletRequest request = getRequest(); + return getLoginUserType(request); + } + + public static Long getLoginUserId() { + HttpServletRequest request = getRequest(); + return getLoginUserId(request); + } + + public static Integer getTerminal() { + HttpServletRequest request = getRequest(); + if (request == null) { + return TerminalEnum.UNKNOWN.getTerminal(); + } + String terminalValue = request.getHeader(HEADER_TERMINAL); + return NumberUtil.parseInt(terminalValue, TerminalEnum.UNKNOWN.getTerminal()); + } + + public static void setCommonResult(ServletRequest request, CommonResult result) { + request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result); + } + + public static CommonResult getCommonResult(ServletRequest request) { + return (CommonResult) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT); + } + + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; + return servletRequestAttributes.getRequest(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java new file mode 100644 index 0000000..2c269be --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * 针对 SpringMVC 的基础封装 + */ +package com.win.framework.web; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java new file mode 100644 index 0000000..bfd898c --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java @@ -0,0 +1,63 @@ +package com.win.framework.xss.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.xss.core.clean.JsoupXssCleaner; +import com.win.framework.xss.core.clean.XssCleaner; +import com.win.framework.xss.core.filter.XssFilter; +import com.win.framework.xss.core.json.XssStringJsonDeserializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.util.PathMatcher; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import static com.win.framework.web.config.WinWebAutoConfiguration.createFilterBean; + +@AutoConfiguration +@EnableConfigurationProperties(XssProperties.class) +@ConditionalOnProperty(prefix = "win.xss", name = "enable", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用 +public class WinXssAutoConfiguration implements WebMvcConfigurer { + + /** + * Xss 清理者 + * + * @return XssCleaner + */ + @Bean + @ConditionalOnMissingBean(XssCleaner.class) + public XssCleaner xssCleaner() { + return new JsoupXssCleaner(); + } + + /** + * 注册 Jackson 的序列化器,用于处理 json 类型参数的 xss 过滤 + * + * @return Jackson2ObjectMapperBuilderCustomizer + */ + @Bean + @ConditionalOnMissingBean(name = "xssJacksonCustomizer") + @ConditionalOnBean(ObjectMapper.class) + @ConditionalOnProperty(value = "win.xss.enable", havingValue = "true") + public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssProperties properties, + PathMatcher pathMatcher, + XssCleaner xssCleaner) { + // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理 + return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner)); + } + + /** + * 创建 XssFilter Bean,解决 Xss 安全问题 + */ + @Bean + @ConditionalOnBean(XssCleaner.class) + public FilterRegistrationBean xssFilter(XssProperties properties, PathMatcher pathMatcher, XssCleaner xssCleaner) { + return createFilterBean(new XssFilter(properties, pathMatcher, xssCleaner), WebFilterOrderEnum.XSS_FILTER); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java new file mode 100644 index 0000000..0ef3ad4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java @@ -0,0 +1,29 @@ +package com.win.framework.xss.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import java.util.Collections; +import java.util.List; + +/** + * Xss 配置属性 + * + * @author 芋道源码 + */ +@ConfigurationProperties(prefix = "win.xss") +@Validated +@Data +public class XssProperties { + + /** + * 是否开启,默认为 true + */ + private boolean enable = true; + /** + * 需要排除的 URL,默认为空 + */ + private List excludeUrls = Collections.emptyList(); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java new file mode 100644 index 0000000..12f77a6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java @@ -0,0 +1,64 @@ +package com.win.framework.xss.core.clean; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.safety.Safelist; + +/** + * 基于 JSONP 实现 XSS 过滤字符串 + */ +public class JsoupXssCleaner implements XssCleaner { + + private final Safelist safelist; + + /** + * 用于在 src 属性使用相对路径时,强制转换为绝对路径。 为空时不处理,值应为绝对路径的前缀(包含协议部分) + */ + private final String baseUri; + + /** + * 无参构造,默认使用 {@link JsoupXssCleaner#buildSafelist} 方法构建一个安全列表 + */ + public JsoupXssCleaner() { + this.safelist = buildSafelist(); + this.baseUri = ""; + } + + /** + * 构建一个 Xss 清理的 Safelist 规则。 + * 基于 Safelist#relaxed() 的基础上: + * 1. 扩展支持了 style 和 class 属性 + * 2. a 标签额外支持了 target 属性 + * 3. img 标签额外支持了 data 协议,便于支持 base64 + * + * @return Safelist + */ + private Safelist buildSafelist() { + // 使用 jsoup 提供的默认的 + Safelist relaxedSafelist = Safelist.relaxed(); + // 富文本编辑时一些样式是使用 style 来进行实现的 + // 比如红色字体 style="color:red;", 所以需要给所有标签添加 style 属性 + // 注意:style 属性会有注入风险 + relaxedSafelist.addAttributes(":all", "style", "class"); + // 保留 a 标签的 target 属性 + relaxedSafelist.addAttributes("a", "target"); + // 支持img 为base64 + relaxedSafelist.addProtocols("img", "src", "data"); + + // 保留相对路径, 保留相对路径时,必须提供对应的 baseUri 属性,否则依然会被删除 + // WHITELIST.preserveRelativeLinks(false); + + // 移除 a 标签和 img 标签的一些协议限制,这会导致 xss 防注入失效,如 + // 虽然可以重写 WhiteList#isSafeAttribute 来处理,但是有隐患,所以暂时不支持相对路径 + // WHITELIST.removeProtocols("a", "href", "ftp", "http", "https", "mailto"); + // WHITELIST.removeProtocols("img", "src", "http", "https"); + return relaxedSafelist; + } + + @Override + public String clean(String html) { + return Jsoup.clean(html, baseUri, safelist, new Document.OutputSettings().prettyPrint(false)); + } + +} + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java new file mode 100644 index 0000000..f9673a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java @@ -0,0 +1,16 @@ +package com.win.framework.xss.core.clean; + +/** + * 对 html 文本中的有 Xss 风险的数据进行清理 + */ +public interface XssCleaner { + + /** + * 清理有 Xss 风险的文本 + * + * @param html 原 html + * @return 清理后的 html + */ + String clean(String html); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java new file mode 100644 index 0000000..fc6291b --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java @@ -0,0 +1,52 @@ +package com.win.framework.xss.core.filter; + +import com.win.framework.xss.config.XssProperties; +import com.win.framework.xss.core.clean.XssCleaner; +import lombok.AllArgsConstructor; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Xss 过滤器 + * + * @author 芋道源码 + */ +@AllArgsConstructor +public class XssFilter extends OncePerRequestFilter { + + /** + * 属性 + */ + private final XssProperties properties; + /** + * 路径匹配器 + */ + private final PathMatcher pathMatcher; + + private final XssCleaner xssCleaner; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(new XssRequestWrapper(request, xssCleaner), response); + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 如果关闭,则不过滤 + if (!properties.isEnable()) { + return true; + } + + // 如果匹配到无需过滤,则不过滤 + String uri = request.getRequestURI(); + return properties.getExcludeUrls().stream().anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, uri)); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java new file mode 100644 index 0000000..480f4f5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java @@ -0,0 +1,92 @@ +package com.win.framework.xss.core.filter; + +import com.win.framework.xss.core.clean.XssCleaner; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Xss 请求 Wrapper + * + * @author 芋道源码 + */ +public class XssRequestWrapper extends HttpServletRequestWrapper { + + private final XssCleaner xssCleaner; + + public XssRequestWrapper(HttpServletRequest request, XssCleaner xssCleaner) { + super(request); + this.xssCleaner = xssCleaner; + } + + // ============================ parameter ============================ + @Override + public Map getParameterMap() { + Map map = new LinkedHashMap<>(); + Map parameters = super.getParameterMap(); + for (Map.Entry entry : parameters.entrySet()) { + String[] values = entry.getValue(); + for (int i = 0; i < values.length; i++) { + values[i] = xssCleaner.clean(values[i]); + } + map.put(entry.getKey(), values); + } + return map; + } + + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (values == null) { + return null; + } + int count = values.length; + String[] encodedValues = new String[count]; + for (int i = 0; i < count; i++) { + encodedValues[i] = xssCleaner.clean(values[i]); + } + return encodedValues; + } + + @Override + public String getParameter(String name) { + String value = super.getParameter(name); + if (value == null) { + return null; + } + return xssCleaner.clean(value); + } + + // ============================ attribute ============================ + @Override + public Object getAttribute(String name) { + Object value = super.getAttribute(name); + if (value instanceof String) { + return xssCleaner.clean((String) value); + } + return value; + } + + // ============================ header ============================ + @Override + public String getHeader(String name) { + String value = super.getHeader(name); + if (value == null) { + return null; + } + return xssCleaner.clean(value); + } + + // ============================ queryString ============================ + @Override + public String getQueryString() { + String value = super.getQueryString(); + if (value == null) { + return null; + } + return xssCleaner.clean(value); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java new file mode 100644 index 0000000..61b0f60 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java @@ -0,0 +1,82 @@ +package com.win.framework.xss.core.json; + +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.xss.config.XssProperties; +import com.win.framework.xss.core.clean.XssCleaner; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StringDeserializer; +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.PathMatcher; + +import java.io.IOException; + +/** + * XSS 过滤 jackson 反序列化器。 + * 在反序列化的过程中,会对字符串进行 XSS 过滤。 + * + * @author Hccake + */ +@Slf4j +@AllArgsConstructor +public class XssStringJsonDeserializer extends StringDeserializer { + + /** + * 属性 + */ + private final XssProperties properties; + /** + * 路径匹配器 + */ + private final PathMatcher pathMatcher; + + private final XssCleaner xssCleaner; + + @Override + public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + // 1. 白名单 URL 的处理 + HttpServletRequest request = ServletUtils.getRequest(); + if (request != null) { + String uri = ServletUtils.getRequest().getRequestURI(); + if (properties.getExcludeUrls().stream().anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, uri))) { + return p.getText(); + } + } + + // 2. 真正使用 xssCleaner 进行过滤 + if (p.hasToken(JsonToken.VALUE_STRING)) { + return xssCleaner.clean(p.getText()); + } + JsonToken t = p.currentToken(); + // [databind#381] + if (t == JsonToken.START_ARRAY) { + return _deserializeFromArray(p, ctxt); + } + // need to gracefully handle byte[] data, as base64 + if (t == JsonToken.VALUE_EMBEDDED_OBJECT) { + Object ob = p.getEmbeddedObject(); + if (ob == null) { + return null; + } + if (ob instanceof byte[]) { + return ctxt.getBase64Variant().encode((byte[]) ob, false); + } + // otherwise, try conversion using toString()... + return ob.toString(); + } + // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML) + if (t == JsonToken.START_OBJECT) { + return ctxt.extractScalarFromObject(p, this, _valueClass); + } + + if (t.isScalarValue()) { + String text = p.getValueAsString(); + return xssCleaner.clean(text); + } + return (String) ctxt.handleUnexpectedToken(_valueClass, p); + } +} + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java new file mode 100644 index 0000000..73558a0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java @@ -0,0 +1,6 @@ +/** + * 针对 XSS 的基础封装 + * + * XSS 说明:https://tech.meituan.com/2018/09/27/fe-security.html + */ +package com.win.framework.xss; diff --git a/win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..49859a0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,6 @@ +com.win.framework.apilog.config.WinApiLogAutoConfiguration +com.win.framework.jackson.config.WinJacksonAutoConfiguration +com.win.framework.swagger.config.WinSwaggerAutoConfiguration +com.win.framework.web.config.WinWebAutoConfiguration +com.win.framework.xss.config.WinXssAutoConfiguration +com.win.framework.banner.config.WinBannerAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-web/src/main/resources/banner.txt b/win-framework/win-spring-boot-starter-web/src/main/resources/banner.txt new file mode 100644 index 0000000..569d201 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/resources/banner.txt @@ -0,0 +1,17 @@ +芋道源码 http://www.iocoder.cn +Application Version: ${win.info.version} +Spring Boot Version: ${spring-boot.version} + +.__ __. ______ .______ __ __ _______ +| \ | | / __ \ | _ \ | | | | / _____| +| \| | | | | | | |_) | | | | | | | __ +| . ` | | | | | | _ < | | | | | | |_ | +| |\ | | `--' | | |_) | | `--' | | |__| | +|__| \__| \______/ |______/ \______/ \______| + +███╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ +████╗ ██║██╔═══██╗ ██╔══██╗██║ ██║██╔════╝ +██╔██╗ ██║██║ ██║ ██████╔╝██║ ██║██║ ███╗ +██║╚██╗██║██║ ██║ ██╔══██╗██║ ██║██║ ██║ +██║ ╚████║╚██████╔╝ ██████╔╝╚██████╔╝╚██████╔╝ +╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ diff --git a/win-framework/win-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md b/win-framework/win-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md new file mode 100644 index 0000000..f5f32c6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md b/win-framework/win-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md new file mode 100644 index 0000000..0d6c7da --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md @@ -0,0 +1 @@ + diff --git a/win-framework/win-spring-boot-starter-websocket/pom.xml b/win-framework/win-spring-boot-starter-websocket/pom.xml new file mode 100644 index 0000000..ad79def --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/pom.xml @@ -0,0 +1,73 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-websocket + jar + + ${project.artifactId} + WebSocket 框架,支持多节点的广播 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + com.win + win-common + + + + + + com.win + win-spring-boot-starter-security + provided + + + + org.springframework.boot + spring-boot-starter-websocket + + + + + com.win + win-spring-boot-starter-mq + + + org.springframework.kafka + spring-kafka + true + + + org.springframework.amqp + spring-rabbit + true + + + org.apache.rocketmq + rocketmq-spring-boot-starter + true + + + + + + com.win + win-spring-boot-starter-biz-tenant + provided + + + + \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java new file mode 100644 index 0000000..cbdc837 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java @@ -0,0 +1,34 @@ +package com.win.framework.websocket.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * WebSocket 配置项 + * + * @author xingyu4j + */ +@ConfigurationProperties("win.websocket") +@Data +@Validated +public class WebSocketProperties { + + /** + * WebSocket 的连接路径 + */ + @NotEmpty(message = "WebSocket 的连接路径不能为空") + private String path = "/ws"; + + /** + * 消息发送器的类型 + * + * 可选值:local、redis、rocketmq、kafka、rabbitmq + */ + @NotNull(message = "WebSocket 的消息发送者不能为空") + private String senderType = "local"; + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java new file mode 100644 index 0000000..f1752cd --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java @@ -0,0 +1,183 @@ +package com.win.framework.websocket.config; + +import com.win.framework.mq.redis.config.WinRedisMQConsumerAutoConfiguration; +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.websocket.core.handler.JsonWebSocketMessageHandler; +import com.win.framework.websocket.core.listener.WebSocketMessageListener; +import com.win.framework.websocket.core.security.LoginUserHandshakeInterceptor; +import com.win.framework.websocket.core.security.WebSocketAuthorizeRequestsCustomizer; +import com.win.framework.websocket.core.sender.kafka.KafkaWebSocketMessageConsumer; +import com.win.framework.websocket.core.sender.kafka.KafkaWebSocketMessageSender; +import com.win.framework.websocket.core.sender.local.LocalWebSocketMessageSender; +import com.win.framework.websocket.core.sender.rabbitmq.RabbitMQWebSocketMessageConsumer; +import com.win.framework.websocket.core.sender.rabbitmq.RabbitMQWebSocketMessageSender; +import com.win.framework.websocket.core.sender.redis.RedisWebSocketMessageConsumer; +import com.win.framework.websocket.core.sender.redis.RedisWebSocketMessageSender; +import com.win.framework.websocket.core.sender.rocketmq.RocketMQWebSocketMessageConsumer; +import com.win.framework.websocket.core.sender.rocketmq.RocketMQWebSocketMessageSender; +import com.win.framework.websocket.core.session.WebSocketSessionHandlerDecorator; +import com.win.framework.websocket.core.session.WebSocketSessionManager; +import com.win.framework.websocket.core.session.WebSocketSessionManagerImpl; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.List; + +/** + * WebSocket 自动配置 + * + * @author xingyu4j + */ +@AutoConfiguration(before = WinRedisMQConsumerAutoConfiguration.class) // before WinRedisMQConsumerAutoConfiguration 的原因是,需要保证 RedisWebSocketMessageConsumer 先创建,才能创建 RedisMessageListenerContainer +@EnableWebSocket // 开启 websocket +@ConditionalOnProperty(prefix = "win.websocket", value = "enable", matchIfMissing = true) // 允许使用 win.websocket.enable=false 禁用 websocket +@EnableConfigurationProperties(WebSocketProperties.class) +public class WinWebSocketAutoConfiguration { + + @Bean + public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor[] handshakeInterceptors, + WebSocketHandler webSocketHandler, + WebSocketProperties webSocketProperties) { + return registry -> registry + // 添加 WebSocketHandler + .addHandler(webSocketHandler, webSocketProperties.getPath()) + .addInterceptors(handshakeInterceptors) + // 允许跨域,否则前端连接会直接断开 + .setAllowedOriginPatterns("*"); + } + + @Bean + public HandshakeInterceptor handshakeInterceptor() { + return new LoginUserHandshakeInterceptor(); + } + + @Bean + public WebSocketHandler webSocketHandler(WebSocketSessionManager sessionManager, + List> messageListeners) { + // 1. 创建 JsonWebSocketMessageHandler 对象,处理消息 + JsonWebSocketMessageHandler messageHandler = new JsonWebSocketMessageHandler(messageListeners); + // 2. 创建 WebSocketSessionHandlerDecorator 对象,处理连接 + return new WebSocketSessionHandlerDecorator(messageHandler, sessionManager); + } + + @Bean + public WebSocketSessionManager webSocketSessionManager() { + return new WebSocketSessionManagerImpl(); + } + + @Bean + public WebSocketAuthorizeRequestsCustomizer webSocketAuthorizeRequestsCustomizer(WebSocketProperties webSocketProperties) { + return new WebSocketAuthorizeRequestsCustomizer(webSocketProperties); + } + + // ==================== Sender 相关 ==================== + + @Configuration + @ConditionalOnProperty(prefix = "win.websocket", name = "sender-type", havingValue = "local") + public class LocalWebSocketMessageSenderConfiguration { + + @Bean + public LocalWebSocketMessageSender localWebSocketMessageSender(WebSocketSessionManager sessionManager) { + return new LocalWebSocketMessageSender(sessionManager); + } + + } + + @Configuration + @ConditionalOnProperty(prefix = "win.websocket", name = "sender-type", havingValue = "redis") + public class RedisWebSocketMessageSenderConfiguration { + + @Bean + public RedisWebSocketMessageSender redisWebSocketMessageSender(WebSocketSessionManager sessionManager, + RedisMQTemplate redisMQTemplate) { + return new RedisWebSocketMessageSender(sessionManager, redisMQTemplate); + } + + @Bean + public RedisWebSocketMessageConsumer redisWebSocketMessageConsumer( + RedisWebSocketMessageSender redisWebSocketMessageSender) { + return new RedisWebSocketMessageConsumer(redisWebSocketMessageSender); + } + + } + + @Configuration + @ConditionalOnProperty(prefix = "win.websocket", name = "sender-type", havingValue = "rocketmq") + public class RocketMQWebSocketMessageSenderConfiguration { + + @Bean + public RocketMQWebSocketMessageSender rocketMQWebSocketMessageSender( + WebSocketSessionManager sessionManager, RocketMQTemplate rocketMQTemplate, + @Value("${win.websocket.sender-rocketmq.topic}") String topic) { + return new RocketMQWebSocketMessageSender(sessionManager, rocketMQTemplate, topic); + } + + @Bean + public RocketMQWebSocketMessageConsumer rocketMQWebSocketMessageConsumer( + RocketMQWebSocketMessageSender rocketMQWebSocketMessageSender) { + return new RocketMQWebSocketMessageConsumer(rocketMQWebSocketMessageSender); + } + + } + + @Configuration + @ConditionalOnProperty(prefix = "win.websocket", name = "sender-type", havingValue = "rabbitmq") + public class RabbitMQWebSocketMessageSenderConfiguration { + + @Bean + public RabbitMQWebSocketMessageSender rabbitMQWebSocketMessageSender( + WebSocketSessionManager sessionManager, RabbitTemplate rabbitTemplate, + TopicExchange websocketTopicExchange) { + return new RabbitMQWebSocketMessageSender(sessionManager, rabbitTemplate, websocketTopicExchange); + } + + @Bean + public RabbitMQWebSocketMessageConsumer rabbitMQWebSocketMessageConsumer( + RabbitMQWebSocketMessageSender rabbitMQWebSocketMessageSender) { + return new RabbitMQWebSocketMessageConsumer(rabbitMQWebSocketMessageSender); + } + + /** + * 创建 Topic Exchange + */ + @Bean + public TopicExchange websocketTopicExchange(@Value("${win.websocket.sender-rabbitmq.exchange}") String exchange) { + return new TopicExchange(exchange, + true, // durable: 是否持久化 + false); // exclusive: 是否排它 + } + + } + + @Configuration + @ConditionalOnProperty(prefix = "win.websocket", name = "sender-type", havingValue = "kafka") + public class KafkaWebSocketMessageSenderConfiguration { + + @Bean + public KafkaWebSocketMessageSender kafkaWebSocketMessageSender( + WebSocketSessionManager sessionManager, KafkaTemplate kafkaTemplate, + @Value("${win.websocket.sender-kafka.topic}") String topic) { + return new KafkaWebSocketMessageSender(sessionManager, kafkaTemplate, topic); + } + + @Bean + public KafkaWebSocketMessageConsumer kafkaWebSocketMessageConsumer( + KafkaWebSocketMessageSender kafkaWebSocketMessageSender) { + return new KafkaWebSocketMessageConsumer(kafkaWebSocketMessageSender); + } + + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/handler/JsonWebSocketMessageHandler.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/handler/JsonWebSocketMessageHandler.java new file mode 100644 index 0000000..85467f2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/handler/JsonWebSocketMessageHandler.java @@ -0,0 +1,83 @@ +package com.win.framework.websocket.core.handler; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.TypeUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.tenant.core.util.TenantUtils; +import com.win.framework.websocket.core.listener.WebSocketMessageListener; +import com.win.framework.websocket.core.message.JsonWebSocketMessage; +import com.win.framework.websocket.core.util.WebSocketFrameworkUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; + +/** + * JSON 格式 {@link WebSocketHandler} 实现类 + * + * 基于 {@link JsonWebSocketMessage#getType()} 消息类型,调度到对应的 {@link WebSocketMessageListener} 监听器。 + * + * @author 芋道源码 + */ +@Slf4j +public class JsonWebSocketMessageHandler extends TextWebSocketHandler { + + /** + * type 与 WebSocketMessageListener 的映射 + */ + private final Map> listeners = new HashMap<>(); + + @SuppressWarnings({"rawtypes", "unchecked"}) + public JsonWebSocketMessageHandler(List listenersList) { + listenersList.forEach((Consumer) + listener -> listeners.put(listener.getType(), listener)); + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + // 1.1 空消息,跳过 + if (message.getPayloadLength() == 0) { + return; + } + // 1.2 ping 心跳消息,直接返回 pong 消息。 + if (message.getPayloadLength() == 4 && Objects.equals(message.getPayload(), "ping")) { + session.sendMessage(new TextMessage("pong")); + return; + } + + // 2.1 解析消息 + try { + JsonWebSocketMessage jsonMessage = JsonUtils.parseObject(message.getPayload(), JsonWebSocketMessage.class); + if (jsonMessage == null) { + log.error("[handleTextMessage][session({}) message({}) 解析为空]", session.getId(), message.getPayload()); + return; + } + if (StrUtil.isEmpty(jsonMessage.getType())) { + log.error("[handleTextMessage][session({}) message({}) 类型为空]", session.getId(), message.getPayload()); + return; + } + // 2.2 获得对应的 WebSocketMessageListener + WebSocketMessageListener messageListener = listeners.get(jsonMessage.getType()); + if (messageListener == null) { + log.error("[handleTextMessage][session({}) message({}) 监听器为空]", session.getId(), message.getPayload()); + return; + } + // 2.3 处理消息 + Type type = TypeUtil.getTypeArgument(messageListener.getClass(), 0); + Object messageObj = JsonUtils.parseObject(jsonMessage.getContent(), type); + Long tenantId = WebSocketFrameworkUtils.getTenantId(session); + TenantUtils.execute(tenantId, () -> messageListener.onMessage(session, messageObj)); + } catch (Throwable ex) { + log.error("[handleTextMessage][session({}) message({}) 处理异常]", session.getId(), message.getPayload()); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/listener/WebSocketMessageListener.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/listener/WebSocketMessageListener.java new file mode 100644 index 0000000..cacc31b --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/listener/WebSocketMessageListener.java @@ -0,0 +1,31 @@ +package com.win.framework.websocket.core.listener; + +import com.win.framework.websocket.core.message.JsonWebSocketMessage; +import org.springframework.web.socket.WebSocketSession; + +/** + * WebSocket 消息监听器接口 + * + * 目的:前端发送消息给后端后,处理对应 {@link #getType()} 类型的消息 + * + * @param 泛型,消息类型 + */ +public interface WebSocketMessageListener { + + /** + * 处理消息 + * + * @param session Session + * @param message 消息 + */ + void onMessage(WebSocketSession session, T message); + + /** + * 获得消息类型 + * + * @see JsonWebSocketMessage#getType() + * @return 消息类型 + */ + String getType(); + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/message/JsonWebSocketMessage.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/message/JsonWebSocketMessage.java new file mode 100644 index 0000000..9921c4a --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/message/JsonWebSocketMessage.java @@ -0,0 +1,29 @@ +package com.win.framework.websocket.core.message; + +import com.win.framework.websocket.core.listener.WebSocketMessageListener; +import lombok.Data; + +import java.io.Serializable; + +/** + * JSON 格式的 WebSocket 消息帧 + * + * @author 芋道源码 + */ +@Data +public class JsonWebSocketMessage implements Serializable { + + /** + * 消息类型 + * + * 目的:用于分发到对应的 {@link WebSocketMessageListener} 实现类 + */ + private String type; + /** + * 消息内容 + * + * 要求 JSON 对象 + */ + private String content; + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/LoginUserHandshakeInterceptor.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/LoginUserHandshakeInterceptor.java new file mode 100644 index 0000000..5cb8744 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/LoginUserHandshakeInterceptor.java @@ -0,0 +1,42 @@ +package com.win.framework.websocket.core.security; + +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.filter.TokenAuthenticationFilter; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.websocket.core.util.WebSocketFrameworkUtils; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +/** + * 登录用户的 {@link HandshakeInterceptor} 实现类 + * + * 流程如下: + * 1. 前端连接 websocket 时,会通过拼接 ?token={token} 到 ws:// 连接后,这样它可以被 {@link TokenAuthenticationFilter} 所认证通过 + * 2. {@link LoginUserHandshakeInterceptor} 负责把 {@link LoginUser} 添加到 {@link WebSocketSession} 中 + * + * @author 芋道源码 + */ +public class LoginUserHandshakeInterceptor implements HandshakeInterceptor { + + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, + WebSocketHandler wsHandler, Map attributes) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser != null) { + WebSocketFrameworkUtils.setLoginUser(loginUser, attributes); + } + return true; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, + WebSocketHandler wsHandler, Exception exception) { + // do nothing + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java new file mode 100644 index 0000000..8379bd7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java @@ -0,0 +1,24 @@ +package com.win.framework.websocket.core.security; + +import com.win.framework.security.config.AuthorizeRequestsCustomizer; +import com.win.framework.websocket.config.WebSocketProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; + +/** + * WebSocket 的权限自定义 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class WebSocketAuthorizeRequestsCustomizer extends AuthorizeRequestsCustomizer { + + private final WebSocketProperties webSocketProperties; + + @Override + public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) { + registry.requestMatchers(webSocketProperties.getPath()).permitAll(); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/AbstractWebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/AbstractWebSocketMessageSender.java new file mode 100644 index 0000000..d48407f --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/AbstractWebSocketMessageSender.java @@ -0,0 +1,104 @@ +package com.win.framework.websocket.core.sender; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.websocket.core.message.JsonWebSocketMessage; +import com.win.framework.websocket.core.session.WebSocketSessionManager; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * WebSocketMessageSender 实现类 + * + * @author 芋道源码 + */ +@Slf4j +@RequiredArgsConstructor +public abstract class AbstractWebSocketMessageSender implements WebSocketMessageSender { + + private final WebSocketSessionManager sessionManager; + + @Override + public void send(Integer userType, Long userId, String messageType, String messageContent) { + send(null, userType, userId, messageType, messageContent); + } + + @Override + public void send(Integer userType, String messageType, String messageContent) { + send(null, userType, null, messageType, messageContent); + } + + @Override + public void send(String sessionId, String messageType, String messageContent) { + send(sessionId, null, null, messageType, messageContent); + } + + /** + * 发送消息 + * + * @param sessionId Session 编号 + * @param userType 用户类型 + * @param userId 用户编号 + * @param messageType 消息类型 + * @param messageContent 消息内容 + */ + public void send(String sessionId, Integer userType, Long userId, String messageType, String messageContent) { + // 1. 获得 Session 列表 + List sessions = Collections.emptyList(); + if (StrUtil.isNotEmpty(sessionId)) { + WebSocketSession session = sessionManager.getSession(sessionId); + if (session != null) { + sessions = Collections.singletonList(session); + } + } else if (userType != null && userId != null) { + sessions = (List) sessionManager.getSessionList(userType, userId); + } else if (userType != null) { + sessions = (List) sessionManager.getSessionList(userType); + } + if (CollUtil.isEmpty(sessions)) { + log.info("[send][sessionId({}) userType({}) userId({}) messageType({}) messageContent({}) 未匹配到会话]", + sessionId, userType, userId, messageType, messageContent); + } + // 2. 执行发送 + doSend(sessions, messageType, messageContent); + } + + /** + * 发送消息的具体实现 + * + * @param sessions Session 列表 + * @param messageType 消息类型 + * @param messageContent 消息内容 + */ + public void doSend(Collection sessions, String messageType, String messageContent) { + JsonWebSocketMessage message = new JsonWebSocketMessage().setType(messageType).setContent(messageContent); + String payload = JsonUtils.toJsonString(message); // 关键,使用 JSON 序列化 + sessions.forEach(session -> { + // 1. 各种校验,保证 Session 可以被发送 + if (session == null) { + log.error("[doSend][session 为空, message({})]", message); + return; + } + if (!session.isOpen()) { + log.error("[doSend][session({}) 已关闭, message({})]", session.getId(), message); + return; + } + // 2. 执行发送 + try { + session.sendMessage(new TextMessage(payload)); + log.info("[doSend][session({}) 发送消息成功,message({})]", session.getId(), message); + } catch (IOException ex) { + log.error("[doSend][session({}) 发送消息失败,message({})]", session.getId(), message, ex); + } + }); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/WebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/WebSocketMessageSender.java new file mode 100644 index 0000000..439c730 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/WebSocketMessageSender.java @@ -0,0 +1,52 @@ +package com.win.framework.websocket.core.sender; + +import com.win.framework.common.util.json.JsonUtils; + +/** + * WebSocket 消息的发送器接口 + * + * @author 芋道源码 + */ +public interface WebSocketMessageSender { + + /** + * 发送消息给指定用户 + * + * @param userType 用户类型 + * @param userId 用户编号 + * @param messageType 消息类型 + * @param messageContent 消息内容,JSON 格式 + */ + void send(Integer userType, Long userId, String messageType, String messageContent); + + /** + * 发送消息给指定用户类型 + * + * @param userType 用户类型 + * @param messageType 消息类型 + * @param messageContent 消息内容,JSON 格式 + */ + void send(Integer userType, String messageType, String messageContent); + + /** + * 发送消息给指定 Session + * + * @param sessionId Session 编号 + * @param messageType 消息类型 + * @param messageContent 消息内容,JSON 格式 + */ + void send(String sessionId, String messageType, String messageContent); + + default void sendObject(Integer userType, Long userId, String messageType, Object messageContent) { + send(userType, userId, messageType, JsonUtils.toJsonString(messageContent)); + } + + default void sendObject(Integer userType, String messageType, Object messageContent) { + send(userType, messageType, JsonUtils.toJsonString(messageContent)); + } + + default void sendObject(String sessionId, String messageType, Object messageContent) { + send(sessionId, messageType, JsonUtils.toJsonString(messageContent)); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java new file mode 100644 index 0000000..da5544d --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java @@ -0,0 +1,35 @@ +package com.win.framework.websocket.core.sender.kafka; + +import lombok.Data; + +/** + * Kafka 广播 WebSocket 的消息 + * + * @author 芋道源码 + */ +@Data +public class KafkaWebSocketMessage { + + /** + * Session 编号 + */ + private String sessionId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 用户编号 + */ + private Long userId; + + /** + * 消息类型 + */ + private String messageType; + /** + * 消息内容 + */ + private String messageContent; + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java new file mode 100644 index 0000000..96c0e67 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java @@ -0,0 +1,28 @@ +package com.win.framework.websocket.core.sender.kafka; + +import lombok.RequiredArgsConstructor; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.kafka.annotation.KafkaListener; + +/** + * {@link KafkaWebSocketMessage} 广播消息的消费者,真正把消息发送出去 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class KafkaWebSocketMessageConsumer { + + private final KafkaWebSocketMessageSender rabbitMQWebSocketMessageSender; + + @RabbitHandler + @KafkaListener( + topics = "${win.websocket.sender-kafka.topic}", + // 在 Group 上,使用 UUID 生成其后缀。这样,启动的 Consumer 的 Group 不同,以达到广播消费的目的 + groupId = "${win.websocket.sender-kafka.consumer-group}" + "-" + "#{T(java.util.UUID).randomUUID()}") + public void onMessage(KafkaWebSocketMessage message) { + rabbitMQWebSocketMessageSender.send(message.getSessionId(), + message.getUserType(), message.getUserId(), + message.getMessageType(), message.getMessageContent()); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java new file mode 100644 index 0000000..337dc64 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java @@ -0,0 +1,67 @@ +package com.win.framework.websocket.core.sender.kafka; + +import com.win.framework.websocket.core.sender.AbstractWebSocketMessageSender; +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import com.win.framework.websocket.core.session.WebSocketSessionManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.kafka.core.KafkaTemplate; + +import java.util.concurrent.ExecutionException; + +/** + * 基于 Kafka 的 {@link WebSocketMessageSender} 实现类 + * + * @author 芋道源码 + */ +@Slf4j +public class KafkaWebSocketMessageSender extends AbstractWebSocketMessageSender { + + private final KafkaTemplate kafkaTemplate; + + private final String topic; + + public KafkaWebSocketMessageSender(WebSocketSessionManager sessionManager, + KafkaTemplate kafkaTemplate, + String topic) { + super(sessionManager); + this.kafkaTemplate = kafkaTemplate; + this.topic = topic; + } + + @Override + public void send(Integer userType, Long userId, String messageType, String messageContent) { + sendKafkaMessage(null, userId, userType, messageType, messageContent); + } + + @Override + public void send(Integer userType, String messageType, String messageContent) { + sendKafkaMessage(null, null, userType, messageType, messageContent); + } + + @Override + public void send(String sessionId, String messageType, String messageContent) { + sendKafkaMessage(sessionId, null, null, messageType, messageContent); + } + + /** + * 通过 Kafka 广播消息 + * + * @param sessionId Session 编号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param messageType 消息类型 + * @param messageContent 消息内容 + */ + private void sendKafkaMessage(String sessionId, Long userId, Integer userType, + String messageType, String messageContent) { + KafkaWebSocketMessage mqMessage = new KafkaWebSocketMessage() + .setSessionId(sessionId).setUserId(userId).setUserType(userType) + .setMessageType(messageType).setMessageContent(messageContent); + try { + kafkaTemplate.send(topic, mqMessage).get(); + } catch (InterruptedException | ExecutionException e) { + log.error("[sendKafkaMessage][发送消息({}) 到 Kafka 失败]", mqMessage, e); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/local/LocalWebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/local/LocalWebSocketMessageSender.java new file mode 100644 index 0000000..1b8d107 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/local/LocalWebSocketMessageSender.java @@ -0,0 +1,20 @@ +package com.win.framework.websocket.core.sender.local; + +import com.win.framework.websocket.core.sender.AbstractWebSocketMessageSender; +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import com.win.framework.websocket.core.session.WebSocketSessionManager; + +/** + * 本地的 {@link WebSocketMessageSender} 实现类 + * + * 注意:仅仅适合单机场景!!! + * + * @author 芋道源码 + */ +public class LocalWebSocketMessageSender extends AbstractWebSocketMessageSender { + + public LocalWebSocketMessageSender(WebSocketSessionManager sessionManager) { + super(sessionManager); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java new file mode 100644 index 0000000..0b57cec --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java @@ -0,0 +1,37 @@ +package com.win.framework.websocket.core.sender.rabbitmq; + +import lombok.Data; + +import java.io.Serializable; + +/** + * RabbitMQ 广播 WebSocket 的消息 + * + * @author 芋道源码 + */ +@Data +public class RabbitMQWebSocketMessage implements Serializable { + + /** + * Session 编号 + */ + private String sessionId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 用户编号 + */ + private Long userId; + + /** + * 消息类型 + */ + private String messageType; + /** + * 消息内容 + */ + private String messageContent; + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java new file mode 100644 index 0000000..411e193 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java @@ -0,0 +1,39 @@ +package com.win.framework.websocket.core.sender.rabbitmq; + +import lombok.RequiredArgsConstructor; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.*; + +/** + * {@link RabbitMQWebSocketMessage} 广播消息的消费者,真正把消息发送出去 + * + * @author 芋道源码 + */ +@RabbitListener( + bindings = @QueueBinding( + value = @Queue( + // 在 Queue 的名字上,使用 UUID 生成其后缀。这样,启动的 Consumer 的 Queue 不同,以达到广播消费的目的 + name = "${win.websocket.sender-rabbitmq.queue}" + "-" + "#{T(java.util.UUID).randomUUID()}", + // Consumer 关闭时,该队列就可以被自动删除了 + autoDelete = "true" + ), + exchange = @Exchange( + name = "${win.websocket.sender-rabbitmq.exchange}", + type = ExchangeTypes.TOPIC, + declare = "false" + ) + ) +) +@RequiredArgsConstructor +public class RabbitMQWebSocketMessageConsumer { + + private final RabbitMQWebSocketMessageSender rabbitMQWebSocketMessageSender; + + @RabbitHandler + public void onMessage(RabbitMQWebSocketMessage message) { + rabbitMQWebSocketMessageSender.send(message.getSessionId(), + message.getUserType(), message.getUserId(), + message.getMessageType(), message.getMessageContent()); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java new file mode 100644 index 0000000..15654d0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java @@ -0,0 +1,62 @@ +package com.win.framework.websocket.core.sender.rabbitmq; + +import com.win.framework.websocket.core.sender.AbstractWebSocketMessageSender; +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import com.win.framework.websocket.core.session.WebSocketSessionManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.rabbit.core.RabbitTemplate; + +/** + * 基于 RabbitMQ 的 {@link WebSocketMessageSender} 实现类 + * + * @author 芋道源码 + */ +@Slf4j +public class RabbitMQWebSocketMessageSender extends AbstractWebSocketMessageSender { + + private final RabbitTemplate rabbitTemplate; + + private final TopicExchange topicExchange; + + public RabbitMQWebSocketMessageSender(WebSocketSessionManager sessionManager, + RabbitTemplate rabbitTemplate, + TopicExchange topicExchange) { + super(sessionManager); + this.rabbitTemplate = rabbitTemplate; + this.topicExchange = topicExchange; + } + + @Override + public void send(Integer userType, Long userId, String messageType, String messageContent) { + sendRabbitMQMessage(null, userId, userType, messageType, messageContent); + } + + @Override + public void send(Integer userType, String messageType, String messageContent) { + sendRabbitMQMessage(null, null, userType, messageType, messageContent); + } + + @Override + public void send(String sessionId, String messageType, String messageContent) { + sendRabbitMQMessage(sessionId, null, null, messageType, messageContent); + } + + /** + * 通过 RabbitMQ 广播消息 + * + * @param sessionId Session 编号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param messageType 消息类型 + * @param messageContent 消息内容 + */ + private void sendRabbitMQMessage(String sessionId, Long userId, Integer userType, + String messageType, String messageContent) { + RabbitMQWebSocketMessage mqMessage = new RabbitMQWebSocketMessage() + .setSessionId(sessionId).setUserId(userId).setUserType(userType) + .setMessageType(messageType).setMessageContent(messageContent); + rabbitTemplate.convertAndSend(topicExchange.getName(), null, mqMessage); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessage.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessage.java new file mode 100644 index 0000000..043cd97 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessage.java @@ -0,0 +1,34 @@ +package com.win.framework.websocket.core.sender.redis; + +import com.win.framework.mq.redis.core.pubsub.AbstractRedisChannelMessage; +import lombok.Data; + +/** + * Redis 广播 WebSocket 的消息 + */ +@Data +public class RedisWebSocketMessage extends AbstractRedisChannelMessage { + + /** + * Session 编号 + */ + private String sessionId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 用户编号 + */ + private Long userId; + + /** + * 消息类型 + */ + private String messageType; + /** + * 消息内容 + */ + private String messageContent; + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java new file mode 100644 index 0000000..3a0bdac --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java @@ -0,0 +1,23 @@ +package com.win.framework.websocket.core.sender.redis; + +import com.win.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener; +import lombok.RequiredArgsConstructor; + +/** + * {@link RedisWebSocketMessage} 广播消息的消费者,真正把消息发送出去 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +public class RedisWebSocketMessageConsumer extends AbstractRedisChannelMessageListener { + + private final RedisWebSocketMessageSender redisWebSocketMessageSender; + + @Override + public void onMessage(RedisWebSocketMessage message) { + redisWebSocketMessageSender.send(message.getSessionId(), + message.getUserType(), message.getUserId(), + message.getMessageType(), message.getMessageContent()); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java new file mode 100644 index 0000000..4faf92f --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java @@ -0,0 +1,57 @@ +package com.win.framework.websocket.core.sender.redis; + +import com.win.framework.mq.redis.core.RedisMQTemplate; +import com.win.framework.websocket.core.sender.AbstractWebSocketMessageSender; +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import com.win.framework.websocket.core.session.WebSocketSessionManager; +import lombok.extern.slf4j.Slf4j; + +/** + * 基于 Redis 的 {@link WebSocketMessageSender} 实现类 + * + * @author 芋道源码 + */ +@Slf4j +public class RedisWebSocketMessageSender extends AbstractWebSocketMessageSender { + + private final RedisMQTemplate redisMQTemplate; + + public RedisWebSocketMessageSender(WebSocketSessionManager sessionManager, + RedisMQTemplate redisMQTemplate) { + super(sessionManager); + this.redisMQTemplate = redisMQTemplate; + } + + @Override + public void send(Integer userType, Long userId, String messageType, String messageContent) { + sendRedisMessage(null, userId, userType, messageType, messageContent); + } + + @Override + public void send(Integer userType, String messageType, String messageContent) { + sendRedisMessage(null, null, userType, messageType, messageContent); + } + + @Override + public void send(String sessionId, String messageType, String messageContent) { + sendRedisMessage(sessionId, null, null, messageType, messageContent); + } + + /** + * 通过 Redis 广播消息 + * + * @param sessionId Session 编号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param messageType 消息类型 + * @param messageContent 消息内容 + */ + private void sendRedisMessage(String sessionId, Long userId, Integer userType, + String messageType, String messageContent) { + RedisWebSocketMessage mqMessage = new RedisWebSocketMessage() + .setSessionId(sessionId).setUserId(userId).setUserType(userType) + .setMessageType(messageType).setMessageContent(messageContent); + redisMQTemplate.send(mqMessage); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java new file mode 100644 index 0000000..0efa532 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java @@ -0,0 +1,35 @@ +package com.win.framework.websocket.core.sender.rocketmq; + +import lombok.Data; + +/** + * RocketMQ 广播 WebSocket 的消息 + * + * @author 芋道源码 + */ +@Data +public class RocketMQWebSocketMessage { + + /** + * Session 编号 + */ + private String sessionId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 用户编号 + */ + private Long userId; + + /** + * 消息类型 + */ + private String messageType; + /** + * 消息内容 + */ + private String messageContent; + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java new file mode 100644 index 0000000..7ab491b --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java @@ -0,0 +1,30 @@ +package com.win.framework.websocket.core.sender.rocketmq; + +import lombok.RequiredArgsConstructor; +import org.apache.rocketmq.spring.annotation.MessageModel; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; + +/** + * {@link RocketMQWebSocketMessage} 广播消息的消费者,真正把消息发送出去 + * + * @author 芋道源码 + */ +@RocketMQMessageListener( // 重点:添加 @RocketMQMessageListener 注解,声明消费的 topic + topic = "${win.websocket.sender-rocketmq.topic}", + consumerGroup = "${win.websocket.sender-rocketmq.consumer-group}", + messageModel = MessageModel.BROADCASTING // 设置为广播模式,保证每个实例都能收到消息 +) +@RequiredArgsConstructor +public class RocketMQWebSocketMessageConsumer implements RocketMQListener { + + private final RocketMQWebSocketMessageSender rocketMQWebSocketMessageSender; + + @Override + public void onMessage(RocketMQWebSocketMessage message) { + rocketMQWebSocketMessageSender.send(message.getSessionId(), + message.getUserType(), message.getUserId(), + message.getMessageType(), message.getMessageContent()); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java new file mode 100644 index 0000000..9b1c7de --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java @@ -0,0 +1,61 @@ +package com.win.framework.websocket.core.sender.rocketmq; + +import com.win.framework.websocket.core.sender.AbstractWebSocketMessageSender; +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import com.win.framework.websocket.core.session.WebSocketSessionManager; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; + +/** + * 基于 RocketMQ 的 {@link WebSocketMessageSender} 实现类 + * + * @author 芋道源码 + */ +@Slf4j +public class RocketMQWebSocketMessageSender extends AbstractWebSocketMessageSender { + + private final RocketMQTemplate rocketMQTemplate; + + private final String topic; + + public RocketMQWebSocketMessageSender(WebSocketSessionManager sessionManager, + RocketMQTemplate rocketMQTemplate, + String topic) { + super(sessionManager); + this.rocketMQTemplate = rocketMQTemplate; + this.topic = topic; + } + + @Override + public void send(Integer userType, Long userId, String messageType, String messageContent) { + sendRocketMQMessage(null, userId, userType, messageType, messageContent); + } + + @Override + public void send(Integer userType, String messageType, String messageContent) { + sendRocketMQMessage(null, null, userType, messageType, messageContent); + } + + @Override + public void send(String sessionId, String messageType, String messageContent) { + sendRocketMQMessage(sessionId, null, null, messageType, messageContent); + } + + /** + * 通过 RocketMQ 广播消息 + * + * @param sessionId Session 编号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param messageType 消息类型 + * @param messageContent 消息内容 + */ + private void sendRocketMQMessage(String sessionId, Long userId, Integer userType, + String messageType, String messageContent) { + RocketMQWebSocketMessage mqMessage = new RocketMQWebSocketMessage() + .setSessionId(sessionId).setUserId(userId).setUserType(userType) + .setMessageType(messageType).setMessageContent(messageContent); + rocketMQTemplate.syncSend(topic, mqMessage); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionHandlerDecorator.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionHandlerDecorator.java new file mode 100644 index 0000000..e7dc887 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionHandlerDecorator.java @@ -0,0 +1,49 @@ +package com.win.framework.websocket.core.session; + +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator; +import org.springframework.web.socket.handler.WebSocketHandlerDecorator; + +/** + * {@link WebSocketHandler} 的装饰类,实现了以下功能: + * + * 1. {@link WebSocketSession} 连接或关闭时,使用 {@link #sessionManager} 进行管理 + * 2. 封装 {@link WebSocketSession} 支持并发操作 + * + * @author 芋道源码 + */ +public class WebSocketSessionHandlerDecorator extends WebSocketHandlerDecorator { + + /** + * 发送时间的限制,单位:毫秒 + */ + private static final Integer SEND_TIME_LIMIT = 1000 * 5; + /** + * 发送消息缓冲上线,单位:bytes + */ + private static final Integer BUFFER_SIZE_LIMIT = 1024 * 100; + + private final WebSocketSessionManager sessionManager; + + public WebSocketSessionHandlerDecorator(WebSocketHandler delegate, + WebSocketSessionManager sessionManager) { + super(delegate); + this.sessionManager = sessionManager; + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) { + // 实现 session 支持并发,可参考 https://blog.csdn.net/abu935009066/article/details/131218149 + session = new ConcurrentWebSocketSessionDecorator(session, SEND_TIME_LIMIT, BUFFER_SIZE_LIMIT); + // 添加到 WebSocketSessionManager 中 + sessionManager.addSession(session); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) { + sessionManager.removeSession(session); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManager.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManager.java new file mode 100644 index 0000000..01a222d --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManager.java @@ -0,0 +1,53 @@ +package com.win.framework.websocket.core.session; + +import org.springframework.web.socket.WebSocketSession; + +import java.util.Collection; + +/** + * {@link WebSocketSession} 管理器的接口 + * + * @author 芋道源码 + */ +public interface WebSocketSessionManager { + + /** + * 添加 Session + * + * @param session Session + */ + void addSession(WebSocketSession session); + + /** + * 移除 Session + * + * @param session Session + */ + void removeSession(WebSocketSession session); + + /** + * 获得指定编号的 Session + * + * @param id Session 编号 + * @return Session + */ + WebSocketSession getSession(String id); + + /** + * 获得指定用户类型的 Session 列表 + * + * @param userType 用户类型 + * @return Session 列表 + */ + Collection getSessionList(Integer userType); + + /** + * 获得指定用户编号的 Session 列表 + * + * @param userType 用户类型 + * @param userId 用户编号 + * @return Session 列表 + */ + Collection getSessionList(Integer userType, Long userId); + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManagerImpl.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManagerImpl.java new file mode 100644 index 0000000..a8fea07 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/session/WebSocketSessionManagerImpl.java @@ -0,0 +1,125 @@ +package com.win.framework.websocket.core.session; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.security.core.LoginUser; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.websocket.core.util.WebSocketFrameworkUtils; +import org.springframework.web.socket.WebSocketSession; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * 默认的 {@link WebSocketSessionManager} 实现类 + * + * @author 芋道源码 + */ +public class WebSocketSessionManagerImpl implements WebSocketSessionManager { + + /** + * id 与 WebSocketSession 映射 + * + * key:Session 编号 + */ + private final ConcurrentMap idSessions = new ConcurrentHashMap<>(); + + /** + * user 与 WebSocketSession 映射 + * + * key1:用户类型 + * key2:用户编号 + */ + private final ConcurrentMap>> userSessions + = new ConcurrentHashMap<>(); + + @Override + public void addSession(WebSocketSession session) { + // 添加到 idSessions 中 + idSessions.put(session.getId(), session); + // 添加到 userSessions 中 + LoginUser user = WebSocketFrameworkUtils.getLoginUser(session); + if (user == null) { + return; + } + ConcurrentMap> userSessionsMap = userSessions.get(user.getUserType()); + if (userSessionsMap == null) { + userSessionsMap = new ConcurrentHashMap<>(); + if (userSessions.putIfAbsent(user.getUserType(), userSessionsMap) != null) { + userSessionsMap = userSessions.get(user.getUserType()); + } + } + CopyOnWriteArrayList sessions = userSessionsMap.get(user.getId()); + if (sessions == null) { + sessions = new CopyOnWriteArrayList<>(); + if (userSessionsMap.putIfAbsent(user.getId(), sessions) != null) { + sessions = userSessionsMap.get(user.getId()); + } + } + sessions.add(session); + } + + @Override + public void removeSession(WebSocketSession session) { + // 移除从 idSessions 中 + idSessions.remove(session.getId()); + // 移除从 idSessions 中 + LoginUser user = WebSocketFrameworkUtils.getLoginUser(session); + if (user == null) { + return; + } + ConcurrentMap> userSessionsMap = userSessions.get(user.getUserType()); + if (userSessionsMap == null) { + return; + } + CopyOnWriteArrayList sessions = userSessionsMap.get(user.getId()); + sessions.removeIf(session0 -> session0.getId().equals(session.getId())); + if (CollUtil.isEmpty(sessions)) { + userSessionsMap.remove(user.getId(), sessions); + } + } + + @Override + public WebSocketSession getSession(String id) { + return idSessions.get(id); + } + + @Override + public Collection getSessionList(Integer userType) { + ConcurrentMap> userSessionsMap = userSessions.get(userType); + if (CollUtil.isEmpty(userSessionsMap)) { + return new ArrayList<>(); + } + LinkedList result = new LinkedList<>(); // 避免扩容 + Long contextTenantId = TenantContextHolder.getTenantId(); + for (List sessions : userSessionsMap.values()) { + if (CollUtil.isEmpty(sessions)) { + continue; + } + // 特殊:如果租户不匹配,则直接排除 + if (contextTenantId != null) { + Long userTenantId = WebSocketFrameworkUtils.getTenantId(sessions.get(0)); + if (!contextTenantId.equals(userTenantId)) { + continue; + } + } + result.addAll(sessions); + } + return result; + } + + @Override + public Collection getSessionList(Integer userType, Long userId) { + ConcurrentMap> userSessionsMap = userSessions.get(userType); + if (CollUtil.isEmpty(userSessionsMap)) { + return new ArrayList<>(); + } + CopyOnWriteArrayList sessions = userSessionsMap.get(userId); + return CollUtil.isNotEmpty(sessions) ? new ArrayList<>(sessions) : new ArrayList<>(); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/util/WebSocketFrameworkUtils.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/util/WebSocketFrameworkUtils.java new file mode 100644 index 0000000..6ae449c --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/util/WebSocketFrameworkUtils.java @@ -0,0 +1,67 @@ +package com.win.framework.websocket.core.util; + +import com.win.framework.security.core.LoginUser; +import org.springframework.web.socket.WebSocketSession; + +import java.util.Map; + +/** + * 专属于 web 包的工具类 + * + * @author 芋道源码 + */ +public class WebSocketFrameworkUtils { + + public static final String ATTRIBUTE_LOGIN_USER = "LOGIN_USER"; + + /** + * 设置当前用户 + * + * @param loginUser 登录用户 + * @param attributes Session + */ + public static void setLoginUser(LoginUser loginUser, Map attributes) { + attributes.put(ATTRIBUTE_LOGIN_USER, loginUser); + } + + /** + * 获取当前用户 + * + * @return 当前用户 + */ + public static LoginUser getLoginUser(WebSocketSession session) { + return (LoginUser) session.getAttributes().get(ATTRIBUTE_LOGIN_USER); + } + + /** + * 获得当前用户的编号 + * + * @return 用户编号 + */ + public static Long getLoginUserId(WebSocketSession session) { + LoginUser loginUser = getLoginUser(session); + return loginUser != null ? loginUser.getId() : null; + } + + /** + * 获得当前用户的类型 + * + * @return 用户编号 + */ + public static Integer getLoginUserType(WebSocketSession session) { + LoginUser loginUser = getLoginUser(session); + return loginUser != null ? loginUser.getUserType() : null; + } + + /** + * 获得当前用户的租户编号 + * + * @param session Session + * @return 租户编号 + */ + public static Long getTenantId(WebSocketSession session) { + LoginUser loginUser = getLoginUser(session); + return loginUser != null ? loginUser.getTenantId() : null; + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java new file mode 100644 index 0000000..85eee4a --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java @@ -0,0 +1,4 @@ +/** + * WebSocket 框架,支持多节点的广播 + */ +package com.win.framework.websocket; diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..21b10e0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.websocket.config.WinWebSocketAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-websocket/《芋道 Spring Boot WebSocket 入门》.md b/win-framework/win-spring-boot-starter-websocket/《芋道 Spring Boot WebSocket 入门》.md new file mode 100644 index 0000000..44e251c --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/《芋道 Spring Boot WebSocket 入门》.md @@ -0,0 +1 @@ + diff --git a/win-module-infra/pom.xml b/win-module-infra/pom.xml new file mode 100644 index 0000000..0b145e0 --- /dev/null +++ b/win-module-infra/pom.xml @@ -0,0 +1,25 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-module-infra-api + win-module-infra-biz + + win-module-infra + pom + + ${project.artifactId} + + infra 模块,主要提供两块能力: + 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + + + diff --git a/win-module-infra/win-module-infra-api/pom.xml b/win-module-infra/win-module-infra-api/pom.xml new file mode 100644 index 0000000..b0c7ba9 --- /dev/null +++ b/win-module-infra/win-module-infra-api/pom.xml @@ -0,0 +1,33 @@ + + + + com.win + win-module-infra + ${revision} + + 4.0.0 + win-module-infra-api + jar + + ${project.artifactId} + + infra 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/ConfigApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/ConfigApi.java new file mode 100644 index 0000000..ce8b2f6 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/ConfigApi.java @@ -0,0 +1,18 @@ +package com.win.module.infra.api.config; + +/** + * 参数配置 API 接口 + * + * @author 芋道源码 + */ +public interface ConfigApi { + + /** + * 根据参数键查询参数值 + * + * @param key 参数键 + * @return 参数值 + */ + String getConfigValueByKey(String key); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java new file mode 100644 index 0000000..02f19b7 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java @@ -0,0 +1,41 @@ +package com.win.module.infra.api.file; + +/** + * 文件 API 接口 + * + * @author 芋道源码 + */ +public interface FileApi { + + /** + * 保存文件,并返回文件的访问路径 + * + * @param content 文件内容 + * @return 文件路径 + */ + default String createFile(byte[] content) { + return createFile(null, null, content); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + default String createFile(String path, byte[] content) { + return createFile(null, path, content); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String name, String path, byte[] content); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java new file mode 100644 index 0000000..6207e05 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java @@ -0,0 +1,32 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; + +import jakarta.validation.Valid; +import org.springframework.scheduling.annotation.Async; + +/** + * API 访问日志的 API 接口 + * + * @author 芋道源码 + */ +public interface ApiAccessLogApi { + + /** + * 创建 API 访问日志 + * + * @param createDTO 创建信息 + */ + void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); + + /** + * 【异步】创建 API 访问日志 + * + * @param createDTO 访问日志 DTO + */ + @Async + default void createApiAccessLogAsync(ApiAccessLogCreateReqDTO createDTO) { + createApiAccessLog(createDTO); + } + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java new file mode 100644 index 0000000..9c468f8 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java @@ -0,0 +1,32 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; + +import jakarta.validation.Valid; +import org.springframework.scheduling.annotation.Async; + +/** + * API 错误日志的 API 接口 + * + * @author 芋道源码 + */ +public interface ApiErrorLogApi { + + /** + * 创建 API 错误日志 + * + * @param createDTO 创建信息 + */ + void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); + + /** + * 【异步】创建 API 异常日志 + * + * @param createDTO 异常日志 DTO + */ + @Async + default void createApiErrorLogAsync(ApiErrorLogCreateReqDTO createDTO) { + createApiErrorLog(createDTO); + } + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java new file mode 100644 index 0000000..1a18ae6 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java @@ -0,0 +1,103 @@ +package com.win.module.infra.api.logger.dto; + +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * API 访问日志 + * + * @author 芋道源码 + */ +@Data +public class ApiAccessLogCreateReqDTO { + + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + private String requestParams; + /** + * 响应结果 + */ + private String responseBody; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 操作模块 + */ + private String operateModule; + /** + * 操作名 + */ + private String operateName; + /** + * 操作分类 + * + * 枚举,参见 OperateTypeEnum 类 + */ + private Integer operateType; + + /** + * 开始请求时间 + */ + @NotNull(message = "开始请求时间不能为空") + private LocalDateTime beginTime; + /** + * 结束请求时间 + */ + @NotNull(message = "结束请求时间不能为空") + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + /** + * 结果码 + */ + @NotNull(message = "错误码不能为空") + private Integer resultCode; + /** + * 结果提示 + */ + private String resultMsg; + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java new file mode 100644 index 0000000..71c4c66 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java @@ -0,0 +1,107 @@ +package com.win.module.infra.api.logger.dto; + +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * API 错误日志 + * + * @author 芋道源码 + */ +@Data +public class ApiErrorLogCreateReqDTO { + + /** + * 链路编号 + */ + private String traceId; + /** + * 账号编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 异常时间 + */ + @NotNull(message = "异常时间不能为空") + private LocalDateTime exceptionTime; + /** + * 异常名 + */ + @NotNull(message = "异常名不能为空") + private String exceptionName; + /** + * 异常发生的类全名 + */ + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + /** + * 异常发生的类文件 + */ + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + /** + * 异常发生的方法名 + */ + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + */ + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + /** + * 异常的栈轨迹异常的栈轨迹 + */ + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + /** + * 异常导致的根消息 + */ + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + /** + * 异常导致的消息 + */ + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/package-info.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/package-info.java new file mode 100644 index 0000000..fb1cab7 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/package-info.java @@ -0,0 +1,4 @@ +/** + * infra API 包,定义暴露给其它模块的 API + */ +package com.win.module.infra.api; diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApi.java new file mode 100644 index 0000000..e342bd8 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApi.java @@ -0,0 +1,54 @@ +package com.win.module.infra.api.websocket; + +import com.win.framework.common.util.json.JsonUtils; + +/** + * WebSocket 发送器的 API 接口 + * + * 对 WebSocketMessageSender 进行封装,提供给其它模块使用 + * + * @author 芋道源码 + */ +public interface WebSocketSenderApi { + + /** + * 发送消息给指定用户 + * + * @param userType 用户类型 + * @param userId 用户编号 + * @param messageType 消息类型 + * @param messageContent 消息内容,JSON 格式 + */ + void send(Integer userType, Long userId, String messageType, String messageContent); + + /** + * 发送消息给指定用户类型 + * + * @param userType 用户类型 + * @param messageType 消息类型 + * @param messageContent 消息内容,JSON 格式 + */ + void send(Integer userType, String messageType, String messageContent); + + /** + * 发送消息给指定 Session + * + * @param sessionId Session 编号 + * @param messageType 消息类型 + * @param messageContent 消息内容,JSON 格式 + */ + void send(String sessionId, String messageType, String messageContent); + + default void sendObject(Integer userType, Long userId, String messageType, Object messageContent) { + send(userType, userId, messageType, JsonUtils.toJsonString(messageContent)); + } + + default void sendObject(Integer userType, String messageType, Object messageContent) { + send(userType, messageType, JsonUtils.toJsonString(messageContent)); + } + + default void sendObject(String sessionId, String messageType, Object messageContent) { + send(sessionId, messageType, JsonUtils.toJsonString(messageContent)); + } + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java new file mode 100644 index 0000000..722ad4d --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java @@ -0,0 +1,20 @@ +package com.win.module.infra.enums; + +/** + * Infra 字典类型的枚举类 + * + * @author 芋道源码 + */ +public interface DictTypeConstants { + + String JOB_STATUS = "infra_job_status"; // 定时任务状态的枚举 + String JOB_LOG_STATUS = "infra_job_log_status"; // 定时任务日志状态的枚举 + + String API_ERROR_LOG_PROCESS_STATUS = "infra_api_error_log_process_status"; // API 错误日志的处理状态的枚举 + + String CONFIG_TYPE = "infra_config_type"; // 参数配置类型 + String BOOLEAN_STRING = "infra_boolean_string"; // Boolean 是否类型 + + String OPERATE_TYPE = "infra_operate_type"; // 操作类型 + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..14c7631 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java @@ -0,0 +1,71 @@ +package com.win.module.infra.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * Infra 错误码枚举类 + * + * infra 系统,使用 1-001-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 参数配置 1-001-000-000 ========== + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_001_000_001, "参数配置不存在"); + ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1_001_000_002, "参数配置 key 重复"); + ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1_001_000_003, "不能删除类型为系统内置的参数配置"); + ErrorCode CONFIG_GET_VALUE_ERROR_IF_VISIBLE = new ErrorCode(1_001_000_004, "获取参数配置失败,原因:不允许获取不可见配置"); + + // ========== 定时任务 1-001-001-000 ========== + ErrorCode JOB_NOT_EXISTS = new ErrorCode(1_001_001_000, "定时任务不存在"); + ErrorCode JOB_HANDLER_EXISTS = new ErrorCode(1_001_001_001, "定时任务的处理器已经存在"); + ErrorCode JOB_CHANGE_STATUS_INVALID = new ErrorCode(1_001_001_002, "只允许修改为开启或者关闭状态"); + ErrorCode JOB_CHANGE_STATUS_EQUALS = new ErrorCode(1_001_001_003, "定时任务已经处于该状态,无需修改"); + ErrorCode JOB_UPDATE_ONLY_NORMAL_STATUS = new ErrorCode(1_001_001_004, "只有开启状态的任务,才可以修改"); + ErrorCode JOB_CRON_EXPRESSION_VALID = new ErrorCode(1_001_001_005, "CRON 表达式不正确"); + ErrorCode JOB_HANDLER_BEAN_NOT_EXISTS = new ErrorCode(1_001_001_006, "定时任务的处理器 Bean 不存在,注意 Bean 默认首字母小写"); + ErrorCode JOB_HANDLER_BEAN_TYPE_ERROR = new ErrorCode(1_001_001_007, "定时任务的处理器 Bean 类型不正确,未实现 JobHandler 接口"); + + // ========== API 错误日志 1-001-002-000 ========== + ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1_001_002_000, "API 错误日志不存在"); + ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1_001_002_001, "API 错误日志已处理"); + + // ========= 文件相关 1-001-003-000 ================= + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1_001_003_000, "文件路径已存在"); + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1_001_003_001, "文件不存在"); + ErrorCode FILE_IS_EMPTY = new ErrorCode(1_001_003_002, "文件为空"); + + // ========== 代码生成器 1-001-004-000 ========== + ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1_001_004_002, "表定义已经存在"); + ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1_001_004_001, "导入的表不存在"); + ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1_001_004_002, "导入的字段不存在"); + ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1_001_004_004, "表定义不存在"); + ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1_001_004_005, "字段义不存在"); + ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1_001_004_006, "同步的字段不存在"); + ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1_001_004_007, "同步失败,不存在改变"); + ErrorCode CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL = new ErrorCode(1_001_004_008, "数据库的表注释未填写"); + ErrorCode CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL = new ErrorCode(1_001_004_009, "数据库的表字段({})注释未填写"); + ErrorCode CODEGEN_MASTER_TABLE_NOT_EXISTS = new ErrorCode(1_001_004_010, "主表(id={})定义不存在,请检查"); + ErrorCode CODEGEN_SUB_COLUMN_NOT_EXISTS = new ErrorCode(1_001_004_011, "子表的字段(id={})不存在,请检查"); + ErrorCode CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE = new ErrorCode(1_001_004_012, "主表生成代码失败,原因:它没有子表"); + + // ========== 文件配置 1-001-006-000 ========== + ErrorCode FILE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_006_000, "文件配置不存在"); + ErrorCode FILE_CONFIG_DELETE_FAIL_MASTER = new ErrorCode(1_001_006_001, "该文件配置不允许删除,原因:它是主配置,删除会导致无法上传文件"); + + // ========== 数据源配置 1-001-007-000 ========== + ErrorCode DATA_SOURCE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_007_000, "数据源配置不存在"); + ErrorCode DATA_SOURCE_CONFIG_NOT_OK = new ErrorCode(1_001_007_001, "数据源配置不正确,无法进行连接"); + + // ========== 学生 1-001-201-000 ========== + ErrorCode DEMO01_CONTACT_NOT_EXISTS = new ErrorCode(1_001_201_000, "示例联系人不存在"); + ErrorCode DEMO02_CATEGORY_NOT_EXISTS = new ErrorCode(1_001_201_001, "示例分类不存在"); + ErrorCode DEMO02_CATEGORY_EXITS_CHILDREN = new ErrorCode(1_001_201_002, "存在存在子示例分类,无法删除"); + ErrorCode DEMO02_CATEGORY_PARENT_NOT_EXITS = new ErrorCode(1_001_201_003,"父级示例分类不存在"); + ErrorCode DEMO02_CATEGORY_PARENT_ERROR = new ErrorCode(1_001_201_004, "不能设置自己为父示例分类"); + ErrorCode DEMO02_CATEGORY_NAME_DUPLICATE = new ErrorCode(1_001_201_005, "已经存在该名字的示例分类"); + ErrorCode DEMO02_CATEGORY_PARENT_IS_CHILD = new ErrorCode(1_001_201_006, "不能设置自己的子示例分类为父示例分类"); + ErrorCode DEMO03_STUDENT_NOT_EXISTS = new ErrorCode(1_001_201_007, "学生不存在"); + ErrorCode DEMO03_GRADE_NOT_EXISTS = new ErrorCode(1_001_201_008, "学生班级不存在"); + ErrorCode DEMO03_GRADE_EXISTS = new ErrorCode(1_001_201_009, "学生班级已存在"); + +} diff --git a/win-module-infra/win-module-infra-biz/pom.xml b/win-module-infra/win-module-infra-biz/pom.xml new file mode 100644 index 0000000..3b8bcf2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/pom.xml @@ -0,0 +1,123 @@ + + + + com.win + win-module-infra + ${revision} + + 4.0.0 + win-module-infra-biz + jar + + ${project.artifactId} + + infra 模块,主要提供两块能力: + 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + + + + + com.win + win-module-system-api + ${revision} + + + com.win + win-module-infra-api + ${revision} + + + + + com.win + win-spring-boot-starter-biz-tenant + + + + + com.win + win-spring-boot-starter-security + + + + com.win + win-spring-boot-starter-websocket + + + + + com.win + win-spring-boot-starter-mybatis + + + com.baomidou + mybatis-plus-generator + + + + com.win + win-spring-boot-starter-redis + + + + + + + com.win + win-spring-boot-starter-job + + + + + com.win + win-spring-boot-starter-mq + + + + + + com.win + win-spring-boot-starter-excel + + + + org.apache.velocity + velocity-engine-core + + + + + com.win + win-spring-boot-starter-monitor + + + + de.codecentric + spring-boot-admin-starter-server + + + + + commons-net + commons-net + + + com.jcraft + jsch + + + io.minio + minio + + + + org.apache.tika + tika-core + + + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/config/ConfigApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/config/ConfigApiImpl.java new file mode 100644 index 0000000..0018c31 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/config/ConfigApiImpl.java @@ -0,0 +1,27 @@ +package com.win.module.infra.api.config; + +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import com.win.module.infra.service.config.ConfigService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 参数配置 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ConfigApiImpl implements ConfigApi { + + @Resource + private ConfigService configService; + + @Override + public String getConfigValueByKey(String key) { + ConfigDO config = configService.getConfigByKey(key); + return config != null ? config.getValue() : null; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java new file mode 100644 index 0000000..7b9bceb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java @@ -0,0 +1,26 @@ +package com.win.module.infra.api.file; + +import com.win.module.infra.service.file.FileService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 文件 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class FileApiImpl implements FileApi { + + @Resource + private FileService fileService; + + @Override + public String createFile(String name, String path, byte[] content) { + return fileService.createFile(name, path, content); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java new file mode 100644 index 0000000..f15ad35 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java @@ -0,0 +1,27 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.service.logger.ApiAccessLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * API 访问日志的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ApiAccessLogApiImpl implements ApiAccessLogApi { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @Override + public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) { + apiAccessLogService.createApiAccessLog(createDTO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java new file mode 100644 index 0000000..de3c934 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java @@ -0,0 +1,27 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.service.logger.ApiErrorLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * API 访问日志的 API 接口 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ApiErrorLogApiImpl implements ApiErrorLogApi { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @Override + public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) { + apiErrorLogService.createApiErrorLog(createDTO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/package-info.java new file mode 100644 index 0000000..1f23f65 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/package-info.java @@ -0,0 +1 @@ +package com.win.module.infra.api; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApiImpl.java new file mode 100644 index 0000000..3a99482 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/websocket/WebSocketSenderApiImpl.java @@ -0,0 +1,34 @@ +package com.win.module.infra.api.websocket; + +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + +/** + * WebSocket 发送器的 API 实现类 + * + * @author 芋道源码 + */ +@Component +public class WebSocketSenderApiImpl implements WebSocketSenderApi { + + @Resource + private WebSocketMessageSender webSocketMessageSender; + + @Override + public void send(Integer userType, Long userId, String messageType, String messageContent) { + webSocketMessageSender.send(userType, userId, messageType, messageContent); + } + + @Override + public void send(Integer userType, String messageType, String messageContent) { + webSocketMessageSender.send(userType, messageType, messageContent); + } + + @Override + public void send(String sessionId, String messageType, String messageContent) { + webSocketMessageSender.send(sessionId, messageType, messageContent); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/CodegenController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/CodegenController.java new file mode 100644 index 0000000..0256a2d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/CodegenController.java @@ -0,0 +1,151 @@ +package com.win.module.infra.controller.admin.codegen; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ZipUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; +import com.win.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; +import com.win.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; +import com.win.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import com.win.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.convert.codegen.CodegenConvert; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.service.codegen.CodegenService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment; + +@Tag(name = "管理后台 - 代码生成器") +@RestController +@RequestMapping("/infra/codegen") +@Validated +public class CodegenController { + + @Resource + private CodegenService codegenService; + + @GetMapping("/db/table/list") + @Operation(summary = "获得数据库自带的表定义列表", description = "会过滤掉已经导入 Codegen 的表") + @Parameters({ + @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1"), + @Parameter(name = "name", description = "表名,模糊匹配", example = "win"), + @Parameter(name = "comment", description = "描述,模糊匹配", example = "芋道") + }) + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getDatabaseTableList( + @RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId, + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "comment", required = false) String comment) { + return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment)); + } + + @GetMapping("/table/list") + @Operation(summary = "获得表定义列表") + @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1") + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getCodegenTableList(@RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId) { + List list = codegenService.getCodegenTableList(dataSourceConfigId); + return success(BeanUtils.toBean(list, CodegenTableRespVO.class)); + } + + @GetMapping("/table/page") + @Operation(summary = "获得表定义分页") + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getCodegenTablePage(@Valid CodegenTablePageReqVO pageReqVO) { + PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, CodegenTableRespVO.class)); + } + + @GetMapping("/detail") + @Operation(summary = "获得表和字段的明细") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { + CodegenTableDO table = codegenService.getCodegenTable(tableId); + List columns = codegenService.getCodegenColumnListByTableId(tableId); + // 拼装返回 + return success(CodegenConvert.INSTANCE.convert(table, columns)); + } + + @Operation(summary = "基于数据库的表结构,创建代码生成器的表和字段定义") + @PostMapping("/create-list") + @PreAuthorize("@ss.hasPermission('infra:codegen:create')") + public CommonResult> createCodegenList(@Valid @RequestBody CodegenCreateListReqVO reqVO) { + return success(codegenService.createCodegenList(getLoginUserId(), reqVO)); + } + + @Operation(summary = "更新数据库的表和字段定义") + @PutMapping("/update") + @PreAuthorize("@ss.hasPermission('infra:codegen:update')") + public CommonResult updateCodegen(@Valid @RequestBody CodegenUpdateReqVO updateReqVO) { + codegenService.updateCodegen(updateReqVO); + return success(true); + } + + @Operation(summary = "基于数据库的表结构,同步数据库的表和字段定义") + @PutMapping("/sync-from-db") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:update')") + public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { + codegenService.syncCodegenFromDB(tableId); + return success(true); + } + + @Operation(summary = "删除数据库的表和字段定义") + @DeleteMapping("/delete") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") + public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { + codegenService.deleteCodegen(tableId); + return success(true); + } + + @Operation(summary = "预览生成代码") + @GetMapping("/preview") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:preview')") + public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { + Map codes = codegenService.generationCodes(tableId); + return success(CodegenConvert.INSTANCE.convert(codes)); + } + + @Operation(summary = "下载生成代码") + @GetMapping("/download") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:download')") + public void downloadCodegen(@RequestParam("tableId") Long tableId, + HttpServletResponse response) throws IOException { + // 生成代码 + Map codes = codegenService.generationCodes(tableId); + // 构建 zip 包 + String[] paths = codes.keySet().toArray(new String[0]); + ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipUtil.zip(outputStream, paths, ins); + // 输出 + writeAttachment(response, "codegen.zip", outputStream.toByteArray()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java new file mode 100644 index 0000000..759bbe9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.infra.controller.admin.codegen.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO") +@Data +public class CodegenCreateListReqVO { + + @Schema(description = "数据源配置的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "数据源配置的编号不能为空") + private Long dataSourceConfigId; + + @Schema(description = "表名数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2, 3]") + @NotNull(message = "表名数组不能为空") + private List tableNames; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java new file mode 100644 index 0000000..216bb8e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.admin.codegen.vo; + +import com.win.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 代码生成表和字段的明细 Response VO") +@Data +public class CodegenDetailRespVO { + + @Schema(description = "表定义") + private CodegenTableRespVO table; + + @Schema(description = "字段定义") + private List columns; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java new file mode 100644 index 0000000..539318a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.infra.controller.admin.codegen.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 代码生成预览 Response VO,注意,每个文件都是一个该对象") +@Data +public class CodegenPreviewRespVO { + + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "java/com.win/adminserver/modules/system/controller/test/SysTestDemoController.java") + private String filePath; + + @Schema(description = "代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "Hello World") + private String code; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java new file mode 100644 index 0000000..02cd15c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.infra.controller.admin.codegen.vo; + +import com.win.module.infra.controller.admin.codegen.vo.column.CodegenColumnSaveReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTableSaveReqVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 代码生成表和字段的修改 Request VO") +@Data +public class CodegenUpdateReqVO { + + @Valid // 校验内嵌的字段 + @NotNull(message = "表定义不能为空") + private CodegenTableSaveReqVO table; + + @Valid // 校验内嵌的字段 + @NotNull(message = "字段定义不能为空") + private List columns; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java new file mode 100644 index 0000000..768ac29 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java @@ -0,0 +1,69 @@ +package com.win.module.infra.controller.admin.codegen.vo.column; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 代码生成字段定义 Response VO") +@Data +public class CodegenColumnRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long tableId; + + @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") + private String columnName; + + @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") + private String dataType; + + @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") + private String columnComment; + + @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean nullable; + + @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean primaryKey; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + private Integer ordinalPosition; + + @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") + private String javaType; + + @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") + private String javaField; + + @Schema(description = "字典类型", example = "sys_gender") + private String dictType; + + @Schema(description = "数据示例", example = "1024") + private String example; + + @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean createOperation; + + @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean updateOperation; + + @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean listOperation; + + @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") + private String listOperationCondition; + + @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean listOperationResult; + + @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") + private String htmlType; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java new file mode 100644 index 0000000..5eb4f67 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java @@ -0,0 +1,81 @@ +package com.win.module.infra.controller.admin.codegen.vo.column; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 代码生成字段定义创建/修改 Request VO") +@Data +public class CodegenColumnSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "表编号不能为空") + private Long tableId; + + @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") + @NotNull(message = "字段名不能为空") + private String columnName; + + @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") + @NotNull(message = "字段类型不能为空") + private String dataType; + + @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") + @NotNull(message = "字段描述不能为空") + private String columnComment; + + @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否允许为空不能为空") + private Boolean nullable; + + @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否主键不能为空") + private Boolean primaryKey; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "排序不能为空") + private Integer ordinalPosition; + + @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") + @NotNull(message = "Java 属性类型不能为空") + private String javaType; + + @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") + @NotNull(message = "Java 属性名不能为空") + private String javaField; + + @Schema(description = "字典类型", example = "sys_gender") + private String dictType; + + @Schema(description = "数据示例", example = "1024") + private String example; + + @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为 Create 创建操作的字段不能为空") + private Boolean createOperation; + + @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否为 Update 更新操作的字段不能为空") + private Boolean updateOperation; + + @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为 List 查询操作的字段不能为空") + private Boolean listOperation; + + @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") + @NotNull(message = "List 查询操作的条件类型不能为空") + private String listOperationCondition; + + @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为 List 查询操作的返回字段不能为空") + private Boolean listOperationResult; + + @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") + @NotNull(message = "显示类型不能为空") + private String htmlType; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java new file mode 100644 index 0000000..1ef6d90 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.admin.codegen.vo.table; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 表定义分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenTablePageReqVO extends PageParam { + + @Schema(description = "表名称,模糊匹配", example = "win") + private String tableName; + + @Schema(description = "表描述,模糊匹配", example = "芋道") + private String tableComment; + + @Schema(description = "实体,模糊匹配", example = "Win") + private String className; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java new file mode 100644 index 0000000..eb3e7be --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java @@ -0,0 +1,72 @@ +package com.win.module.infra.controller.admin.codegen.vo.table; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 代码生成表定义 Response VO") +@Data +public class CodegenTableRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer scene; + + @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + private String tableName; + + @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String tableComment; + + @Schema(description = "备注", example = "我是备注") + private String remark; + + @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") + private String moduleName; + + @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") + private String businessName; + + @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") + private String className; + + @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") + private String classComment; + + @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + private String author; + + @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer templateType; + + @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") + private Integer frontType; + + @Schema(description = "父菜单编号", example = "1024") + private Long parentMenuId; + + @Schema(description = "主表的编号", example = "2048") + private Long masterTableId; + @Schema(description = "子表关联主表的字段编号", example = "4096") + private Long subJoinColumnId; + @Schema(description = "主表与子表是否一对多", example = "4096") + private Boolean subJoinMany; + + @Schema(description = "树表的父字段编号", example = "8192") + private Long treeParentColumnId; + @Schema(description = "树表的名字字段编号", example = "16384") + private Long treeNameColumnId; + + @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer dataSourceConfigId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java new file mode 100644 index 0000000..8a10595 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java @@ -0,0 +1,100 @@ +package com.win.module.infra.controller.admin.codegen.vo.table; + +import cn.hutool.core.util.ObjectUtil; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 代码生成表定义创建/修改 Response VO") +@Data +public class CodegenTableSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "导入类型不能为空") + private Integer scene; + + @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "表名称不能为空") + private String tableName; + + @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotNull(message = "表描述不能为空") + private String tableComment; + + @Schema(description = "备注", example = "我是备注") + private String remark; + + @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") + @NotNull(message = "模块名不能为空") + private String moduleName; + + @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") + @NotNull(message = "业务名不能为空") + private String businessName; + + @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") + @NotNull(message = "类名称不能为空") + private String className; + + @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") + @NotNull(message = "类描述不能为空") + private String classComment; + + @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + @NotNull(message = "作者不能为空") + private String author; + + @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "模板类型不能为空") + private Integer templateType; + + @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") + @NotNull(message = "前端类型不能为空") + private Integer frontType; + + @Schema(description = "父菜单编号", example = "1024") + private Long parentMenuId; + + @Schema(description = "主表的编号", example = "2048") + private Long masterTableId; + @Schema(description = "子表关联主表的字段编号", example = "4096") + private Long subJoinColumnId; + @Schema(description = "主表与子表是否一对多", example = "4096") + private Boolean subJoinMany; + + @Schema(description = "树表的父字段编号", example = "8192") + private Long treeParentColumnId; + @Schema(description = "树表的名字字段编号", example = "16384") + private Long treeNameColumnId; + + @AssertTrue(message = "上级菜单不能为空,请前往 [修改生成配置 -> 生成信息] 界面,设置“上级菜单”字段") + @JsonIgnore + public boolean isParentMenuIdValid() { + // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 + return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene()) + || getParentMenuId() != null; + } + + @AssertTrue(message = "关联的父表信息不全") + @JsonIgnore + public boolean isSubValid() { + return ObjectUtil.notEqual(getTemplateType(), CodegenTemplateTypeEnum.SUB) + || (ObjectUtil.isAllNotEmpty(masterTableId, subJoinColumnId, subJoinMany)); + } + + @AssertTrue(message = "关联的树表信息不全") + @JsonIgnore + public boolean isTreeValid() { + return ObjectUtil.notEqual(templateType, CodegenTemplateTypeEnum.TREE) + || (ObjectUtil.isAllNotEmpty(treeParentColumnId, treeNameColumnId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java new file mode 100644 index 0000000..1c8d44d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.infra.controller.admin.codegen.vo.table; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 数据库的表定义 Response VO") +@Data +public class DatabaseTableRespVO { + + @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yuanma") + private String name; + + @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + private String comment; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/ConfigController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/ConfigController.java new file mode 100644 index 0000000..d20c7a8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/ConfigController.java @@ -0,0 +1,106 @@ +package com.win.module.infra.controller.admin.config; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.config.vo.*; +import com.win.module.infra.convert.config.ConfigConvert; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import com.win.module.infra.enums.ErrorCodeConstants; +import com.win.module.infra.service.config.ConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 参数配置") +@RestController +@RequestMapping("/infra/config") +@Validated +public class ConfigController { + + @Resource + private ConfigService configService; + + @PostMapping("/create") + @Operation(summary = "创建参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:create')") + public CommonResult createConfig(@Valid @RequestBody ConfigSaveReqVO createReqVO) { + return success(configService.createConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:update')") + public CommonResult updateConfig(@Valid @RequestBody ConfigSaveReqVO updateReqVO) { + configService.updateConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除参数配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:config:delete')") + public CommonResult deleteConfig(@RequestParam("id") Long id) { + configService.deleteConfig(id); + return success(true); + } + + @GetMapping(value = "/get") + @Operation(summary = "获得参数配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult getConfig(@RequestParam("id") Long id) { + return success(ConfigConvert.INSTANCE.convert(configService.getConfig(id))); + } + + @GetMapping(value = "/get-value-by-key") + @Operation(summary = "根据参数键名查询参数值", description = "不可见的配置,不允许返回给前端") + @Parameter(name = "key", description = "参数键", required = true, example = "yunai.biz.username") + public CommonResult getConfigKey(@RequestParam("key") String key) { + ConfigDO config = configService.getConfigByKey(key); + if (config == null) { + return success(null); + } + if (!config.getVisible()) { + throw exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE); + } + return success(config.getValue()); + } + + @GetMapping("/page") + @Operation(summary = "获取参数配置分页") + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult> getConfigPage(@Valid ConfigPageReqVO pageReqVO) { + PageResult page = configService.getConfigPage(pageReqVO); + return success(ConfigConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @Operation(summary = "导出参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportConfig(ConfigPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = configService.getConfigPage(exportReqVO).getList(); + // 输出 + ExcelUtils.write(response, "参数配置.xls", "数据", ConfigRespVO.class, + ConfigConvert.INSTANCE.convertList(list)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigPageReqVO.java new file mode 100644 index 0000000..f5a28e6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigPageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.admin.config.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 参数配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigPageReqVO extends PageParam { + + @Schema(description = "数据源名称,模糊匹配", example = "名称") + private String name; + + @Schema(description = "参数键名,模糊匹配", example = "yunai.db.username") + private String key; + + @Schema(description = "参数类型,参见 SysConfigTypeEnum 枚举", example = "1") + private Integer type; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigRespVO.java new file mode 100644 index 0000000..f80d786 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigRespVO.java @@ -0,0 +1,56 @@ +package com.win.module.infra.controller.admin.config.vo; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 参数配置信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ConfigRespVO { + + @Schema(description = "参数配置序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("参数配置序号") + private Long id; + + @Schema(description = "参数分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "biz") + @ExcelProperty("参数分类") + private String category; + + @Schema(description = "参数名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "数据库名") + @ExcelProperty("参数名称") + private String name; + + @Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yunai.db.username") + @ExcelProperty("参数键名") + private String key; + + @Schema(description = "参数键值", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("参数键值") + private String value; + + @Schema(description = "参数类型,参见 SysConfigTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "参数类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.CONFIG_TYPE) + private Integer type; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty(value = "是否可见", converter = DictConvert.class) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) + private Boolean visible; + + @Schema(description = "备注", example = "备注一下很帅气!") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigSaveReqVO.java new file mode 100644 index 0000000..d888bf7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/config/vo/ConfigSaveReqVO.java @@ -0,0 +1,45 @@ +package com.win.module.infra.controller.admin.config.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 参数配置创建/修改 Request VO") +@Data +public class ConfigSaveReqVO { + + @Schema(description = "参数配置序号", example = "1024") + private Long id; + + @Schema(description = "参数分组", requiredMode = Schema.RequiredMode.REQUIRED, example = "biz") + @NotEmpty(message = "参数分组不能为空") + @Size(max = 50, message = "参数名称不能超过 50 个字符") + private String category; + + @Schema(description = "参数名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "数据库名") + @NotBlank(message = "参数名称不能为空") + @Size(max = 100, message = "参数名称不能超过 100 个字符") + private String name; + + @Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过 100 个字符") + private String key; + + @Schema(description = "参数键值", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotBlank(message = "参数键值不能为空") + @Size(max = 500, message = "参数键值长度不能超过 500 个字符") + private String value; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否可见不能为空") + private Boolean visible; + + @Schema(description = "备注", example = "备注一下很帅气!") + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/DataSourceConfigController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/DataSourceConfigController.java new file mode 100644 index 0000000..448810e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/DataSourceConfigController.java @@ -0,0 +1,72 @@ +package com.win.module.infra.controller.admin.db; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.db.vo.DataSourceConfigRespVO; +import com.win.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.win.module.infra.service.db.DataSourceConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 数据源配置") +@RestController +@RequestMapping("/infra/data-source-config") +@Validated +public class DataSourceConfigController { + + @Resource + private DataSourceConfigService dataSourceConfigService; + + @PostMapping("/create") + @Operation(summary = "创建数据源配置") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:create')") + public CommonResult createDataSourceConfig(@Valid @RequestBody DataSourceConfigSaveReqVO createReqVO) { + return success(dataSourceConfigService.createDataSourceConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新数据源配置") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:update')") + public CommonResult updateDataSourceConfig(@Valid @RequestBody DataSourceConfigSaveReqVO updateReqVO) { + dataSourceConfigService.updateDataSourceConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除数据源配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") + public CommonResult deleteDataSourceConfig(@RequestParam("id") Long id) { + dataSourceConfigService.deleteDataSourceConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得数据源配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") + public CommonResult getDataSourceConfig(@RequestParam("id") Long id) { + DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(id); + return success(BeanUtils.toBean(config, DataSourceConfigRespVO.class)); + } + + @GetMapping("/list") + @Operation(summary = "获得数据源配置列表") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") + public CommonResult> getDataSourceConfigList() { + List list = dataSourceConfigService.getDataSourceConfigList(); + return success(BeanUtils.toBean(list, DataSourceConfigRespVO.class)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java new file mode 100644 index 0000000..6a2f5de --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java @@ -0,0 +1,27 @@ +package com.win.module.infra.controller.admin.db.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 数据源配置 Response VO") +@Data +public class DataSourceConfigRespVO { + + @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer id; + + @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") + private String name; + + @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro") + private String url; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") + private String username; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java new file mode 100644 index 0000000..9e7f93d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.admin.db.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 数据源配置创建/修改 Request VO") +@Data +public class DataSourceConfigSaveReqVO { + + @Schema(description = "主键编号", example = "1024") + private Long id; + + @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") + @NotNull(message = "数据源名称不能为空") + private String name; + + @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro") + @NotNull(message = "数据源连接不能为空") + private String url; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") + @NotNull(message = "用户名不能为空") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotNull(message = "密码不能为空") + private String password; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/Demo01ContactController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/Demo01ContactController.java new file mode 100644 index 0000000..65d8656 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/Demo01ContactController.java @@ -0,0 +1,93 @@ +package com.win.module.infra.controller.admin.demo.demo01; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactRespVO; +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO; +import com.win.module.infra.service.demo.demo01.Demo01ContactService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 示例联系人") +@RestController +@RequestMapping("/infra/demo01-contact") +@Validated +public class Demo01ContactController { + + @Resource + private Demo01ContactService demo01ContactService; + + @PostMapping("/create") + @Operation(summary = "创建示例联系人") + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:create')") + public CommonResult createDemo01Contact(@Valid @RequestBody Demo01ContactSaveReqVO createReqVO) { + return success(demo01ContactService.createDemo01Contact(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新示例联系人") + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:update')") + public CommonResult updateDemo01Contact(@Valid @RequestBody Demo01ContactSaveReqVO updateReqVO) { + demo01ContactService.updateDemo01Contact(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除示例联系人") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:delete')") + public CommonResult deleteDemo01Contact(@RequestParam("id") Long id) { + demo01ContactService.deleteDemo01Contact(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得示例联系人") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:query')") + public CommonResult getDemo01Contact(@RequestParam("id") Long id) { + Demo01ContactDO demo01Contact = demo01ContactService.getDemo01Contact(id); + return success(BeanUtils.toBean(demo01Contact, Demo01ContactRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得示例联系人分页") + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:query')") + public CommonResult> getDemo01ContactPage(@Valid Demo01ContactPageReqVO pageReqVO) { + PageResult pageResult = demo01ContactService.getDemo01ContactPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, Demo01ContactRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出示例联系人 Excel") + @PreAuthorize("@ss.hasPermission('infra:demo01-contact:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDemo01ContactExcel(@Valid Demo01ContactPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = demo01ContactService.getDemo01ContactPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "示例联系人.xls", "数据", Demo01ContactRespVO.class, + BeanUtils.toBean(list, Demo01ContactRespVO.class)); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactPageReqVO.java new file mode 100644 index 0000000..2629e87 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactPageReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.infra.controller.admin.demo.demo01.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 示例联系人分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Demo01ContactPageReqVO extends PageParam { + + @Schema(description = "名字", example = "张三") + private String name; + + @Schema(description = "性别", example = "1") + private Integer sex; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactRespVO.java new file mode 100644 index 0000000..d5da162 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactRespVO.java @@ -0,0 +1,47 @@ +package com.win.module.infra.controller.admin.demo.demo01.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 示例联系人 Response VO") +@Data +@ExcelIgnoreUnannotated +public class Demo01ContactRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21555") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("名字") + private String name; + + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "性别", converter = DictConvert.class) + @DictFormat("system_user_sex") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer sex; + + @Schema(description = "出生年", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("出生年") + private LocalDateTime birthday; + + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + @ExcelProperty("简介") + private String description; + + @Schema(description = "头像") + @ExcelProperty("头像") + private String avatar; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactSaveReqVO.java new file mode 100644 index 0000000..f8dc983 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo01/vo/Demo01ContactSaveReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.infra.controller.admin.demo.demo01.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 示例联系人新增/修改 Request VO") +@Data +public class Demo01ContactSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21555") + private Long id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "名字不能为空") + private String name; + + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "性别不能为空") + private Integer sex; + + @Schema(description = "出生年", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "出生年不能为空") + private LocalDateTime birthday; + + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + @NotEmpty(message = "简介不能为空") + private String description; + + @Schema(description = "头像") + private String avatar; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/Demo02CategoryController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/Demo02CategoryController.java new file mode 100644 index 0000000..7c5b027 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/Demo02CategoryController.java @@ -0,0 +1,90 @@ +package com.win.module.infra.controller.admin.demo.demo02; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryRespVO; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; +import com.win.module.infra.service.demo.demo02.Demo02CategoryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 示例分类") +@RestController +@RequestMapping("/infra/demo02-category") +@Validated +public class Demo02CategoryController { + + @Resource + private Demo02CategoryService demo02CategoryService; + + @PostMapping("/create") + @Operation(summary = "创建示例分类") + @PreAuthorize("@ss.hasPermission('infra:demo02-category:create')") + public CommonResult createDemo02Category(@Valid @RequestBody Demo02CategorySaveReqVO createReqVO) { + return success(demo02CategoryService.createDemo02Category(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新示例分类") + @PreAuthorize("@ss.hasPermission('infra:demo02-category:update')") + public CommonResult updateDemo02Category(@Valid @RequestBody Demo02CategorySaveReqVO updateReqVO) { + demo02CategoryService.updateDemo02Category(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除示例分类") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:demo02-category:delete')") + public CommonResult deleteDemo02Category(@RequestParam("id") Long id) { + demo02CategoryService.deleteDemo02Category(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得示例分类") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:demo02-category:query')") + public CommonResult getDemo02Category(@RequestParam("id") Long id) { + Demo02CategoryDO demo02Category = demo02CategoryService.getDemo02Category(id); + return success(BeanUtils.toBean(demo02Category, Demo02CategoryRespVO.class)); + } + + @GetMapping("/list") + @Operation(summary = "获得示例分类列表") + @PreAuthorize("@ss.hasPermission('infra:demo02-category:query')") + public CommonResult> getDemo02CategoryList(@Valid Demo02CategoryListReqVO listReqVO) { + List list = demo02CategoryService.getDemo02CategoryList(listReqVO); + return success(BeanUtils.toBean(list, Demo02CategoryRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出示例分类 Excel") + @PreAuthorize("@ss.hasPermission('infra:demo02-category:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDemo02CategoryExcel(@Valid Demo02CategoryListReqVO listReqVO, + HttpServletResponse response) throws IOException { + List list = demo02CategoryService.getDemo02CategoryList(listReqVO); + // 导出 Excel + ExcelUtils.write(response, "示例分类.xls", "数据", Demo02CategoryRespVO.class, + BeanUtils.toBean(list, Demo02CategoryRespVO.class)); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryListReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryListReqVO.java new file mode 100644 index 0000000..3635af3 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryListReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.infra.controller.admin.demo.demo02.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 示例分类列表 Request VO") +@Data +public class Demo02CategoryListReqVO { + + @Schema(description = "名字", example = "芋艿") + private String name; + + @Schema(description = "父级编号", example = "6080") + private Long parentId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryRespVO.java new file mode 100644 index 0000000..7b63e24 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryRespVO.java @@ -0,0 +1,31 @@ +package com.win.module.infra.controller.admin.demo.demo02.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 示例分类 Response VO") +@Data +@ExcelIgnoreUnannotated +public class Demo02CategoryRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10304") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("名字") + private String name; + + @Schema(description = "父级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6080") + @ExcelProperty("父级编号") + private Long parentId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategorySaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategorySaveReqVO.java new file mode 100644 index 0000000..21f9344 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo02/vo/Demo02CategorySaveReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.infra.controller.admin.demo.demo02.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 示例分类新增/修改 Request VO") +@Data +public class Demo02CategorySaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10304") + private Long id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "名字不能为空") + private String name; + + @Schema(description = "父级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6080") + @NotNull(message = "父级编号不能为空") + private Long parentId; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/Demo03StudentController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/Demo03StudentController.java new file mode 100644 index 0000000..7071448 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/Demo03StudentController.java @@ -0,0 +1,197 @@ +package com.win.module.infra.controller.admin.demo.demo03; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentRespVO; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; +import com.win.module.infra.service.demo.demo03.Demo03StudentService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 学生") +@RestController +@RequestMapping("/infra/demo03-student") +@Validated +public class Demo03StudentController { + + @Resource + private Demo03StudentService demo03StudentService; + + @PostMapping("/create") + @Operation(summary = "创建学生") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')") + public CommonResult createDemo03Student(@Valid @RequestBody Demo03StudentSaveReqVO createReqVO) { + return success(demo03StudentService.createDemo03Student(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新学生") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')") + public CommonResult updateDemo03Student(@Valid @RequestBody Demo03StudentSaveReqVO updateReqVO) { + demo03StudentService.updateDemo03Student(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除学生") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')") + public CommonResult deleteDemo03Student(@RequestParam("id") Long id) { + demo03StudentService.deleteDemo03Student(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得学生") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult getDemo03Student(@RequestParam("id") Long id) { + Demo03StudentDO demo03Student = demo03StudentService.getDemo03Student(id); + return success(BeanUtils.toBean(demo03Student, Demo03StudentRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得学生分页") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult> getDemo03StudentPage(@Valid Demo03StudentPageReqVO pageReqVO) { + PageResult pageResult = demo03StudentService.getDemo03StudentPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, Demo03StudentRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出学生 Excel") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDemo03StudentExcel(@Valid Demo03StudentPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = demo03StudentService.getDemo03StudentPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "学生.xls", "数据", Demo03StudentRespVO.class, + BeanUtils.toBean(list, Demo03StudentRespVO.class)); + } + + // ==================== 子表(学生课程) ==================== + + @GetMapping("/demo03-course/page") + @Operation(summary = "获得学生课程分页") + @Parameter(name = "studentId", description = "学生编号") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult> getDemo03CoursePage(PageParam pageReqVO, + @RequestParam("studentId") Long studentId) { + return success(demo03StudentService.getDemo03CoursePage(pageReqVO, studentId)); + } + + @PostMapping("/demo03-course/create") + @Operation(summary = "创建学生课程") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')") + public CommonResult createDemo03Course(@Valid @RequestBody Demo03CourseDO demo03Course) { + return success(demo03StudentService.createDemo03Course(demo03Course)); + } + + @PutMapping("/demo03-course/update") + @Operation(summary = "更新学生课程") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')") + public CommonResult updateDemo03Course(@Valid @RequestBody Demo03CourseDO demo03Course) { + demo03StudentService.updateDemo03Course(demo03Course); + return success(true); + } + + @DeleteMapping("/demo03-course/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除学生课程") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')") + public CommonResult deleteDemo03Course(@RequestParam("id") Long id) { + demo03StudentService.deleteDemo03Course(id); + return success(true); + } + + @GetMapping("/demo03-course/get") + @Operation(summary = "获得学生课程") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult getDemo03Course(@RequestParam("id") Long id) { + return success(demo03StudentService.getDemo03Course(id)); + } + + @GetMapping("/demo03-course/list-by-student-id") + @Operation(summary = "获得学生课程列表") + @Parameter(name = "studentId", description = "学生编号") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult> getDemo03CourseListByStudentId(@RequestParam("studentId") Long studentId) { + return success(demo03StudentService.getDemo03CourseListByStudentId(studentId)); + } + + // ==================== 子表(学生班级) ==================== + + @GetMapping("/demo03-grade/page") + @Operation(summary = "获得学生班级分页") + @Parameter(name = "studentId", description = "学生编号") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult> getDemo03GradePage(PageParam pageReqVO, + @RequestParam("studentId") Long studentId) { + return success(demo03StudentService.getDemo03GradePage(pageReqVO, studentId)); + } + + @PostMapping("/demo03-grade/create") + @Operation(summary = "创建学生班级") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:create')") + public CommonResult createDemo03Grade(@Valid @RequestBody Demo03GradeDO demo03Grade) { + return success(demo03StudentService.createDemo03Grade(demo03Grade)); + } + + @PutMapping("/demo03-grade/update") + @Operation(summary = "更新学生班级") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:update')") + public CommonResult updateDemo03Grade(@Valid @RequestBody Demo03GradeDO demo03Grade) { + demo03StudentService.updateDemo03Grade(demo03Grade); + return success(true); + } + + @DeleteMapping("/demo03-grade/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除学生班级") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:delete')") + public CommonResult deleteDemo03Grade(@RequestParam("id") Long id) { + demo03StudentService.deleteDemo03Grade(id); + return success(true); + } + + @GetMapping("/demo03-grade/get") + @Operation(summary = "获得学生班级") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult getDemo03Grade(@RequestParam("id") Long id) { + return success(demo03StudentService.getDemo03Grade(id)); + } + + @GetMapping("/demo03-grade/get-by-student-id") + @Operation(summary = "获得学生班级") + @Parameter(name = "studentId", description = "学生编号") + @PreAuthorize("@ss.hasPermission('infra:demo03-student:query')") + public CommonResult getDemo03GradeByStudentId(@RequestParam("studentId") Long studentId) { + return success(demo03StudentService.getDemo03GradeByStudentId(studentId)); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/package-info.java new file mode 100644 index 0000000..ca08ccf --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/package-info.java @@ -0,0 +1 @@ +package com.win.module.infra.controller.admin.demo.demo03; \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentPageReqVO.java new file mode 100644 index 0000000..9a63884 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.admin.demo.demo03.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 学生分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Demo03StudentPageReqVO extends PageParam { + + @Schema(description = "名字", example = "芋艿") + private String name; + + @Schema(description = "性别") + private Integer sex; + + @Schema(description = "简介", example = "随便") + private String description; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentRespVO.java new file mode 100644 index 0000000..7e9a780 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentRespVO.java @@ -0,0 +1,41 @@ +package com.win.module.infra.controller.admin.demo.demo03.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 学生 Response VO") +@Data +@ExcelIgnoreUnannotated +public class Demo03StudentRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("名字") + private String name; + + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "性别", converter = DictConvert.class) + @DictFormat("system_user_sex") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer sex; + + @Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("出生日期") + private LocalDateTime birthday; + + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便") + @ExcelProperty("简介") + private String description; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentSaveReqVO.java new file mode 100644 index 0000000..104ffc8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/demo03/vo/Demo03StudentSaveReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.infra.controller.admin.demo.demo03.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; +import java.time.LocalDateTime; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; + +@Schema(description = "管理后台 - 学生新增/修改 Request VO") +@Data +public class Demo03StudentSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8525") + private Long id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "名字不能为空") + private String name; + + @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "性别不能为空") + private Integer sex; + + @Schema(description = "出生日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "出生日期不能为空") + private LocalDateTime birthday; + + @Schema(description = "简介", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便") + @NotEmpty(message = "简介不能为空") + private String description; + + + private List demo03Courses; + + private Demo03GradeDO demo03Grade; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/package-info.java new file mode 100644 index 0000000..4fb399a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/demo/package-info.java @@ -0,0 +1,8 @@ +/** + * 代码生成示例 + * + * 1. demo01:单表(增删改查) + * 2. demo02:单表(树形结构) + * 3. demo03:主子表(标准模式)+ 主子表(ERP 模式)+ 主子表(内嵌模式) + */ +package com.win.module.infra.controller.admin.demo; \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.http b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.http new file mode 100644 index 0000000..79b231c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.http @@ -0,0 +1,45 @@ +### 请求 /infra/file-config/create 接口 => 成功 +POST {{baseUrl}}/infra/file-config/create +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "name": "S3 - 七牛云", + "remark": "", + "storage": 20, + "config": { + "accessKey": "b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8", + "accessSecret": "kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP", + "bucket": "ruoyi-vue-pro", + "endpoint": "s3-cn-south-1.qiniucs.com", + "domain": "http://test.win.iocoder.cn", + "region": "oss-cn-beijing" + } +} + +### 请求 /infra/file-config/update 接口 => 成功 +PUT {{baseUrl}}/infra/file-config/update +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "id": 2, + "name": "S3 - 七牛云", + "remark": "", + "config": { + "accessKey": "b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8", + "accessSecret": "kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP", + "bucket": "ruoyi-vue-pro", + "endpoint": "s3-cn-south-1.qiniucs.com", + "domain": "http://test.win.iocoder.cn", + "region": "oss-cn-beijing" + } +} + +### 请求 /infra/file-config/test 接口 => 成功 +GET {{baseUrl}}/infra/file-config/test?id=2 +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.java new file mode 100644 index 0000000..1de2fa4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileConfigController.java @@ -0,0 +1,88 @@ +package com.win.module.infra.controller.admin.file; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigRespVO; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import com.win.module.infra.service.file.FileConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 文件配置") +@RestController +@RequestMapping("/infra/file-config") +@Validated +public class FileConfigController { + + @Resource + private FileConfigService fileConfigService; + + @PostMapping("/create") + @Operation(summary = "创建文件配置") + @PreAuthorize("@ss.hasPermission('infra:file-config:create')") + public CommonResult createFileConfig(@Valid @RequestBody FileConfigSaveReqVO createReqVO) { + return success(fileConfigService.createFileConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新文件配置") + @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + public CommonResult updateFileConfig(@Valid @RequestBody FileConfigSaveReqVO updateReqVO) { + fileConfigService.updateFileConfig(updateReqVO); + return success(true); + } + + @PutMapping("/update-master") + @Operation(summary = "更新文件配置为 Master") + @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + public CommonResult updateFileConfigMaster(@RequestParam("id") Long id) { + fileConfigService.updateFileConfigMaster(id); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除文件配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + public CommonResult deleteFileConfig(@RequestParam("id") Long id) { + fileConfigService.deleteFileConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得文件配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult getFileConfig(@RequestParam("id") Long id) { + FileConfigDO config = fileConfigService.getFileConfig(id); + return success(BeanUtils.toBean(config, FileConfigRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得文件配置分页") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult> getFileConfigPage(@Valid FileConfigPageReqVO pageVO) { + PageResult pageResult = fileConfigService.getFileConfigPage(pageVO); + return success(BeanUtils.toBean(pageResult, FileConfigRespVO.class)); + } + + @GetMapping("/test") + @Operation(summary = "测试文件配置是否正确") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult testFileConfig(@RequestParam("id") Long id) throws Exception { + String url = fileConfigService.testFileConfig(id); + return success(url); + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileController.java new file mode 100644 index 0000000..f3574bf --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/FileController.java @@ -0,0 +1,102 @@ +package com.win.module.infra.controller.admin.file; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.file.vo.file.*; +import com.win.module.infra.dal.dataobject.file.FileDO; +import com.win.module.infra.service.file.FileService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment; + +@Tag(name = "管理后台 - 文件存储") +@RestController +@RequestMapping("/infra/file") +@Validated +@Slf4j +public class FileController { + + @Resource + private FileService fileService; + + @PostMapping("/upload") + @Operation(summary = "上传文件", description = "模式一:后端上传文件") + public CommonResult uploadFile(FileUploadReqVO uploadReqVO) throws Exception { + MultipartFile file = uploadReqVO.getFile(); + String path = uploadReqVO.getPath(); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); + } + + @GetMapping("/presigned-url") + @Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器") + public CommonResult getFilePresignedUrl(@RequestParam("path") String path) throws Exception { + return success(fileService.getFilePresignedUrl(path)); + } + + @PostMapping("/create") + @Operation(summary = "创建文件", description = "模式二:前端上传文件:配合 presigned-url 接口,记录上传了上传的文件") + public CommonResult createFile(@Valid @RequestBody FileCreateReqVO createReqVO) { + return success(fileService.createFile(createReqVO)); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除文件") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFile(@RequestParam("id") Long id) throws Exception { + fileService.deleteFile(id); + return success(true); + } + + @GetMapping("/{configId}/get/**") + @PermitAll + @Operation(summary = "下载文件") + @Parameter(name = "configId", description = "配置编号", required = true) + public void getFileContent(HttpServletRequest request, + HttpServletResponse response, + @PathVariable("configId") Long configId) throws Exception { + // 获取请求的路径 + String path = StrUtil.subAfter(request.getRequestURI(), "/get/", false); + if (StrUtil.isEmpty(path)) { + throw new IllegalArgumentException("结尾的 path 路径必须传递"); + } + // 解码,解决中文路径的问题 https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/807/ + path = URLUtil.decode(path); + + // 读取内容 + byte[] content = fileService.getFileContent(configId, path); + if (content == null) { + log.warn("[getFileContent][configId({}) path({}) 文件不存在]", configId, path); + response.setStatus(HttpStatus.NOT_FOUND.value()); + return; + } + writeAttachment(response, path, content); + } + + @GetMapping("/page") + @Operation(summary = "获得文件分页") + @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> getFilePage(@Valid FilePageReqVO pageVO) { + PageResult pageResult = fileService.getFilePage(pageVO); + return success(BeanUtils.toBean(pageResult, FileRespVO.class)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java new file mode 100644 index 0000000..89060e4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.admin.file.vo.config; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 文件配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigPageReqVO extends PageParam { + + @Schema(description = "配置名", example = "S3 - 阿里云") + private String name; + + @Schema(description = "存储器", example = "1") + private Integer storage; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java new file mode 100644 index 0000000..ac76d31 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java @@ -0,0 +1,34 @@ +package com.win.module.infra.controller.admin.file.vo.config; + +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 文件配置 Response VO") +@Data +public class FileConfigRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "配置名", requiredMode = Schema.RequiredMode.REQUIRED, example = "S3 - 阿里云") + private String name; + + @Schema(description = "存储器,参见 FileStorageEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer storage; + + @Schema(description = "是否为主配置", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean master; + + @Schema(description = "存储配置", requiredMode = Schema.RequiredMode.REQUIRED) + private FileClientConfig config; + + @Schema(description = "备注", example = "我是备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigSaveReqVO.java new file mode 100644 index 0000000..c038efd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/config/FileConfigSaveReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.infra.controller.admin.file.vo.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 文件配置创建/修改 Request VO") +@Data +public class FileConfigSaveReqVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "配置名", requiredMode = Schema.RequiredMode.REQUIRED, example = "S3 - 阿里云") + @NotNull(message = "配置名不能为空") + private String name; + + @Schema(description = "存储器,参见 FileStorageEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "存储器不能为空") + private Integer storage; + + @Schema(description = "存储配置,配置是动态参数,所以使用 Map 接收", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "存储配置不能为空") + private Map config; + + @Schema(description = "备注", example = "我是备注") + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileCreateReqVO.java new file mode 100644 index 0000000..f19e361 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileCreateReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.admin.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - 文件创建 Request VO") +@Data +public class FileCreateReqVO { + + @NotNull(message = "文件配置编号不能为空") + @Schema(description = "文件配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11") + private Long configId; + + @NotNull(message = "文件路径不能为空") + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "win.jpg") + private String path; + + @NotNull(message = "原文件名不能为空") + @Schema(description = "原文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win.jpg") + private String name; + + @NotNull(message = "文件 URL不能为空") + @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/win.jpg") + private String url; + + @Schema(description = "文件 MIME 类型", example = "application/octet-stream") + private String type; + + @Schema(description = "文件大小", example = "2048", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer size; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePageReqVO.java new file mode 100644 index 0000000..df595ef --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.admin.file.vo.file; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 文件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FilePageReqVO extends PageParam { + + @Schema(description = "文件路径,模糊匹配", example = "win") + private String path; + + @Schema(description = "文件类型,模糊匹配", example = "jpg") + private String type; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePresignedUrlRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePresignedUrlRespVO.java new file mode 100644 index 0000000..81ecbfa --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FilePresignedUrlRespVO.java @@ -0,0 +1,29 @@ +package com.win.module.infra.controller.admin.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "管理后台 - 文件预签名地址 Response VO") +@Data +public class FilePresignedUrlRespVO { + + @Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11") + private Long configId; + + @Schema(description = "文件上传 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://s3.cn-south-1.qiniucs.com/ruoyi-vue-pro/758d3a5387507358c7236de4c8f96de1c7f5097ff6a7722b34772fb7b76b140f.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=3TvrJ70gl2Gt6IBe7_IZT1F6i_k0iMuRtyEv4EyS%2F20240217%2Fcn-south-1%2Fs3%2Faws4_request&X-Amz-Date=20240217T123222Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=a29f33770ab79bf523ccd4034d0752ac545f3c2a3b17baa1eb4e280cfdccfda5") + private String uploadUrl; + + /** + * 为什么要返回 url 字段? + * + * 前端上传完文件后,需要使用该 URL 进行访问 + */ + @Schema(description = "文件访问 URL", requiredMode = Schema.RequiredMode.REQUIRED, + example = "https://test.win.iocoder.cn/758d3a5387507358c7236de4c8f96de1c7f5097ff6a7722b34772fb7b76b140f.png") + private String url; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileRespVO.java new file mode 100644 index 0000000..1b72f8a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileRespVO.java @@ -0,0 +1,36 @@ +package com.win.module.infra.controller.admin.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 文件 Response VO,不返回 content 字段,太大") +@Data +public class FileRespVO { + + @Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11") + private Long configId; + + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "win.jpg") + private String path; + + @Schema(description = "原文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win.jpg") + private String name; + + @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/win.jpg") + private String url; + + @Schema(description = "文件MIME类型", example = "application/octet-stream") + private String type; + + @Schema(description = "文件大小", example = "2048", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer size; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java new file mode 100644 index 0000000..6128f69 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.admin.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 上传文件 Request VO") +@Data +public class FileUploadReqVO { + + @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "文件附件不能为空") + private MultipartFile file; + + @Schema(description = "文件附件", example = "winyuanma.png") + private String path; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.http b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.http new file mode 100644 index 0000000..62f8dd6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.http @@ -0,0 +1,5 @@ +### 请求 /infra/job/sync 接口 => 成功 +POST {{baseUrl}}/infra/job/sync +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.java new file mode 100644 index 0000000..afe4086 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobController.java @@ -0,0 +1,148 @@ +package com.win.module.infra.controller.admin.job; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.quartz.core.util.CronUtils; +import com.win.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.win.module.infra.controller.admin.job.vo.job.JobRespVO; +import com.win.module.infra.controller.admin.job.vo.job.JobSaveReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import com.win.module.infra.service.job.JobService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.quartz.SchedulerException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 定时任务") +@RestController +@RequestMapping("/infra/job") +@Validated +public class JobController { + + @Resource + private JobService jobService; + + @PostMapping("/create") + @Operation(summary = "创建定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:create')") + public CommonResult createJob(@Valid @RequestBody JobSaveReqVO createReqVO) + throws SchedulerException { + return success(jobService.createJob(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJob(@Valid @RequestBody JobSaveReqVO updateReqVO) + throws SchedulerException { + jobService.updateJob(updateReqVO); + return success(true); + } + + @PutMapping("/update-status") + @Operation(summary = "更新定时任务的状态") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "status", description = "状态", required = true, example = "1"), + }) + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJobStatus(@RequestParam(value = "id") Long id, @RequestParam("status") Integer status) + throws SchedulerException { + jobService.updateJobStatus(id, status); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除定时任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:delete')") + public CommonResult deleteJob(@RequestParam("id") Long id) + throws SchedulerException { + jobService.deleteJob(id); + return success(true); + } + + @PutMapping("/trigger") + @Operation(summary = "触发定时任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:trigger')") + public CommonResult triggerJob(@RequestParam("id") Long id) throws SchedulerException { + jobService.triggerJob(id); + return success(true); + } + + @PostMapping("/sync") + @Operation(summary = "同步定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:create')") + public CommonResult syncJob() throws SchedulerException { + jobService.syncJob(); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得定时任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJob(@RequestParam("id") Long id) { + JobDO job = jobService.getJob(id); + return success(BeanUtils.toBean(job, JobRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得定时任务分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobPage(@Valid JobPageReqVO pageVO) { + PageResult pageResult = jobService.getJobPage(pageVO); + return success(BeanUtils.toBean(pageResult, JobRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出定时任务 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportJobExcel(@Valid JobPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = jobService.getJobPage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "定时任务.xls", "数据", JobRespVO.class, + BeanUtils.toBean(list, JobRespVO.class)); + } + + @GetMapping("/get_next_times") + @Operation(summary = "获得定时任务的下 n 次执行时间") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "count", description = "数量", example = "5") + }) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobNextTimes( + @RequestParam("id") Long id, + @RequestParam(value = "count", required = false, defaultValue = "5") Integer count) { + JobDO job = jobService.getJob(id); + if (job == null) { + return success(Collections.emptyList()); + } + return success(CronUtils.getNextTimes(job.getCronExpression(), count)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobLogController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobLogController.java new file mode 100644 index 0000000..f86516c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/JobLogController.java @@ -0,0 +1,71 @@ +package com.win.module.infra.controller.admin.job; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.controller.admin.job.vo.log.JobLogRespVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import com.win.module.infra.service.job.JobLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 定时任务日志") +@RestController +@RequestMapping("/infra/job-log") +@Validated +public class JobLogController { + + @Resource + private JobLogService jobLogService; + + @GetMapping("/get") + @Operation(summary = "获得定时任务日志") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJobLog(@RequestParam("id") Long id) { + JobLogDO jobLog = jobLogService.getJobLog(id); + return success(BeanUtils.toBean(jobLog, JobLogRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得定时任务日志分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogPage(@Valid JobLogPageReqVO pageVO) { + PageResult pageResult = jobLogService.getJobLogPage(pageVO); + return success(BeanUtils.toBean(pageResult, JobLogRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出定时任务日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportJobLogExcel(@Valid JobLogPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = jobLogService.getJobLogPage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "任务日志.xls", "数据", JobLogRespVO.class, + BeanUtils.toBean(list, JobLogRespVO.class)); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobPageReqVO.java new file mode 100644 index 0000000..bbce9e7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobPageReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.infra.controller.admin.job.vo.job; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 定时任务分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobPageReqVO extends PageParam { + + @Schema(description = "任务名称,模糊匹配", example = "测试任务") + private String name; + + @Schema(description = "任务状态,参见 JobStatusEnum 枚举", example = "1") + private Integer status; + + @Schema(description = "处理器的名字,模糊匹配", example = "sysUserSessionTimeoutJob") + private String handlerName; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobRespVO.java new file mode 100644 index 0000000..c46ef63 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobRespVO.java @@ -0,0 +1,59 @@ +package com.win.module.infra.controller.admin.job.vo.job; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 定时任务 Response VO") +@Data +@ExcelIgnoreUnannotated +public class JobRespVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("任务编号") + private Long id; + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试任务") + @ExcelProperty("任务名称") + private String name; + + @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.JOB_STATUS) + private Integer status; + + @Schema(description = "处理器的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "sysUserSessionTimeoutJob") + @ExcelProperty("处理器的名字") + private String handlerName; + + @Schema(description = "处理器的参数", example = "win") + @ExcelProperty("处理器的参数") + private String handlerParam; + + @Schema(description = "CRON 表达式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0/10 * * * * ? *") + @ExcelProperty("CRON 表达式") + private String cronExpression; + + @Schema(description = "重试次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") + @NotNull(message = "重试次数不能为空") + private Integer retryCount; + + @Schema(description = "重试间隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") + private Integer retryInterval; + + @Schema(description = "监控超时时间", example = "1000") + @ExcelProperty("监控超时时间") + private Integer monitorTimeout; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobSaveReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobSaveReqVO.java new file mode 100644 index 0000000..f9b0ff1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/job/JobSaveReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.infra.controller.admin.job.vo.job; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 定时任务创建/修改 Request VO") +@Data +public class JobSaveReqVO { + + @Schema(description = "任务编号", example = "1024") + private Long id; + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试任务") + @NotEmpty(message = "任务名称不能为空") + private String name; + + @Schema(description = "处理器的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "sysUserSessionTimeoutJob") + @NotEmpty(message = "处理器的名字不能为空") + private String handlerName; + + @Schema(description = "处理器的参数", example = "win") + private String handlerParam; + + @Schema(description = "CRON 表达式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0/10 * * * * ? *") + @NotEmpty(message = "CRON 表达式不能为空") + private String cronExpression; + + @Schema(description = "重试次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") + @NotNull(message = "重试次数不能为空") + private Integer retryCount; + + @Schema(description = "重试间隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") + @NotNull(message = "重试间隔不能为空") + private Integer retryInterval; + + @Schema(description = "监控超时时间", example = "1000") + private Integer monitorTimeout; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java new file mode 100644 index 0000000..f0437db --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.infra.controller.admin.job.vo.log; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 定时任务日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobLogPageReqVO extends PageParam { + + @Schema(description = "任务编号", example = "10") + private Long jobId; + + @Schema(description = "处理器的名字,模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "开始执行时间") + private LocalDateTime beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "结束执行时间") + private LocalDateTime endTime; + + @Schema(description = "任务状态,参见 JobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogRespVO.java new file mode 100644 index 0000000..e8fa2a8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/job/vo/log/JobLogRespVO.java @@ -0,0 +1,63 @@ +package com.win.module.infra.controller.admin.job.vo.log; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 定时任务日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class JobLogRespVO { + + @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("日志编号") + private Long id; + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("任务编号") + private Long jobId; + + @Schema(description = "处理器的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "sysUserSessionTimeoutJob") + @ExcelProperty("处理器的名字") + private String handlerName; + + @Schema(description = "处理器的参数", example = "win") + @ExcelProperty("处理器的参数") + private String handlerParam; + + @Schema(description = "第几次执行", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("第几次执行") + private Integer executeIndex; + + @Schema(description = "开始执行时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("开始执行时间") + private LocalDateTime beginTime; + + @Schema(description = "结束执行时间") + @ExcelProperty("结束执行时间") + private LocalDateTime endTime; + + @Schema(description = "执行时长", example = "123") + @ExcelProperty("执行时长") + private Integer duration; + + @Schema(description = "任务状态,参见 JobLogStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.JOB_STATUS) + private Integer status; + + @Schema(description = "结果数据", example = "执行成功") + @ExcelProperty("结果数据") + private String result; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiAccessLogController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiAccessLogController.java new file mode 100644 index 0000000..8c803ef --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiAccessLogController.java @@ -0,0 +1,60 @@ +package com.win.module.infra.controller.admin.logger; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.win.module.infra.service.logger.ApiAccessLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - API 访问日志") +@RestController +@RequestMapping("/infra/api-access-log") +@Validated +public class ApiAccessLogController { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @GetMapping("/page") + @Operation(summary = "获得API 访问日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") + public CommonResult> getApiAccessLogPage(@Valid ApiAccessLogPageReqVO pageReqVO) { + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ApiAccessLogRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出API 访问日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportApiAccessLogExcel(@Valid ApiAccessLogPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = apiAccessLogService.getApiAccessLogPage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "API 访问日志.xls", "数据", ApiAccessLogRespVO.class, + BeanUtils.toBean(list, ApiAccessLogRespVO.class)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiErrorLogController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiErrorLogController.java new file mode 100644 index 0000000..4092300 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/ApiErrorLogController.java @@ -0,0 +1,74 @@ +package com.win.module.infra.controller.admin.logger; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.win.module.infra.service.logger.ApiErrorLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - API 错误日志") +@RestController +@RequestMapping("/infra/api-error-log") +@Validated +public class ApiErrorLogController { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @PutMapping("/update-status") + @Operation(summary = "更新 API 错误日志的状态") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "processStatus", description = "处理状态", required = true, example = "1") + }) + @PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')") + public CommonResult updateApiErrorLogProcess(@RequestParam("id") Long id, + @RequestParam("processStatus") Integer processStatus) { + apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId()); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得 API 错误日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") + public CommonResult> getApiErrorLogPage(@Valid ApiErrorLogPageReqVO pageReqVO) { + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ApiErrorLogRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出 API 错误日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportApiErrorLogExcel(@Valid ApiErrorLogPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = apiErrorLogService.getApiErrorLogPage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "API 错误日志.xls", "数据", ApiErrorLogRespVO.class, + BeanUtils.toBean(list, ApiErrorLogRespVO.class)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java new file mode 100644 index 0000000..924a0bc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.infra.controller.admin.logger.vo.apiaccesslog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - API 访问日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiAccessLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "用户类型", example = "2") + private Integer userType; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "请求地址,模糊匹配", example = "/xxx/yyy") + private String requestUrl; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] beginTime; + + @Schema(description = "执行时长,大于等于,单位:毫秒", example = "100") + private Integer duration; + + @Schema(description = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java new file mode 100644 index 0000000..a4d9f49 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java @@ -0,0 +1,99 @@ +package com.win.module.infra.controller.admin.logger.vo.apiaccesslog; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - API 访问日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ApiAccessLogRespVO { + + @Schema(description = "日志主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("日志主键") + private Long id; + + @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "66600cb6-7852-11eb-9439-0242ac130002") + @ExcelProperty("链路追踪编号") + private String traceId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + @ExcelProperty("用户编号") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_TYPE) + private Integer userType; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "dashboard") + @ExcelProperty("应用名") + private String applicationName; + + @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") + @ExcelProperty("请求方法名") + private String requestMethod; + + @Schema(description = "请求地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "/xxx/yyy") + @ExcelProperty("请求地址") + private String requestUrl; + + @Schema(description = "请求参数") + @ExcelProperty("请求参数") + private String requestParams; + + @Schema(description = "响应结果") + @ExcelProperty("响应结果") + private String responseBody; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @ExcelProperty("用户 IP") + private String userIp; + + @Schema(description = "浏览器 UA", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") + @ExcelProperty("浏览器 UA") + private String userAgent; + + @Schema(description = "操作模块", requiredMode = Schema.RequiredMode.REQUIRED, example = "商品模块") + @ExcelProperty("操作模块") + private String operateModule; + + @Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建商品") + @ExcelProperty("操作名") + private String operateName; + + @Schema(description = "操作分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "操作分类", converter = DictConvert.class) + @DictFormat(com.win.module.infra.enums.DictTypeConstants.OPERATE_TYPE) + private Integer operateType; + + @Schema(description = "开始请求时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("开始请求时间") + private LocalDateTime beginTime; + + @Schema(description = "结束请求时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("结束请求时间") + private LocalDateTime endTime; + + @Schema(description = "执行时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @ExcelProperty("执行时长") + private Integer duration; + + @Schema(description = "结果码", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("结果码") + private Integer resultCode; + + @Schema(description = "结果提示", example = "芋道源码,牛逼!") + @ExcelProperty("结果提示") + private String resultMsg; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java new file mode 100644 index 0000000..0514ef5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.infra.controller.admin.logger.vo.apierrorlog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - API 错误日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiErrorLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "用户类型", example = "1") + private Integer userType; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "异常发生时间") + private LocalDateTime[] exceptionTime; + + @Schema(description = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java new file mode 100644 index 0000000..f0f5bce --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java @@ -0,0 +1,112 @@ +package com.win.module.infra.controller.admin.logger.vo.apierrorlog; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - API 错误日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ApiErrorLogRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Integer id; + + @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "66600cb6-7852-11eb-9439-0242ac130002") + @ExcelProperty("链路追踪编号") + private String traceId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + @ExcelProperty("用户编号") + private Integer userId; + + @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(com.win.module.system.enums.DictTypeConstants.USER_TYPE) + private Integer userType; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "dashboard") + @ExcelProperty("应用名") + private String applicationName; + + @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") + @ExcelProperty("请求方法名") + private String requestMethod; + + @Schema(description = "请求地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "/xx/yy") + @ExcelProperty("请求地址") + private String requestUrl; + + @Schema(description = "请求参数", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("请求参数") + private String requestParams; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @ExcelProperty("用户 IP") + private String userIp; + + @Schema(description = "浏览器 UA", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") + @ExcelProperty("浏览器 UA") + private String userAgent; + + @Schema(description = "异常发生时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常发生时间") + private LocalDateTime exceptionTime; + + @Schema(description = "异常名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常名") + private String exceptionName; + + @Schema(description = "异常导致的消息", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常导致的消息") + private String exceptionMessage; + + @Schema(description = "异常导致的根消息", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常导致的根消息") + private String exceptionRootCauseMessage; + + @Schema(description = "异常的栈轨迹", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常的栈轨迹") + private String exceptionStackTrace; + + @Schema(description = "异常发生的类全名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常发生的类全名") + private String exceptionClassName; + + @Schema(description = "异常发生的类文件", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常发生的类文件") + private String exceptionFileName; + + @Schema(description = "异常发生的方法名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常发生的方法名") + private String exceptionMethodName; + + @Schema(description = "异常发生的方法所在行", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异常发生的方法所在行") + private Integer exceptionLineNumber; + + @Schema(description = "处理状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty(value = "处理状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) + private Integer processStatus; + + @Schema(description = "处理时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("处理时间") + private LocalDateTime processTime; + + @Schema(description = "处理用户编号", example = "233") + @ExcelProperty("处理用户编号") + private Integer processUserId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.http b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.http new file mode 100644 index 0000000..8a0e70f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.http @@ -0,0 +1,4 @@ +### 请求 /infra/redis/get-monitor-info 接口 => 成功 +GET {{baseUrl}}/infra/redis/get-monitor-info +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.java new file mode 100644 index 0000000..62609ba --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/RedisController.java @@ -0,0 +1,43 @@ +package com.win.module.infra.controller.admin.redis; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; +import com.win.module.infra.convert.redis.RedisConvert; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import java.util.Properties; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - Redis 监控") +@RestController +@RequestMapping("/infra/redis") +public class RedisController { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @GetMapping("/get-monitor-info") + @Operation(summary = "获得 Redis 监控信息") + @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") + public CommonResult getRedisMonitorInfo() { + // 获得 Redis 统计信息 + Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); + Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); + Properties commandStats = stringRedisTemplate.execute(( + RedisCallback) connection -> connection.serverCommands().info("commandstats")); + assert commandStats != null; // 断言,避免警告 + // 拼接结果返回 + return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java new file mode 100644 index 0000000..dd19c84 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java @@ -0,0 +1,43 @@ +package com.win.module.infra.controller.admin.redis.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Properties; + +@Schema(description = "管理后台 - Redis 监控信息 Response VO") +@Data +@Builder +@AllArgsConstructor +public class RedisMonitorRespVO { + + @Schema(description = "Redis info 指令结果,具体字段,查看 Redis 文档", requiredMode = Schema.RequiredMode.REQUIRED) + private Properties info; + + @Schema(description = "Redis key 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long dbSize; + + @Schema(description = "CommandStat 数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List commandStats; + + @Schema(description = "Redis 命令统计结果") + @Data + @Builder + @AllArgsConstructor + public static class CommandStat { + + @Schema(description = "Redis 命令", requiredMode = Schema.RequiredMode.REQUIRED, example = "get") + private String command; + + @Schema(description = "调用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long calls; + + @Schema(description = "消耗 CPU 秒数", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private Long usec; + + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/AppFileController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/AppFileController.java new file mode 100644 index 0000000..38d49a6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/AppFileController.java @@ -0,0 +1,54 @@ +package com.win.module.infra.controller.app.file; + +import cn.hutool.core.io.IoUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.module.infra.controller.admin.file.vo.file.FileCreateReqVO; +import com.win.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; +import com.win.module.infra.controller.app.file.vo.AppFileUploadReqVO; +import com.win.module.infra.service.file.FileService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 App - 文件存储") +@RestController +@RequestMapping("/infra/file") +@Validated +@Slf4j +public class AppFileController { + + @Resource + private FileService fileService; + + @PostMapping("/upload") + @Operation(summary = "上传文件") + @PermitAll + public CommonResult uploadFile(AppFileUploadReqVO uploadReqVO) throws Exception { + MultipartFile file = uploadReqVO.getFile(); + String path = uploadReqVO.getPath(); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); + } + + @GetMapping("/presigned-url") + @Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器") + @PermitAll + public CommonResult getFilePresignedUrl(@RequestParam("path") String path) throws Exception { + return success(fileService.getFilePresignedUrl(path)); + } + + @PostMapping("/create") + @Operation(summary = "创建文件", description = "模式二:前端上传文件:配合 presigned-url 接口,记录上传了上传的文件") + @PermitAll + public CommonResult createFile(@Valid @RequestBody FileCreateReqVO createReqVO) { + return success(fileService.createFile(createReqVO)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/vo/AppFileUploadReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/vo/AppFileUploadReqVO.java new file mode 100644 index 0000000..1f882fb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/file/vo/AppFileUploadReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.app.file.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "用户 App - 上传文件 Request VO") +@Data +public class AppFileUploadReqVO { + + @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "文件附件不能为空") + private MultipartFile file; + + @Schema(description = "文件附件", example = "winyuanma.png") + private String path; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/package-info.java new file mode 100644 index 0000000..60bf46d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.infra.controller.app; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/package-info.java new file mode 100644 index 0000000..97529d2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 win-ui-admin 前端项目 + * 2. app 包:提供给用户 APP win-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package com.win.module.infra.controller; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java new file mode 100644 index 0000000..6219ba6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java @@ -0,0 +1,68 @@ +package com.win.module.infra.convert.codegen; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; +import com.win.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; +import com.win.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import org.apache.ibatis.type.JdbcType; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface CodegenConvert { + + CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); + + // ========== TableInfo 相关 ========== + + @Mappings({ + @Mapping(source = "name", target = "tableName"), + @Mapping(source = "comment", target = "tableComment"), + }) + CodegenTableDO convert(TableInfo bean); + + List convertList(List list); + + @Mappings({ + @Mapping(source = "name", target = "columnName"), + @Mapping(source = "metaInfo.jdbcType", target = "dataType", qualifiedByName = "getDataType"), + @Mapping(source = "comment", target = "columnComment"), + @Mapping(source = "metaInfo.nullable", target = "nullable"), + @Mapping(source = "keyFlag", target = "primaryKey"), + @Mapping(source = "columnType.type", target = "javaType"), + @Mapping(source = "propertyName", target = "javaField"), + }) + CodegenColumnDO convert(TableField bean); + + @Named("getDataType") + default String getDataType(JdbcType jdbcType) { + return jdbcType.name(); + } + + // ========== 其它 ========== + + default CodegenDetailRespVO convert(CodegenTableDO table, List columns) { + CodegenDetailRespVO respVO = new CodegenDetailRespVO(); + respVO.setTable(BeanUtils.toBean(table, CodegenTableRespVO.class)); + respVO.setColumns(BeanUtils.toBean(columns, CodegenColumnRespVO.class)); + return respVO; + } + + default List convert(Map codes) { + return CollectionUtils.convertList(codes.entrySet(), + entry -> new CodegenPreviewRespVO().setFilePath(entry.getKey()).setCode(entry.getValue())); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java new file mode 100644 index 0000000..66beaa5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java @@ -0,0 +1,28 @@ +package com.win.module.infra.convert.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.config.vo.ConfigRespVO; +import com.win.module.infra.controller.admin.config.vo.ConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface ConfigConvert { + + ConfigConvert INSTANCE = Mappers.getMapper(ConfigConvert.class); + + PageResult convertPage(PageResult page); + + List convertList(List list); + + @Mapping(source = "configKey", target = "key") + ConfigRespVO convert(ConfigDO bean); + + @Mapping(source = "key", target = "configKey") + ConfigDO convert(ConfigSaveReqVO bean); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java new file mode 100644 index 0000000..1474c5b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java @@ -0,0 +1,22 @@ +package com.win.module.infra.convert.file; + +import com.win.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +/** + * 文件配置 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface FileConfigConvert { + + FileConfigConvert INSTANCE = Mappers.getMapper(FileConfigConvert.class); + + @Mapping(target = "config", ignore = true) + FileConfigDO convert(FileConfigSaveReqVO bean); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/package-info.java new file mode 100644 index 0000000..1853a76 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.win.module.infra.convert; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java new file mode 100644 index 0000000..c1f86ac --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java @@ -0,0 +1,29 @@ +package com.win.module.infra.convert.redis; + +import cn.hutool.core.util.StrUtil; +import com.win.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.Properties; + +@Mapper +public interface RedisConvert { + + RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); + + default RedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { + RedisMonitorRespVO respVO = RedisMonitorRespVO.builder().info(info).dbSize(dbSize) + .commandStats(new ArrayList<>(commandStats.size())).build(); + commandStats.forEach((key, value) -> { + respVO.getCommandStats().add(RedisMonitorRespVO.CommandStat.builder() + .command(StrUtil.subAfter((String) key, "cmdstat_", false)) + .calls(Long.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) + .usec(Long.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) + .build()); + }); + return respVO; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..2f05ebd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java new file mode 100644 index 0000000..db8138c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java @@ -0,0 +1,136 @@ +package com.win.module.infra.dal.dataobject.codegen; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; +import com.win.module.infra.enums.codegen.CodegenColumnListConditionEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 column 字段定义 + * + * @author 芋道源码 + */ +@TableName(value = "infra_codegen_column", autoResultMap = true) +@KeySequence("infra_codegen_column_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class CodegenColumnDO extends BaseDO { + + /** + * ID 编号 + */ + @TableId + private Long id; + /** + * 表编号 + *

+ * 关联 {@link CodegenTableDO#getId()} + */ + private Long tableId; + + // ========== 表相关字段 ========== + + /** + * 字段名 + * + * 关联 {@link TableField#getName()} + */ + private String columnName; + /** + * 数据库字段类型 + * + * 关联 {@link TableField.MetaInfo#getJdbcType()} + */ + private String dataType; + /** + * 字段描述 + * + * 关联 {@link TableField#getComment()} + */ + private String columnComment; + /** + * 是否允许为空 + * + * 关联 {@link TableField.MetaInfo#isNullable()} + */ + private Boolean nullable; + /** + * 是否主键 + * + * 关联 {@link TableField#isKeyFlag()} + */ + private Boolean primaryKey; + /** + * 排序 + */ + private Integer ordinalPosition; + + // ========== Java 相关字段 ========== + + /** + * Java 属性类型 + * + * 例如说 String、Boolean 等等 + * + * 关联 {@link TableField#getColumnType()} + */ + private String javaType; + /** + * Java 属性名 + * + * 关联 {@link TableField#getPropertyName()} + */ + private String javaField; + /** + * 字典类型 + *

+ * 关联 DictTypeDO 的 type 属性 + */ + private String dictType; + /** + * 数据示例,主要用于生成 Swagger 注解的 example 字段 + */ + private String example; + + // ========== CRUD 相关字段 ========== + + /** + * 是否为 Create 创建操作的字段 + */ + private Boolean createOperation; + /** + * 是否为 Update 更新操作的字段 + */ + private Boolean updateOperation; + /** + * 是否为 List 查询操作的字段 + */ + private Boolean listOperation; + /** + * List 查询操作的条件类型 + *

+ * 枚举 {@link CodegenColumnListConditionEnum} + */ + private String listOperationCondition; + /** + * 是否为 List 查询操作的返回字段 + */ + private Boolean listOperationResult; + + // ========== UI 相关字段 ========== + + /** + * 显示类型 + *

+ * 枚举 {@link CodegenColumnHtmlTypeEnum} + */ + private String htmlType; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java new file mode 100644 index 0000000..ab42d0d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java @@ -0,0 +1,158 @@ +package com.win.module.infra.dal.dataobject.codegen; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.win.module.infra.enums.codegen.CodegenFrontTypeEnum; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 table 表定义 + * + * @author 芋道源码 + */ +@TableName(value = "infra_codegen_table", autoResultMap = true) +@KeySequence("infra_codegen_table_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class CodegenTableDO extends BaseDO { + + /** + * ID 编号 + */ + @TableId + private Long id; + + /** + * 数据源编号 + * + * 关联 {@link DataSourceConfigDO#getId()} + */ + private Long dataSourceConfigId; + /** + * 生成场景 + * + * 枚举 {@link CodegenSceneEnum} + */ + private Integer scene; + + // ========== 表相关字段 ========== + + /** + * 表名称 + * + * 关联 {@link TableInfo#getName()} + */ + private String tableName; + /** + * 表描述 + * + * 关联 {@link TableInfo#getComment()} + */ + private String tableComment; + /** + * 备注 + */ + private String remark; + + // ========== 类相关字段 ========== + + /** + * 模块名,即一级目录 + * + * 例如说,system、infra、tool 等等 + */ + private String moduleName; + /** + * 业务名,即二级目录 + * + * 例如说,user、permission、dict 等等 + */ + private String businessName; + /** + * 类名称(首字母大写) + * + * 例如说,SysUser、SysMenu、SysDictData 等等 + */ + private String className; + /** + * 类描述 + */ + private String classComment; + /** + * 作者 + */ + private String author; + + // ========== 生成相关字段 ========== + + /** + * 模板类型 + * + * 枚举 {@link CodegenTemplateTypeEnum} + */ + private Integer templateType; + /** + * 代码生成的前端类型 + * + * 枚举 {@link CodegenFrontTypeEnum} + */ + private Integer frontType; + + // ========== 菜单相关字段 ========== + + /** + * 父菜单编号 + * + * 关联 MenuDO 的 id 属性 + */ + private Long parentMenuId; + + // ========== 主子表相关字段 ========== + + /** + * 主表的编号 + * + * 关联 {@link CodegenTableDO#getId()} + */ + private Long masterTableId; + /** + * 【自己】子表关联主表的字段编号 + * + * 关联 {@link CodegenColumnDO#getId()} + */ + private Long subJoinColumnId; + /** + * 主表与子表是否一对多 + * + * true:一对多 + * false:一对一 + */ + private Boolean subJoinMany; + + // ========== 树表相关字段 ========== + + /** + * 树表的父字段编号 + * + * 关联 {@link CodegenColumnDO#getId()} + */ + private Long treeParentColumnId; + /** + * 树表的名字字段编号 + * + * 名字的用途:新增或修改时,select 框展示的字段 + * + * 关联 {@link CodegenColumnDO#getId()} + */ + private Long treeNameColumnId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java new file mode 100644 index 0000000..02dd439 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java @@ -0,0 +1,64 @@ +package com.win.module.infra.dal.dataobject.config; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.config.ConfigTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 参数配置表 + * + * @author 芋道源码 + */ +@TableName("infra_config") +@KeySequence("infra_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 参数分类 + */ + private String category; + /** + * 参数名称 + */ + private String name; + /** + * 参数键名 + * + * 支持多 DB 类型时,无法直接使用 key + @TableField("config_key") 来实现转换,原因是 "config_key" AS key 而存在报错 + */ + private String configKey; + /** + * 参数键值 + */ + private String value; + /** + * 参数类型 + * + * 枚举 {@link ConfigTypeEnum} + */ + private Integer type; + /** + * 是否可见 + * + * 不可见的参数,一般是敏感参数,前端不可获取 + */ + private Boolean visible; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java new file mode 100644 index 0000000..e04feae --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java @@ -0,0 +1,48 @@ +package com.win.module.infra.dal.dataobject.db; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.type.EncryptTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 数据源配置 + * + * @author 芋道源码 + */ +@TableName(value = "infra_data_source_config", autoResultMap = true) +@KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +public class DataSourceConfigDO extends BaseDO { + + /** + * 主键编号 - Master 数据源 + */ + public static final Long ID_MASTER = 0L; + + /** + * 主键编号 + */ + private Long id; + /** + * 连接名 + */ + private String name; + + /** + * 数据源连接 + */ + private String url; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + @TableField(typeHandler = EncryptTypeHandler.class) + private String password; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo01/Demo01ContactDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo01/Demo01ContactDO.java new file mode 100644 index 0000000..5e55e0b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo01/Demo01ContactDO.java @@ -0,0 +1,54 @@ +package com.win.module.infra.dal.dataobject.demo.demo01; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 示例联系人 DO + * + * @author 芋道源码 + */ +@TableName("win_demo01_contact") +@KeySequence("win_demo01_contact_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Demo01ContactDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 名字 + */ + private String name; + /** + * 性别 + * + * 枚举 {@link TODO system_user_sex 对应的类} + */ + private Integer sex; + /** + * 出生年 + */ + private LocalDateTime birthday; + /** + * 简介 + */ + private String description; + /** + * 头像 + */ + private String avatar; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo02/Demo02CategoryDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo02/Demo02CategoryDO.java new file mode 100644 index 0000000..cb67488 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo02/Demo02CategoryDO.java @@ -0,0 +1,40 @@ +package com.win.module.infra.dal.dataobject.demo.demo02; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 示例分类 DO + * + * @author 芋道源码 + */ +@TableName("win_demo02_category") +@KeySequence("win_demo02_category_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Demo02CategoryDO extends BaseDO { + + public static final Long PARENT_ID_ROOT = 0L; + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 名字 + */ + private String name; + /** + * 父级编号 + */ + private Long parentId; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03CourseDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03CourseDO.java new file mode 100644 index 0000000..57bf7f8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03CourseDO.java @@ -0,0 +1,42 @@ +package com.win.module.infra.dal.dataobject.demo.demo03; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 学生课程 DO + * + * @author 芋道源码 + */ +@TableName("win_demo03_course") +@KeySequence("win_demo03_course_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Demo03CourseDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 学生编号 + */ + private Long studentId; + /** + * 名字 + */ + private String name; + /** + * 分数 + */ + private Integer score; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03GradeDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03GradeDO.java new file mode 100644 index 0000000..4021f67 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03GradeDO.java @@ -0,0 +1,42 @@ +package com.win.module.infra.dal.dataobject.demo.demo03; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 学生班级 DO + * + * @author 芋道源码 + */ +@TableName("win_demo03_grade") +@KeySequence("win_demo03_grade_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Demo03GradeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 学生编号 + */ + private Long studentId; + /** + * 名字 + */ + private String name; + /** + * 班主任 + */ + private String teacher; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03StudentDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03StudentDO.java new file mode 100644 index 0000000..8a7f37d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/demo/demo03/Demo03StudentDO.java @@ -0,0 +1,50 @@ +package com.win.module.infra.dal.dataobject.demo.demo03; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 学生 DO + * + * @author 芋道源码 + */ +@TableName("win_demo03_student") +@KeySequence("win_demo03_student_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Demo03StudentDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 名字 + */ + private String name; + /** + * 性别 + * + * 枚举 {@link TODO system_user_sex 对应的类} + */ + private Integer sex; + /** + * 出生日期 + */ + private LocalDateTime birthday; + /** + * 简介 + */ + private String description; + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java new file mode 100644 index 0000000..0ea9718 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java @@ -0,0 +1,111 @@ +package com.win.module.infra.dal.dataobject.file; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import com.win.module.infra.framework.file.core.client.db.DBFileClientConfig; +import com.win.module.infra.framework.file.core.client.ftp.FtpFileClientConfig; +import com.win.module.infra.framework.file.core.client.local.LocalFileClientConfig; +import com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig; +import com.win.module.infra.framework.file.core.client.sftp.SftpFileClientConfig; +import com.win.module.infra.framework.file.core.enums.FileStorageEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.type.TypeReference; +import lombok.*; + +import java.lang.reflect.Field; + +/** + * 文件配置表 + * + * @author 芋道源码 + */ +@TableName(value = "infra_file_config", autoResultMap = true) +@KeySequence("infra_file_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileConfigDO extends BaseDO { + + /** + * 配置编号,数据库自增 + */ + private Long id; + /** + * 配置名 + */ + private String name; + /** + * 存储器 + * + * 枚举 {@link FileStorageEnum} + */ + private Integer storage; + /** + * 备注 + */ + private String remark; + /** + * 是否为主配置 + * + * 由于我们可以配置多个文件配置,默认情况下,使用主配置进行文件的上传 + */ + private Boolean master; + + /** + * 支付渠道配置 + */ + @TableField(typeHandler = FileClientConfigTypeHandler.class) + private FileClientConfig config; + + public static class FileClientConfigTypeHandler extends AbstractJsonTypeHandler { + + public FileClientConfigTypeHandler(Class type) { + super(type); + } + + public FileClientConfigTypeHandler(Class type, Field field) { + super(type, field); + } + + @Override + public Object parse(String json) { + FileClientConfig config = JsonUtils.parseObjectQuietly(json, new TypeReference<>() {}); + if (config != null) { + return config; + } + + // 兼容老版本的包路径 + String className = JsonUtils.parseObject(json, "@class", String.class); + className = StrUtil.subAfter(className, ".", true); + switch (className) { + case "DBFileClientConfig": + return JsonUtils.parseObject2(json, DBFileClientConfig.class); + case "FtpFileClientConfig": + return JsonUtils.parseObject2(json, FtpFileClientConfig.class); + case "LocalFileClientConfig": + return JsonUtils.parseObject2(json, LocalFileClientConfig.class); + case "SftpFileClientConfig": + return JsonUtils.parseObject2(json, SftpFileClientConfig.class); + case "S3FileClientConfig": + return JsonUtils.parseObject2(json, S3FileClientConfig.class); + default: + throw new IllegalArgumentException("未知的 FileClientConfig 类型:" + json); + } + } + + @Override + public String toJson(Object obj) { + return JsonUtils.toJsonString(obj); + } + + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java new file mode 100644 index 0000000..3c90927 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java @@ -0,0 +1,48 @@ +package com.win.module.infra.dal.dataobject.file; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.framework.file.core.client.db.DBFileClient; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 文件内容表 + * + * 专门用于存储 {@link DBFileClient} 的文件内容 + * + * @author 芋道源码 + */ +@TableName("infra_file_content") +@KeySequence("infra_file_content_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileContentDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId + private Long id; + /** + * 配置编号 + * + * 关联 {@link FileConfigDO#getId()} + */ + private Long configId; + /** + * 路径,即文件名 + */ + private String path; + /** + * 文件内容 + */ + private byte[] content; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java new file mode 100644 index 0000000..c5bff8e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java @@ -0,0 +1,55 @@ +package com.win.module.infra.dal.dataobject.file; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 文件表 + * 每次文件上传,都会记录一条记录到该表中 + * + * @author 芋道源码 + */ +@TableName("infra_file") +@KeySequence("infra_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + private Long id; + /** + * 配置编号 + * + * 关联 {@link FileConfigDO#getId()} + */ + private Long configId; + /** + * 原文件名 + */ + private String name; + /** + * 路径,即文件名 + */ + private String path; + /** + * 访问地址 + */ + private String url; + /** + * 文件的 MIME 类型,例如 "application/octet-stream" + */ + private String type; + /** + * 文件大小 + */ + private Integer size; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java new file mode 100644 index 0000000..7f41fb8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java @@ -0,0 +1,74 @@ +package com.win.module.infra.dal.dataobject.job; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.job.JobStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 定时任务 DO + * + * @author 芋道源码 + */ +@TableName("infra_job") +@KeySequence("infra_job_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobDO extends BaseDO { + + /** + * 任务编号 + */ + @TableId + private Long id; + /** + * 任务名称 + */ + private String name; + /** + * 任务状态 + * + * 枚举 {@link JobStatusEnum} + */ + private Integer status; + /** + * 处理器的名字 + */ + private String handlerName; + /** + * 处理器的参数 + */ + private String handlerParam; + /** + * CRON 表达式 + */ + private String cronExpression; + + // ========== 重试相关字段 ========== + /** + * 重试次数 + * 如果不重试,则设置为 0 + */ + private Integer retryCount; + /** + * 重试间隔,单位:毫秒 + * 如果没有间隔,则设置为 0 + */ + private Integer retryInterval; + + // ========== 监控相关字段 ========== + /** + * 监控超时时间,单位:毫秒 + * 为空时,表示不监控 + * + * 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长 + */ + private Integer monitorTimeout; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java new file mode 100644 index 0000000..5084529 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java @@ -0,0 +1,82 @@ +package com.win.module.infra.dal.dataobject.job; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.infra.enums.job.JobLogStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 定时任务的执行日志 + * + * @author 芋道源码 + */ +@TableName("infra_job_log") +@KeySequence("infra_job_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobLogDO extends BaseDO { + + /** + * 日志编号 + */ + private Long id; + /** + * 任务编号 + * + * 关联 {@link JobDO#getId()} + */ + private Long jobId; + /** + * 处理器的名字 + * + * 冗余字段 {@link JobDO#getHandlerName()} + */ + private String handlerName; + /** + * 处理器的参数 + * + * 冗余字段 {@link JobDO#getHandlerParam()} + */ + private String handlerParam; + /** + * 第几次执行 + * + * 用于区分是不是重试执行。如果是重试执行,则 index 大于 1 + */ + private Integer executeIndex; + + /** + * 开始执行时间 + */ + private LocalDateTime beginTime; + /** + * 结束执行时间 + */ + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 状态 + * + * 枚举 {@link JobLogStatusEnum} + */ + private Integer status; + /** + * 结果数据 + * + * 成功时,使用 {@link JobHandler#execute(String)} 的结果 + * 失败时,使用 {@link JobHandler#execute(String)} 的异常堆栈 + */ + private String result; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java new file mode 100644 index 0000000..f7b0089 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java @@ -0,0 +1,140 @@ +package com.win.module.infra.dal.dataobject.logger; + +import com.win.framework.apilog.core.enums.OperateTypeEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * API 访问日志 + * + * @author 芋道源码 + */ +@TableName("infra_api_access_log") +@KeySequence(value = "infra_api_access_log_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ApiAccessLogDO extends BaseDO { + + /** + * {@link #requestParams} 的最大长度 + */ + public static final Integer REQUEST_PARAMS_MAX_LENGTH = 8000; + + /** + * {@link #resultMsg} 的最大长度 + */ + public static final Integer RESULT_MSG_MAX_LENGTH = 512; + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用名 + * + * 目前读取 `spring.application.name` 配置项 + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 响应结果 + */ + private String responseBody; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 执行相关字段 ========== + + /** + * 操作模块 + */ + private String operateModule; + /** + * 操作名 + */ + private String operateName; + /** + * 操作分类 + * + * 枚举 {@link OperateTypeEnum} + */ + private Integer operateType; + + /** + * 开始请求时间 + */ + private LocalDateTime beginTime; + /** + * 结束请求时间 + */ + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java new file mode 100644 index 0000000..f983520 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java @@ -0,0 +1,161 @@ +package com.win.module.infra.dal.dataobject.logger; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * API 异常数据 + * + * @author 芋道源码 + */ +@TableName("infra_api_error_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@KeySequence(value = "infra_api_error_log_seq") +public class ApiErrorLogDO extends BaseDO { + + /** + * {@link #requestParams} 的最大长度 + */ + public static final Integer REQUEST_PARAMS_MAX_LENGTH = 8000; + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用名 + * + * 目前读取 spring.application.name + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 异常相关字段 ========== + + /** + * 异常发生时间 + */ + private LocalDateTime exceptionTime; + /** + * 异常名 + * + * {@link Throwable#getClass()} 的类全名 + */ + private String exceptionName; + /** + * 异常导致的消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable)} + */ + private String exceptionMessage; + /** + * 异常导致的根消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable)} + */ + private String exceptionRootCauseMessage; + /** + * 异常的栈轨迹 + * + * {@link org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)} + */ + private String exceptionStackTrace; + /** + * 异常发生的类全名 + * + * {@link StackTraceElement#getClassName()} + */ + private String exceptionClassName; + /** + * 异常发生的类文件 + * + * {@link StackTraceElement#getFileName()} + */ + private String exceptionFileName; + /** + * 异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()} + */ + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()} + */ + private Integer exceptionLineNumber; + + // ========== 处理相关字段 ========== + + /** + * 处理状态 + * + * 枚举 {@link ApiErrorLogProcessStatusEnum} + */ + private Integer processStatus; + /** + * 处理时间 + */ + private LocalDateTime processTime; + /** + * 处理用户编号 + * + * 关联 com.win.adminserver.modules.system.dal.dataobject.user.SysUserDO.SysUserDO#getId() + */ + private Long processUserId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java new file mode 100644 index 0000000..590595c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java @@ -0,0 +1,24 @@ +package com.win.module.infra.dal.mysql.codegen; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenColumnMapper extends BaseMapperX { + + default List selectListByTableId(Long tableId) { + return selectList(new LambdaQueryWrapperX() + .eq(CodegenColumnDO::getTableId, tableId) + .orderByAsc(CodegenColumnDO::getOrdinalPosition)); + } + + default void deleteListByTableId(Long tableId) { + delete(new LambdaQueryWrapperX() + .eq(CodegenColumnDO::getTableId, tableId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java new file mode 100644 index 0000000..75772d2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java @@ -0,0 +1,39 @@ +package com.win.module.infra.dal.mysql.codegen; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenTableMapper extends BaseMapperX { + + default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) { + return selectOne(CodegenTableDO::getTableName, tableName, + CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); + } + + default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName()) + .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment()) + .likeIfPresent(CodegenTableDO::getClassName, pageReqVO.getClassName()) + .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime()) + .orderByDesc(CodegenTableDO::getUpdateTime) + ); + } + + default List selectListByDataSourceConfigId(Long dataSourceConfigId) { + return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); + } + + default List selectListByTemplateTypeAndMasterTableId(Integer templateType, Long masterTableId) { + return selectList(CodegenTableDO::getTemplateType, templateType, + CodegenTableDO::getMasterTableId, masterTableId); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java new file mode 100644 index 0000000..17b955b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java @@ -0,0 +1,25 @@ +package com.win.module.infra.dal.mysql.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ConfigMapper extends BaseMapperX { + + default ConfigDO selectByKey(String key) { + return selectOne(ConfigDO::getConfigKey, key); + } + + default PageResult selectPage(ConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ConfigDO::getName, reqVO.getName()) + .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey()) + .eqIfPresent(ConfigDO::getType, reqVO.getType()) + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime())); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java new file mode 100644 index 0000000..5d80ee9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java @@ -0,0 +1,14 @@ +package com.win.module.infra.dal.mysql.db; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 数据源配置 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface DataSourceConfigMapper extends BaseMapperX { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo01/Demo01ContactMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo01/Demo01ContactMapper.java new file mode 100644 index 0000000..e0e142c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo01/Demo01ContactMapper.java @@ -0,0 +1,26 @@ +package com.win.module.infra.dal.mysql.demo.demo01; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; +import com.win.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 示例联系人 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface Demo01ContactMapper extends BaseMapperX { + + default PageResult selectPage(Demo01ContactPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(Demo01ContactDO::getName, reqVO.getName()) + .eqIfPresent(Demo01ContactDO::getSex, reqVO.getSex()) + .betweenIfPresent(Demo01ContactDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(Demo01ContactDO::getId)); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo02/Demo02CategoryMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo02/Demo02CategoryMapper.java new file mode 100644 index 0000000..5368e1e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo02/Demo02CategoryMapper.java @@ -0,0 +1,35 @@ +package com.win.module.infra.dal.mysql.demo.demo02; + +import java.util.*; + +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO; +import com.win.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 示例分类 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface Demo02CategoryMapper extends BaseMapperX { + + default List selectList(Demo02CategoryListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(Demo02CategoryDO::getName, reqVO.getName()) + .eqIfPresent(Demo02CategoryDO::getParentId, reqVO.getParentId()) + .betweenIfPresent(Demo02CategoryDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(Demo02CategoryDO::getId)); + } + + default Demo02CategoryDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(Demo02CategoryDO::getParentId, parentId, Demo02CategoryDO::getName, name); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(Demo02CategoryDO::getParentId, parentId); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03CourseMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03CourseMapper.java new file mode 100644 index 0000000..bd8ed9f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03CourseMapper.java @@ -0,0 +1,34 @@ +package com.win.module.infra.dal.mysql.demo.demo03; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 学生课程 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface Demo03CourseMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long studentId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(Demo03CourseDO::getStudentId, studentId) + .orderByDesc(Demo03CourseDO::getId)); + } + + default List selectListByStudentId(Long studentId) { + return selectList(Demo03CourseDO::getStudentId, studentId); + } + + default int deleteByStudentId(Long studentId) { + return delete(Demo03CourseDO::getStudentId, studentId); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03GradeMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03GradeMapper.java new file mode 100644 index 0000000..51e7f18 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03GradeMapper.java @@ -0,0 +1,32 @@ +package com.win.module.infra.dal.mysql.demo.demo03; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 学生班级 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface Demo03GradeMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long studentId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(Demo03GradeDO::getStudentId, studentId) + .orderByDesc(Demo03GradeDO::getId)); + } + + default Demo03GradeDO selectByStudentId(Long studentId) { + return selectOne(Demo03GradeDO::getStudentId, studentId); + } + + default int deleteByStudentId(Long studentId) { + return delete(Demo03GradeDO::getStudentId, studentId); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03StudentMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03StudentMapper.java new file mode 100644 index 0000000..2f34e12 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/demo/demo03/Demo03StudentMapper.java @@ -0,0 +1,27 @@ +package com.win.module.infra.dal.mysql.demo.demo03; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; +import org.apache.ibatis.annotations.Mapper; +import com.win.module.infra.controller.admin.demo.demo03.vo.*; + +/** + * 学生 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface Demo03StudentMapper extends BaseMapperX { + + default PageResult selectPage(Demo03StudentPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(Demo03StudentDO::getName, reqVO.getName()) + .eqIfPresent(Demo03StudentDO::getSex, reqVO.getSex()) + .eqIfPresent(Demo03StudentDO::getDescription, reqVO.getDescription()) + .betweenIfPresent(Demo03StudentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(Demo03StudentDO::getId)); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java new file mode 100644 index 0000000..4657b40 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java @@ -0,0 +1,25 @@ +package com.win.module.infra.dal.mysql.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FileConfigMapper extends BaseMapperX { + + default PageResult selectPage(FileConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(FileConfigDO::getName, reqVO.getName()) + .eqIfPresent(FileConfigDO::getStorage, reqVO.getStorage()) + .betweenIfPresent(FileConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FileConfigDO::getId)); + } + + default FileConfigDO selectByMaster() { + return selectOne(FileConfigDO::getMaster, true); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java new file mode 100644 index 0000000..3b4410b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java @@ -0,0 +1,25 @@ +package com.win.module.infra.dal.mysql.file; + +import com.win.module.infra.dal.dataobject.file.FileContentDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface FileContentMapper extends BaseMapper { + + default void deleteByConfigIdAndPath(Long configId, String path) { + this.delete(new LambdaQueryWrapper() + .eq(FileContentDO::getConfigId, configId) + .eq(FileContentDO::getPath, path)); + } + + default List selectListByConfigIdAndPath(Long configId, String path) { + return selectList(new LambdaQueryWrapper() + .eq(FileContentDO::getConfigId, configId) + .eq(FileContentDO::getPath, path)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java new file mode 100644 index 0000000..b2357f4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java @@ -0,0 +1,26 @@ +package com.win.module.infra.dal.mysql.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.win.module.infra.dal.dataobject.file.FileDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件操作 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface FileMapper extends BaseMapperX { + + default PageResult selectPage(FilePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(FileDO::getPath, reqVO.getPath()) + .likeIfPresent(FileDO::getType, reqVO.getType()) + .betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FileDO::getId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java new file mode 100644 index 0000000..88c2807 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java @@ -0,0 +1,43 @@ +package com.win.module.infra.dal.mysql.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; + +/** + * 任务日志 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface JobLogMapper extends BaseMapperX { + + default PageResult selectPage(JobLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(JobLogDO::getJobId, reqVO.getJobId()) + .likeIfPresent(JobLogDO::getHandlerName, reqVO.getHandlerName()) + .geIfPresent(JobLogDO::getBeginTime, reqVO.getBeginTime()) + .leIfPresent(JobLogDO::getEndTime, reqVO.getEndTime()) + .eqIfPresent(JobLogDO::getStatus, reqVO.getStatus()) + .orderByDesc(JobLogDO::getId) // ID 倒序 + ); + } + + /** + * 物理删除指定时间之前的日志 + * + * @param createTime 最大时间 + * @param limit 删除条数,防止一次删除太多 + * @return 删除条数 + */ + @Delete("DELETE FROM infra_job_log WHERE create_time < #{createTime} LIMIT #{limit}") + Integer deleteByCreateTimeLt(@Param("createTime") LocalDateTime createTime, @Param("limit") Integer limit); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java new file mode 100644 index 0000000..613a2c8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java @@ -0,0 +1,30 @@ +package com.win.module.infra.dal.mysql.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 定时任务 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface JobMapper extends BaseMapperX { + + default JobDO selectByHandlerName(String handlerName) { + return selectOne(JobDO::getHandlerName, handlerName); + } + + default PageResult selectPage(JobPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java new file mode 100644 index 0000000..ff933c7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java @@ -0,0 +1,45 @@ +package com.win.module.infra.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; + +/** + * API 访问日志 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface ApiAccessLogMapper extends BaseMapperX { + + default PageResult selectPage(ApiAccessLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiAccessLogDO::getUserType, reqVO.getUserType()) + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime()) + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration()) + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode()) + .orderByDesc(ApiAccessLogDO::getId) + ); + } + + /** + * 物理删除指定时间之前的日志 + * + * @param createTime 最大时间 + * @param limit 删除条数,防止一次删除太多 + * @return 删除条数 + */ + @Delete("DELETE FROM infra_api_access_log WHERE create_time < #{createTime} LIMIT #{limit}") + Integer deleteByCreateTimeLt(@Param("createTime") LocalDateTime createTime, @Param("limit") Integer limit); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java new file mode 100644 index 0000000..a2a9f67 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java @@ -0,0 +1,44 @@ +package com.win.module.infra.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; + +/** + * API 错误日志 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface ApiErrorLogMapper extends BaseMapperX { + + default PageResult selectPage(ApiErrorLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiErrorLogDO::getUserType, reqVO.getUserType()) + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime()) + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus()) + .orderByDesc(ApiErrorLogDO::getId) + ); + } + + /** + * 物理删除指定时间之前的日志 + * + * @param createTime 最大时间 + * @param limit 删除条数,防止一次删除太多 + * @return 删除条数 + */ + @Delete("DELETE FROM infra_api_error_log WHERE create_time < #{createTime} LIMIT #{limit}") + Integer deleteByCreateTimeLt(@Param("createTime") LocalDateTime createTime, @Param("limit")Integer limit); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java new file mode 100644 index 0000000..acc09e2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java @@ -0,0 +1,29 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段 HTML 展示枚举 + */ +@AllArgsConstructor +@Getter +public enum CodegenColumnHtmlTypeEnum { + + INPUT("input"), // 文本框 + TEXTAREA("textarea"), // 文本域 + SELECT("select"), // 下拉框 + RADIO("radio"), // 单选框 + CHECKBOX("checkbox"), // 复选框 + DATETIME("datetime"), // 日期控件 + IMAGE_UPLOAD("imageUpload"), // 上传图片 + FILE_UPLOAD("fileUpload"), // 上传文件 + EDITOR("editor"), // 富文本控件 + ; + + /** + * 条件 + */ + private final String type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java new file mode 100644 index 0000000..cc240e9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java @@ -0,0 +1,27 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段过滤条件枚举 + */ +@AllArgsConstructor +@Getter +public enum CodegenColumnListConditionEnum { + + EQ("="), + NE("!="), + GT(">"), + GTE(">="), + LT("<"), + LTE("<="), + LIKE("LIKE"), + BETWEEN("BETWEEN"); + + /** + * 条件 + */ + private final String condition; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java new file mode 100644 index 0000000..46c6793 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java @@ -0,0 +1,25 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成的前端类型枚举 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum CodegenFrontTypeEnum { + + VUE2(10), // Vue2 Element UI 标准模版 + VUE3(20), // Vue3 Element Plus 标准模版 + VUE3_VBEN(30), // Vue3 VBEN 模版 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java new file mode 100644 index 0000000..3f03b0c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java @@ -0,0 +1,41 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static cn.hutool.core.util.ArrayUtil.*; + +/** + * 代码生成的场景枚举 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum CodegenSceneEnum { + + ADMIN(1, "管理后台", "admin", ""), + APP(2, "用户 APP", "app", "App"); + + /** + * 场景 + */ + private final Integer scene; + /** + * 场景名 + */ + private final String name; + /** + * 基础包名 + */ + private final String basePackage; + /** + * Controller 和 VO 类的前缀 + */ + private final String prefixClass; + + public static CodegenSceneEnum valueOf(Integer scene) { + return firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), values()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java new file mode 100644 index 0000000..33b67ed --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java @@ -0,0 +1,53 @@ +package com.win.module.infra.enums.codegen; + +import com.win.framework.common.util.object.ObjectUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * 代码生成模板类型 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum CodegenTemplateTypeEnum { + + ONE(1), // 单表(增删改查) + TREE(2), // 树表(增删改查) + + MASTER_NORMAL(10), // 主子表 - 主表 - 普通模式 + MASTER_ERP(11), // 主子表 - 主表 - ERP 模式 + MASTER_INNER(12), // 主子表 - 主表 - 内嵌模式 + SUB(15), // 主子表 - 子表 + ; + + /** + * 类型 + */ + private final Integer type; + + /** + * 是否为主表 + * + * @param type 类型 + * @return 是否主表 + */ + public static boolean isMaster(Integer type) { + return ObjectUtils.equalsAny(type, + MASTER_NORMAL.type, MASTER_ERP.type, MASTER_INNER.type); + } + + /** + * 是否为树表 + * + * @param type 类型 + * @return 是否树表 + */ + public static boolean isTree(Integer type) { + return Objects.equals(type, TREE.type); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java new file mode 100644 index 0000000..dd88e2c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java @@ -0,0 +1,21 @@ +package com.win.module.infra.enums.config; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ConfigTypeEnum { + + /** + * 系统配置 + */ + SYSTEM(1), + /** + * 自定义配置 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java new file mode 100644 index 0000000..7aeccf1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java @@ -0,0 +1,24 @@ +package com.win.module.infra.enums.job; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 任务日志的状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum JobLogStatusEnum { + + RUNNING(0), // 运行中 + SUCCESS(1), // 成功 + FAILURE(2); // 失败 + + /** + * 状态 + */ + private final Integer status; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java new file mode 100644 index 0000000..b5fbfcd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java @@ -0,0 +1,42 @@ +package com.win.module.infra.enums.job; + +import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.quartz.impl.jdbcjobstore.Constants; + +import java.util.Collections; +import java.util.Set; + +/** + * 任务状态的枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum JobStatusEnum { + + /** + * 初始化中 + */ + INIT(0, Collections.emptySet()), + /** + * 开启 + */ + NORMAL(1, Sets.newHashSet(Constants.STATE_WAITING, Constants.STATE_ACQUIRED, Constants.STATE_BLOCKED)), + /** + * 暂停 + */ + STOP(2, Sets.newHashSet(Constants.STATE_PAUSED, Constants.STATE_PAUSED_BLOCKED)); + + /** + * 状态 + */ + private final Integer status; + /** + * 对应的 Quartz 触发器的状态集合 + */ + private final Set quartzStates; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java new file mode 100644 index 0000000..89af004 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java @@ -0,0 +1,28 @@ +package com.win.module.infra.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * API 异常数据的处理状态 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum ApiErrorLogProcessStatusEnum { + + INIT(0, "未处理"), + DONE(1, "已处理"), + IGNORE(2, "已忽略"); + + /** + * 状态 + */ + private final Integer status; + /** + * 资源类型名 + */ + private final String name; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java new file mode 100644 index 0000000..7d9572a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.infra.enums; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java new file mode 100644 index 0000000..6283f03 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java @@ -0,0 +1,9 @@ +package com.win.module.infra.framework.codegen.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(CodegenProperties.class) +public class CodegenConfiguration { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java new file mode 100644 index 0000000..01331a9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java @@ -0,0 +1,43 @@ +package com.win.module.infra.framework.codegen.config; + +import com.win.module.infra.enums.codegen.CodegenFrontTypeEnum; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Collection; + +@ConfigurationProperties(prefix = "win.codegen") +@Validated +@Data +public class CodegenProperties { + + /** + * 生成的 Java 代码的基础包 + */ + @NotNull(message = "Java 代码的基础包不能为空") + private String basePackage; + + /** + * 数据库名数组 + */ + @NotEmpty(message = "数据库不能为空") + private Collection dbSchemas; + + /** + * 代码生成的前端类型(默认) + * + * 枚举 {@link CodegenFrontTypeEnum#getType()} + */ + @NotNull(message = "代码生成的前端类型不能为空") + private Integer frontType; + + /** + * 是否生成单元测试 + */ + @NotNull(message = "是否生成单元测试不能为空") + private Boolean unitTestEnable; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java new file mode 100644 index 0000000..87b2b4a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java @@ -0,0 +1,4 @@ +/** + * 代码生成器 + */ +package com.win.module.infra.framework.codegen; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/config/WinFileAutoConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/config/WinFileAutoConfiguration.java new file mode 100644 index 0000000..c364fff --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/config/WinFileAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.win.module.infra.framework.file.config; + +import com.win.module.infra.framework.file.core.client.FileClientFactory; +import com.win.module.infra.framework.file.core.client.FileClientFactoryImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 文件配置类 + * + * @author 芋道源码 + */ +@Configuration(proxyBeanMethods = false) +public class WinFileAutoConfiguration { + + @Bean + public FileClientFactory fileClientFactory() { + return new FileClientFactoryImpl(); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/AbstractFileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/AbstractFileClient.java new file mode 100644 index 0000000..e1f979b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/AbstractFileClient.java @@ -0,0 +1,69 @@ +package com.win.module.infra.framework.file.core.client; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * 文件客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author 芋道源码 + */ +@Slf4j +public abstract class AbstractFileClient implements FileClient { + + /** + * 配置编号 + */ + private final Long id; + /** + * 文件配置 + */ + protected Config config; + + public AbstractFileClient(Long id, Config config) { + this.id = id; + this.config = config; + } + + /** + * 初始化 + */ + public final void init() { + doInit(); + log.debug("[init][配置({}) 初始化完成]", config); + } + + /** + * 自定义初始化 + */ + protected abstract void doInit(); + + public final void refresh(Config config) { + // 判断是否更新 + if (config.equals(this.config)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", config); + this.config = config; + // 初始化 + this.init(); + } + + @Override + public Long getId() { + return id; + } + + /** + * 格式化文件的 URL 访问地址 + * 使用场景:local、ftp、db,通过 FileController 的 getFile 来获取文件内容 + * + * @param domain 自定义域名 + * @param path 文件路径 + * @return URL 访问地址 + */ + protected String formatFileUrl(String domain, String path) { + return StrUtil.format("{}/admin-api/infra/file/{}/get/{}", domain, getId(), path); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClient.java new file mode 100644 index 0000000..6b76c8a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClient.java @@ -0,0 +1,55 @@ +package com.win.module.infra.framework.file.core.client; + +import com.win.module.infra.framework.file.core.client.s3.FilePresignedUrlRespDTO; + +/** + * 文件客户端 + * + * @author 芋道源码 + */ +public interface FileClient { + + /** + * 获得客户端编号 + * + * @return 客户端编号 + */ + Long getId(); + + /** + * 上传文件 + * + * @param content 文件流 + * @param path 相对路径 + * @return 完整路径,即 HTTP 访问地址 + * @throws Exception 上传文件时,抛出 Exception 异常 + */ + String upload(byte[] content, String path, String type) throws Exception; + + /** + * 删除文件 + * + * @param path 相对路径 + * @throws Exception 删除文件时,抛出 Exception 异常 + */ + void delete(String path) throws Exception; + + /** + * 获得文件的内容 + * + * @param path 相对路径 + * @return 文件的内容 + */ + byte[] getContent(String path) throws Exception; + + /** + * 获得文件预签名地址 + * + * @param path 相对路径 + * @return 文件预签名地址 + */ + default FilePresignedUrlRespDTO getPresignedObjectUrl(String path) throws Exception { + throw new UnsupportedOperationException("不支持的操作"); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientConfig.java new file mode 100644 index 0000000..994c03c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientConfig.java @@ -0,0 +1,16 @@ +package com.win.module.infra.framework.file.core.client; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * 文件客户端的配置 + * 不同实现的客户端,需要不同的配置,通过子类来定义 + * + * @author 芋道源码 + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) +// @JsonTypeInfo 注解的作用,Jackson 多态 +// 1. 序列化到时数据库时,增加 @class 属性。 +// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型 +public interface FileClientConfig { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactory.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactory.java new file mode 100644 index 0000000..f460778 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactory.java @@ -0,0 +1,24 @@ +package com.win.module.infra.framework.file.core.client; + +import com.win.module.infra.framework.file.core.enums.FileStorageEnum; + +public interface FileClientFactory { + + /** + * 获得文件客户端 + * + * @param configId 配置编号 + * @return 文件客户端 + */ + FileClient getFileClient(Long configId); + + /** + * 创建文件客户端 + * + * @param configId 配置编号 + * @param storage 存储器的枚举 {@link FileStorageEnum} + * @param config 文件配置 + */ + void createOrUpdateFileClient(Long configId, Integer storage, Config config); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactoryImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactoryImpl.java new file mode 100644 index 0000000..0f07651 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/FileClientFactoryImpl.java @@ -0,0 +1,56 @@ +package com.win.module.infra.framework.file.core.client; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; +import com.win.module.infra.framework.file.core.enums.FileStorageEnum; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 文件客户端的工厂实现类 + * + * @author 芋道源码 + */ +@Slf4j +public class FileClientFactoryImpl implements FileClientFactory { + + /** + * 文件客户端 Map + * key:配置编号 + */ + private final ConcurrentMap> clients = new ConcurrentHashMap<>(); + + @Override + public FileClient getFileClient(Long configId) { + AbstractFileClient client = clients.get(configId); + if (client == null) { + log.error("[getFileClient][配置编号({}) 找不到客户端]", configId); + } + return client; + } + + @Override + @SuppressWarnings("unchecked") + public void createOrUpdateFileClient(Long configId, Integer storage, Config config) { + AbstractFileClient client = (AbstractFileClient) clients.get(configId); + if (client == null) { + client = this.createFileClient(configId, storage, config); + client.init(); + clients.put(client.getId(), client); + } else { + client.refresh(config); + } + } + + @SuppressWarnings("unchecked") + private AbstractFileClient createFileClient( + Long configId, Integer storage, Config config) { + FileStorageEnum storageEnum = FileStorageEnum.getByStorage(storage); + Assert.notNull(storageEnum, String.format("文件配置(%s) 为空", storageEnum)); + // 创建客户端 + return (AbstractFileClient) ReflectUtil.newInstance(storageEnum.getClientClass(), configId, config); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClient.java new file mode 100644 index 0000000..3768d28 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClient.java @@ -0,0 +1,55 @@ +package com.win.module.infra.framework.file.core.client.db; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.module.infra.dal.dataobject.file.FileContentDO; +import com.win.module.infra.dal.mysql.file.FileContentMapper; +import com.win.module.infra.framework.file.core.client.AbstractFileClient; + +import java.util.Comparator; +import java.util.List; + +/** + * 基于 DB 存储的文件客户端的配置类 + * + * @author 芋道源码 + */ +public class DBFileClient extends AbstractFileClient { + + private FileContentMapper fileContentMapper; + + public DBFileClient(Long id, DBFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + fileContentMapper = SpringUtil.getBean(FileContentMapper.class); + } + + @Override + public String upload(byte[] content, String path, String type) { + FileContentDO contentDO = new FileContentDO().setConfigId(getId()) + .setPath(path).setContent(content); + fileContentMapper.insert(contentDO); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + fileContentMapper.deleteByConfigIdAndPath(getId(), path); + } + + @Override + public byte[] getContent(String path) { + List list = fileContentMapper.selectListByConfigIdAndPath(getId(), path); + if (CollUtil.isEmpty(list)) { + return null; + } + // 排序后,拿 id 最大的,即最后上传的 + list.sort(Comparator.comparing(FileContentDO::getId)); + return CollUtil.getLast(list).getContent(); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClientConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClientConfig.java new file mode 100644 index 0000000..e4cfe0a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/db/DBFileClientConfig.java @@ -0,0 +1,24 @@ +package com.win.module.infra.framework.file.core.client.db; + +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.NotEmpty; + +/** + * 基于 DB 存储的文件客户端的配置类 + * + * @author 芋道源码 + */ +@Data +public class DBFileClientConfig implements FileClientConfig { + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClient.java new file mode 100644 index 0000000..144cf7b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClient.java @@ -0,0 +1,77 @@ +package com.win.module.infra.framework.file.core.client.ftp; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.ftp.Ftp; +import cn.hutool.extra.ftp.FtpException; +import cn.hutool.extra.ftp.FtpMode; +import com.win.module.infra.framework.file.core.client.AbstractFileClient; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +/** + * Ftp 文件客户端 + * + * @author 芋道源码 + */ +public class FtpFileClient extends AbstractFileClient { + + private Ftp ftp; + + public FtpFileClient(Long id, FtpFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 把配置的 \ 替换成 /, 如果路径配置 \a\test, 替换成 /a/test, 替换方法已经处理 null 情况 + config.setBasePath(StrUtil.replace(config.getBasePath(), StrUtil.BACKSLASH, StrUtil.SLASH)); + // ftp的路径是 / 结尾 + if (!config.getBasePath().endsWith(StrUtil.SLASH)) { + config.setBasePath(config.getBasePath() + StrUtil.SLASH); + } + // 初始化 Ftp 对象 + this.ftp = new Ftp(config.getHost(), config.getPort(), config.getUsername(), config.getPassword(), + CharsetUtil.CHARSET_UTF_8, null, null, FtpMode.valueOf(config.getMode())); + } + + @Override + public String upload(byte[] content, String path, String type) { + // 执行写入 + String filePath = getFilePath(path); + String fileName = FileUtil.getName(filePath); + String dir = StrUtil.removeSuffix(filePath, fileName); + ftp.reconnectIfTimeout(); + boolean success = ftp.upload(dir, fileName, new ByteArrayInputStream(content)); + if (!success) { + throw new FtpException(StrUtil.format("上传文件到目标目录 ({}) 失败", filePath)); + } + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + ftp.reconnectIfTimeout(); + ftp.delFile(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + String fileName = FileUtil.getName(filePath); + String dir = StrUtil.removeSuffix(filePath, fileName); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ftp.reconnectIfTimeout(); + ftp.download(dir, fileName, out); + return out.toByteArray(); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClientConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClientConfig.java new file mode 100644 index 0000000..8c817c9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/ftp/FtpFileClientConfig.java @@ -0,0 +1,59 @@ +package com.win.module.infra.framework.file.core.client.ftp; + +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * Ftp 文件客户端的配置类 + * + * @author 芋道源码 + */ +@Data +public class FtpFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + + /** + * 主机地址 + */ + @NotEmpty(message = "host 不能为空") + private String host; + /** + * 主机端口 + */ + @NotNull(message = "port 不能为空") + private Integer port; + /** + * 用户名 + */ + @NotEmpty(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotEmpty(message = "密码不能为空") + private String password; + /** + * 连接模式 + * + * 使用 {@link cn.hutool.extra.ftp.FtpMode} 对应的字符串 + */ + @NotEmpty(message = "连接模式不能为空") + private String mode; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClient.java new file mode 100644 index 0000000..4ec8f61 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClient.java @@ -0,0 +1,52 @@ +package com.win.module.infra.framework.file.core.client.local; + +import cn.hutool.core.io.FileUtil; +import com.win.module.infra.framework.file.core.client.AbstractFileClient; + +import java.io.File; + +/** + * 本地文件客户端 + * + * @author 芋道源码 + */ +public class LocalFileClient extends AbstractFileClient { + + public LocalFileClient(Long id, LocalFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全风格。例如说 Linux 是 /,Windows 是 \ + if (!config.getBasePath().endsWith(File.separator)) { + config.setBasePath(config.getBasePath() + File.separator); + } + } + + @Override + public String upload(byte[] content, String path, String type) { + // 执行写入 + String filePath = getFilePath(path); + FileUtil.writeBytes(content, filePath); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + FileUtil.del(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + return FileUtil.readBytes(filePath); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClientConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClientConfig.java new file mode 100644 index 0000000..c694fd4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/local/LocalFileClientConfig.java @@ -0,0 +1,30 @@ +package com.win.module.infra.framework.file.core.client.local; + +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.NotEmpty; + +/** + * 本地文件客户端的配置类 + * + * @author 芋道源码 + */ +@Data +public class LocalFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/FilePresignedUrlRespDTO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/FilePresignedUrlRespDTO.java new file mode 100644 index 0000000..f859281 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/FilePresignedUrlRespDTO.java @@ -0,0 +1,29 @@ +package com.win.module.infra.framework.file.core.client.s3; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 文件预签名地址 Response DTO + * + * @author owen + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FilePresignedUrlRespDTO { + + /** + * 文件上传 URL(用于上传) + * + * 例如说: + */ + private String uploadUrl; + + /** + * 文件 URL(用于读取、下载等) + */ + private String url; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClient.java new file mode 100644 index 0000000..d46b6e6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClient.java @@ -0,0 +1,143 @@ +package com.win.module.infra.framework.file.core.client.s3; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.win.module.infra.framework.file.core.client.AbstractFileClient; +import io.minio.*; +import io.minio.http.Method; + +import java.io.ByteArrayInputStream; +import java.util.concurrent.TimeUnit; + +/** + * 基于 S3 协议的文件客户端,实现 MinIO、阿里云、腾讯云、七牛云、华为云等云服务 + *

+ * S3 协议的客户端,采用亚马逊提供的 software.amazon.awssdk.s3 库 + * + * @author 芋道源码 + */ +public class S3FileClient extends AbstractFileClient { + + private MinioClient client; + + public S3FileClient(Long id, S3FileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全 domain + if (StrUtil.isEmpty(config.getDomain())) { + config.setDomain(buildDomain()); + } + // 初始化客户端 + client = MinioClient.builder() + .endpoint(buildEndpointURL()) // Endpoint URL + .region(buildRegion()) // Region + .credentials(config.getAccessKey(), config.getAccessSecret()) // 认证密钥 + .build(); + enableVirtualStyleEndpoint(); + } + + /** + * 基于 endpoint 构建调用云服务的 URL 地址 + * + * @return URI 地址 + */ + private String buildEndpointURL() { + // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO + if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) { + return config.getEndpoint(); + } + return StrUtil.format("https://{}", config.getEndpoint()); + } + + /** + * 基于 bucket + endpoint 构建访问的 Domain 地址 + * + * @return Domain 地址 + */ + private String buildDomain() { + // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO + if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) { + return StrUtil.format("{}/{}", config.getEndpoint(), config.getBucket()); + } + // 阿里云、腾讯云、华为云都适合。七牛云比较特殊,必须有自定义域名 + return StrUtil.format("https://{}.{}", config.getBucket(), config.getEndpoint()); + } + + /** + * 基于 bucket 构建 region 地区 + * + * @return region 地区 + */ + private String buildRegion() { + // 阿里云必须有 region,否则会报错 + if (config.getEndpoint().contains(S3FileClientConfig.ENDPOINT_ALIYUN)) { + return StrUtil.subBefore(config.getEndpoint(), '.', false) + .replaceAll("-internal", "")// 去除内网 Endpoint 的后缀 + .replaceAll("https://", ""); + } + // 腾讯云必须有 region,否则会报错 + if (config.getEndpoint().contains(S3FileClientConfig.ENDPOINT_TENCENT)) { + return StrUtil.subAfter(config.getEndpoint(), "cos.", false) + .replaceAll("." + S3FileClientConfig.ENDPOINT_TENCENT, ""); // 去除 Endpoint + } + return null; + } + + /** + * 开启 VirtualStyle 模式 + */ + private void enableVirtualStyleEndpoint() { + if (StrUtil.containsAny(config.getEndpoint(), + S3FileClientConfig.ENDPOINT_TENCENT, // 腾讯云 https://cloud.tencent.com/document/product/436/41284 + S3FileClientConfig.ENDPOINT_VOLCES)) { // 火山云 https://www.volcengine.com/docs/6349/1288493 + client.enableVirtualStyleEndpoint(); + } + } + + @Override + public String upload(byte[] content, String path, String type) throws Exception { + // 执行上传 + client.putObject(PutObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .contentType(type) + .object(path) // 相对路径作为 key + .stream(new ByteArrayInputStream(content), content.length, -1) // 文件内容 + .build()); + // 拼接返回路径 + return config.getDomain() + "/" + path; + } + + @Override + public void delete(String path) throws Exception { + client.removeObject(RemoveObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .build()); + } + + @Override + public byte[] getContent(String path) throws Exception { + GetObjectResponse response = client.getObject(GetObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .build()); + return IoUtil.readBytes(response); + } + + @Override + public FilePresignedUrlRespDTO getPresignedObjectUrl(String path) throws Exception { + String uploadUrl = client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() + .method(Method.PUT) + .bucket(config.getBucket()) + .object(path) + .expiry(10, TimeUnit.MINUTES) // 过期时间(秒数)取值范围:1 秒 ~ 7 天 + .build() + ); + return new FilePresignedUrlRespDTO(uploadUrl, config.getDomain() + "/" + path); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClientConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClientConfig.java new file mode 100644 index 0000000..d64f69c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/s3/S3FileClientConfig.java @@ -0,0 +1,78 @@ +package com.win.module.infra.framework.file.core.client.s3; + +import cn.hutool.core.util.StrUtil; +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotNull; + +/** + * S3 文件客户端的配置类 + * + * @author 芋道源码 + */ +@Data +public class S3FileClientConfig implements FileClientConfig { + + public static final String ENDPOINT_QINIU = "qiniucs.com"; + public static final String ENDPOINT_ALIYUN = "aliyuncs.com"; + public static final String ENDPOINT_TENCENT = "myqcloud.com"; + public static final String ENDPOINT_VOLCES = "volces.com"; // 火山云(字节) + + /** + * 节点地址 + * 1. MinIO:https://www.iocoder.cn/Spring-Boot/MinIO 。例如说,http://127.0.0.1:9000 + * 2. 阿里云:https://help.aliyun.com/document_detail/31837.html + * 3. 腾讯云:https://cloud.tencent.com/document/product/436/6224 + * 4. 七牛云:https://developer.qiniu.com/kodo/4088/s3-access-domainname + * 5. 华为云:https://developer.huaweicloud.com/endpoint?OBS + */ + @NotNull(message = "endpoint 不能为空") + private String endpoint; + /** + * 自定义域名 + * 1. MinIO:通过 Nginx 配置 + * 2. 阿里云:https://help.aliyun.com/document_detail/31836.html + * 3. 腾讯云:https://cloud.tencent.com/document/product/436/11142 + * 4. 七牛云:https://developer.qiniu.com/kodo/8556/set-the-custom-source-domain-name + * 5. 华为云:https://support.huaweicloud.com/usermanual-obs/obs_03_0032.html + */ + @URL(message = "domain 必须是 URL 格式") + private String domain; + /** + * 存储 Bucket + */ + @NotNull(message = "bucket 不能为空") + private String bucket; + + /** + * 访问 Key + * 1. MinIO:https://www.iocoder.cn/Spring-Boot/MinIO + * 2. 阿里云:https://ram.console.aliyun.com/manage/ak + * 3. 腾讯云:https://console.cloud.tencent.com/cam/capi + * 4. 七牛云:https://portal.qiniu.com/user/key + * 5. 华为云:https://support.huaweicloud.com/qs-obs/obs_qs_0005.html + */ + @NotNull(message = "accessKey 不能为空") + private String accessKey; + /** + * 访问 Secret + */ + @NotNull(message = "accessSecret 不能为空") + private String accessSecret; + + @SuppressWarnings("RedundantIfStatement") + @AssertTrue(message = "domain 不能为空") + @JsonIgnore + public boolean isDomainValid() { + // 如果是七牛,必须带有 domain + if (StrUtil.contains(endpoint, ENDPOINT_QINIU) && StrUtil.isEmpty(domain)) { + return false; + } + return true; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClient.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClient.java new file mode 100644 index 0000000..1956716 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClient.java @@ -0,0 +1,61 @@ +package com.win.module.infra.framework.file.core.client.sftp; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.extra.ssh.Sftp; +import com.win.framework.common.util.io.FileUtils; +import com.win.module.infra.framework.file.core.client.AbstractFileClient; + +import java.io.File; + +/** + * Sftp 文件客户端 + * + * @author 芋道源码 + */ +public class SftpFileClient extends AbstractFileClient { + + private Sftp sftp; + + public SftpFileClient(Long id, SftpFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全风格。例如说 Linux 是 /,Windows 是 \ + if (!config.getBasePath().endsWith(File.separator)) { + config.setBasePath(config.getBasePath() + File.separator); + } + // 初始化 Ftp 对象 + this.sftp = new Sftp(config.getHost(), config.getPort(), config.getUsername(), config.getPassword()); + } + + @Override + public String upload(byte[] content, String path, String type) { + // 执行写入 + String filePath = getFilePath(path); + File file = FileUtils.createTempFile(content); + sftp.upload(filePath, file); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + sftp.delFile(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + File destFile = FileUtils.createTempFile(); + sftp.download(filePath, destFile); + return FileUtil.readBytes(destFile); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClientConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClientConfig.java new file mode 100644 index 0000000..a1c7f81 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/client/sftp/SftpFileClientConfig.java @@ -0,0 +1,52 @@ +package com.win.module.infra.framework.file.core.client.sftp; + +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * Sftp 文件客户端的配置类 + * + * @author 芋道源码 + */ +@Data +public class SftpFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + + /** + * 主机地址 + */ + @NotEmpty(message = "host 不能为空") + private String host; + /** + * 主机端口 + */ + @NotNull(message = "port 不能为空") + private Integer port; + /** + * 用户名 + */ + @NotEmpty(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotEmpty(message = "密码不能为空") + private String password; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/enums/FileStorageEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/enums/FileStorageEnum.java new file mode 100644 index 0000000..388ab6e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/enums/FileStorageEnum.java @@ -0,0 +1,55 @@ +package com.win.module.infra.framework.file.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.win.module.infra.framework.file.core.client.FileClient; +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import com.win.module.infra.framework.file.core.client.db.DBFileClient; +import com.win.module.infra.framework.file.core.client.db.DBFileClientConfig; +import com.win.module.infra.framework.file.core.client.ftp.FtpFileClient; +import com.win.module.infra.framework.file.core.client.ftp.FtpFileClientConfig; +import com.win.module.infra.framework.file.core.client.local.LocalFileClient; +import com.win.module.infra.framework.file.core.client.local.LocalFileClientConfig; +import com.win.module.infra.framework.file.core.client.s3.S3FileClient; +import com.win.module.infra.framework.file.core.client.s3.S3FileClientConfig; +import com.win.module.infra.framework.file.core.client.sftp.SftpFileClient; +import com.win.module.infra.framework.file.core.client.sftp.SftpFileClientConfig; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文件存储器枚举 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum FileStorageEnum { + + DB(1, DBFileClientConfig.class, DBFileClient.class), + + LOCAL(10, LocalFileClientConfig.class, LocalFileClient.class), + FTP(11, FtpFileClientConfig.class, FtpFileClient.class), + SFTP(12, SftpFileClientConfig.class, SftpFileClient.class), + + S3(20, S3FileClientConfig.class, S3FileClient.class), + ; + + /** + * 存储器 + */ + private final Integer storage; + + /** + * 配置类 + */ + private final Class configClass; + /** + * 客户端类 + */ + private final Class clientClass; + + public static FileStorageEnum getByStorage(Integer storage) { + return ArrayUtil.firstMatch(o -> o.getStorage().equals(storage), values()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/utils/FileTypeUtils.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/utils/FileTypeUtils.java new file mode 100644 index 0000000..e097612 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/core/utils/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.win.module.infra.framework.file.core.utils; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.ttl.TransmittableThreadLocal; +import jakarta.servlet.http.HttpServletResponse; +import lombok.SneakyThrows; +import org.apache.tika.Tika; + +import java.io.IOException; +import java.net.URLEncoder; + +/** + * 文件类型 Utils + * + * @author 芋道源码 + */ +public class FileTypeUtils { + + private static final ThreadLocal TIKA = TransmittableThreadLocal.withInitial(Tika::new); + + /** + * 获得文件的 mineType,对于doc,jar等文件会有误差 + * + * @param data 文件内容 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + @SneakyThrows + public static String getMineType(byte[] data) { + return TIKA.get().detect(data); + } + + /** + * 已知文件名,获取文件类型,在某些情况下比通过字节数组准确,例如使用jar文件时,通过名字更为准确 + * + * @param name 文件名 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + public static String getMineType(String name) { + return TIKA.get().detect(name); + } + + /** + * 在拥有文件和数据的情况下,最好使用此方法,最为准确 + * + * @param data 文件内容 + * @param name 文件名 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + public static String getMineType(byte[] data, String name) { + return TIKA.get().detect(data, name); + } + + /** + * 返回附件 + * + * @param response 响应 + * @param filename 文件名 + * @param content 附件内容 + */ + public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException { + // 设置 header 和 contentType + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + String contentType = getMineType(content, filename); + response.setContentType(contentType); + // 针对 video 的特殊处理,解决视频地址在移动端播放的兼容性问题 + if (StrUtil.containsIgnoreCase(contentType, "video")) { + response.setHeader("Content-Length", String.valueOf(content.length - 1)); + response.setHeader("Content-Range", String.valueOf(content.length - 1)); + response.setHeader("Accept-Ranges", "bytes"); + } + // 输出附件 + IoUtil.write(response.getOutputStream(), false, content); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/package-info.java new file mode 100644 index 0000000..f99c169 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/file/package-info.java @@ -0,0 +1,12 @@ +/** + * 文件客户端,支持多种存储器 + * + * 1. local:本地磁盘 + * 2. ftp:FTP 服务器 + * 3. sftp:SFTP 服务器 + * 4. db:数据库 + * 5. s3:支持 S3 协议的云存储服务,例如说 MinIO、阿里云、华为云、腾讯云、七牛云等等 + * + * @author 芋道源码 + */ +package com.win.module.infra.framework.file; \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java new file mode 100644 index 0000000..847b7a1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java @@ -0,0 +1,9 @@ +package com.win.module.infra.framework.monitor.config; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableAdminServer +public class AdminServerConfiguration { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java new file mode 100644 index 0000000..9f9f730 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Spring Boot Admin 实现简单的监控平台 + */ +package com.win.module.infra.framework.monitor; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md new file mode 100644 index 0000000..5641db1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md @@ -0,0 +1 @@ + diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java new file mode 100644 index 0000000..0cb7189 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 infra 模块的 framework 封装 + * + * @author 芋道源码 + */ +package com.win.module.infra.framework; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java new file mode 100644 index 0000000..97b79a0 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java @@ -0,0 +1,45 @@ +package com.win.module.infra.framework.security.config; + +import com.win.framework.security.config.AuthorizeRequestsCustomizer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; + +/** + * Infra 模块的 Security 配置 + */ +@Configuration(proxyBeanMethods = false, value = "infraSecurityConfiguration") +public class SecurityConfiguration { + + @Value("${spring.boot.admin.context-path:''}") + private String adminSeverContextPath; + + @Bean("infraAuthorizeRequestsCustomizer") + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { + return new AuthorizeRequestsCustomizer() { + + @Override + public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) { + // Swagger 接口文档 + registry.requestMatchers("/v3/api-docs/**").permitAll() + .requestMatchers("/webjars/**").permitAll() + .requestMatchers("/swagger-ui.html").permitAll() + .requestMatchers("/swagger-ui/**").permitAll(); + // Spring Boot Actuator 的安全配置 + registry.requestMatchers("/actuator").permitAll() + .requestMatchers("/actuator/**").permitAll(); + // Druid 监控 + registry.requestMatchers("/druid/**").permitAll(); + // Spring Boot Admin Server 的安全配置 + registry.requestMatchers(adminSeverContextPath).permitAll() + .requestMatchers(adminSeverContextPath + "/**").permitAll(); + // 文件读取 + registry.requestMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll(); + } + + }; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java new file mode 100644 index 0000000..26f91a7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.infra.framework.security.core; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java new file mode 100644 index 0000000..bea9adb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java @@ -0,0 +1,24 @@ +package com.win.module.infra.framework.web.config; + +import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * infra 模块的 web 组件的 Configuration + * + * @author 芋道源码 + */ +@Configuration(proxyBeanMethods = false) +public class InfraWebConfiguration { + + /** + * infra 模块的 API 分组 + */ + @Bean + public GroupedOpenApi infraGroupedOpenApi() { + return WinSwaggerAutoConfiguration.buildGroupedOpenApi("infra"); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java new file mode 100644 index 0000000..20da828 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * infra 模块的 web 配置 + */ +package com.win.module.infra.framework.web; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/job/JobLogCleanJob.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/job/JobLogCleanJob.java new file mode 100644 index 0000000..5ef7e3e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/job/JobLogCleanJob.java @@ -0,0 +1,40 @@ +package com.win.module.infra.job.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.framework.tenant.core.aop.TenantIgnore; +import com.win.module.infra.service.job.JobLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import jakarta.annotation.Resource; + +/** + * 物理删除 N 天前的任务日志的 Job + * + * @author j-sentinel + */ +@Slf4j +@Component +public class JobLogCleanJob implements JobHandler { + + @Resource + private JobLogService jobLogService; + + /** + * 清理超过(14)天的日志 + */ + private static final Integer JOB_CLEAN_RETAIN_DAY = 14; + + /** + * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大 + */ + private static final Integer DELETE_LIMIT = 100; + + @Override + @TenantIgnore + public String execute(String param) { + Integer count = jobLogService.cleanJobLog(JOB_CLEAN_RETAIN_DAY, DELETE_LIMIT); + log.info("[execute][定时执行清理定时任务日志数量 ({}) 个]", count); + return String.format("定时执行清理定时任务日志数量 %s 个", count); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/AccessLogCleanJob.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/AccessLogCleanJob.java new file mode 100644 index 0000000..79499b9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/AccessLogCleanJob.java @@ -0,0 +1,41 @@ +package com.win.module.infra.job.logger; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.framework.tenant.core.aop.TenantIgnore; +import com.win.module.infra.service.logger.ApiAccessLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + +/** + * 物理删除 N 天前的访问日志的 Job + * + * @author j-sentinel + */ +@Component +@Slf4j +public class AccessLogCleanJob implements JobHandler { + + @Resource + private ApiAccessLogService apiAccessLogService; + + /** + * 清理超过(14)天的日志 + */ + private static final Integer JOB_CLEAN_RETAIN_DAY = 14; + + /** + * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大 + */ + private static final Integer DELETE_LIMIT = 100; + + @Override + @TenantIgnore + public String execute(String param) { + Integer count = apiAccessLogService.cleanAccessLog(JOB_CLEAN_RETAIN_DAY, DELETE_LIMIT); + log.info("[execute][定时执行清理访问日志数量 ({}) 个]", count); + return String.format("定时执行清理访问日志数量 %s 个", count); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/ErrorLogCleanJob.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/ErrorLogCleanJob.java new file mode 100644 index 0000000..68808e4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/job/logger/ErrorLogCleanJob.java @@ -0,0 +1,41 @@ +package com.win.module.infra.job.logger; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.framework.tenant.core.aop.TenantIgnore; +import com.win.module.infra.service.logger.ApiErrorLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + +/** + * 物理删除 N 天前的错误日志的 Job + * + * @author j-sentinel + */ +@Slf4j +@Component +public class ErrorLogCleanJob implements JobHandler { + + @Resource + private ApiErrorLogService apiErrorLogService; + + /** + * 清理超过(14)天的日志 + */ + private static final Integer JOB_CLEAN_RETAIN_DAY = 14; + + /** + * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大 + */ + private static final Integer DELETE_LIMIT = 100; + + @Override + @TenantIgnore + public String execute(String param) { + Integer count = apiErrorLogService.cleanErrorLog(JOB_CLEAN_RETAIN_DAY,DELETE_LIMIT); + log.info("[execute][定时执行清理错误日志数量 ({}) 个]", count); + return String.format("定时执行清理错误日志数量 %s 个", count); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/package-info.java new file mode 100644 index 0000000..3a24032 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/package-info.java @@ -0,0 +1,4 @@ +/** + * 消息队列的消费者 + */ +package com.win.module.infra.mq.consumer; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/package-info.java new file mode 100644 index 0000000..02209df --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/package-info.java @@ -0,0 +1,4 @@ +/** + * 消息队列的消息 + */ +package com.win.module.infra.mq.message; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/package-info.java new file mode 100644 index 0000000..1c75e0d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/package-info.java @@ -0,0 +1,4 @@ +/** + * 消息队列的生产者 + */ +package com.win.module.infra.mq.producer; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java new file mode 100644 index 0000000..70386fc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java @@ -0,0 +1,9 @@ +/** + * infra 模块,主要提供两块能力: + * 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + * 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + * + * 1. Controller URL:以 /infra/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 infra_ 开头,方便在数据库中区分 + */ +package com.win.module.infra; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java new file mode 100644 index 0000000..ccb83c4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java @@ -0,0 +1,101 @@ +package com.win.module.infra.service.codegen; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; +import com.win.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 Service 接口 + * + * @author 芋道源码 + */ +public interface CodegenService { + + /** + * 基于数据库的表结构,创建代码生成器的表定义 + * + * @param userId 用户编号 + * @param reqVO 表信息 + * @return 创建的表定义的编号数组 + */ + List createCodegenList(Long userId, CodegenCreateListReqVO reqVO); + + /** + * 更新数据库的表和字段定义 + * + * @param updateReqVO 更新信息 + */ + void updateCodegen(CodegenUpdateReqVO updateReqVO); + + /** + * 基于数据库的表结构,同步数据库的表和字段定义 + * + * @param tableId 表编号 + */ + void syncCodegenFromDB(Long tableId); + + /** + * 删除数据库的表和字段定义 + * + * @param tableId 数据编号 + */ + void deleteCodegen(Long tableId); + + /** + * 获得表定义列表 + * + * @param dataSourceConfigId 数据源配置的编号 + * @return 表定义列表 + */ + List getCodegenTableList(Long dataSourceConfigId); + + /** + * 获得表定义分页 + * + * @param pageReqVO 分页条件 + * @return 表定义分页 + */ + PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO); + + /** + * 获得表定义 + * + * @param id 表编号 + * @return 表定义 + */ + CodegenTableDO getCodegenTable(Long id); + + /** + * 获得指定表的字段定义数组 + * + * @param tableId 表编号 + * @return 字段定义数组 + */ + List getCodegenColumnListByTableId(Long tableId); + + /** + * 执行指定表的代码生成 + * + * @param tableId 表编号 + * @return 生成结果。key 为文件路径,value 为对应的代码内容 + */ + Map generationCodes(Long tableId); + + /** + * 获得数据库自带的表定义列表 + * + * @param dataSourceConfigId 数据源的配置编号 + * @param name 表名称 + * @param comment 表描述 + * @return 表定义列表 + */ + List getDatabaseTableList(Long dataSourceConfigId, String name, String comment); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java new file mode 100644 index 0000000..b91f14b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java @@ -0,0 +1,296 @@ +package com.win.module.infra.service.codegen; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; +import com.win.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.dal.mysql.codegen.CodegenColumnMapper; +import com.win.module.infra.dal.mysql.codegen.CodegenTableMapper; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.win.module.infra.framework.codegen.config.CodegenProperties; +import com.win.module.infra.service.codegen.inner.CodegenBuilder; +import com.win.module.infra.service.codegen.inner.CodegenEngine; +import com.win.module.infra.service.db.DatabaseTableService; +import com.win.module.system.api.user.AdminUserApi; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.google.common.annotations.VisibleForTesting; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 代码生成 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class CodegenServiceImpl implements CodegenService { + + @Resource + private DatabaseTableService databaseTableService; + + @Resource + private CodegenTableMapper codegenTableMapper; + @Resource + private CodegenColumnMapper codegenColumnMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + private CodegenBuilder codegenBuilder; + @Resource + private CodegenEngine codegenEngine; + + @Resource + private CodegenProperties codegenProperties; + + @Override + @Transactional(rollbackFor = Exception.class) + public List createCodegenList(Long userId, CodegenCreateListReqVO reqVO) { + List ids = new ArrayList<>(reqVO.getTableNames().size()); + // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 + reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(userId, reqVO.getDataSourceConfigId(), tableName))); + return ids; + } + + private Long createCodegen(Long userId, Long dataSourceConfigId, String tableName) { + // 从数据库中,获得数据库表结构 + TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName); + // 导入 + return createCodegen0(userId, dataSourceConfigId, tableInfo); + } + + private Long createCodegen0(Long userId, Long dataSourceConfigId, TableInfo tableInfo) { + // 校验导入的表和字段非空 + validateTableInfo(tableInfo); + // 校验是否已经存在 + if (codegenTableMapper.selectByTableNameAndDataSourceConfigId(tableInfo.getName(), + dataSourceConfigId) != null) { + throw exception(CODEGEN_TABLE_EXISTS); + } + + // 构建 CodegenTableDO 对象,插入到 DB 中 + CodegenTableDO table = codegenBuilder.buildTable(tableInfo); + table.setDataSourceConfigId(dataSourceConfigId); + table.setScene(CodegenSceneEnum.ADMIN.getScene()); // 默认配置下,使用管理后台的模板 + table.setFrontType(codegenProperties.getFrontType()); + table.setAuthor(userApi.getUser(userId).getNickname()); + codegenTableMapper.insert(table); + + // 构建 CodegenColumnDO 数组,插入到 DB 中 + List columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields()); + // 如果没有主键,则使用第一个字段作为主键 + if (!tableInfo.isHavePrimaryKey()) { + columns.get(0).setPrimaryKey(true); + } + codegenColumnMapper.insertBatch(columns); + return table.getId(); + } + + @VisibleForTesting + void validateTableInfo(TableInfo tableInfo) { + if (tableInfo == null) { + throw exception(CODEGEN_IMPORT_TABLE_NULL); + } + if (StrUtil.isEmpty(tableInfo.getComment())) { + throw exception(CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL); + } + if (CollUtil.isEmpty(tableInfo.getFields())) { + throw exception(CODEGEN_IMPORT_COLUMNS_NULL); + } + tableInfo.getFields().forEach(field -> { + if (StrUtil.isEmpty(field.getComment())) { + throw exception(CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL, field.getName()); + } + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCodegen(CodegenUpdateReqVO updateReqVO) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + // 校验主表字段存在 + if (Objects.equals(updateReqVO.getTable().getTemplateType(), CodegenTemplateTypeEnum.SUB.getType())) { + if (codegenTableMapper.selectById(updateReqVO.getTable().getMasterTableId()) == null) { + throw exception(CODEGEN_MASTER_TABLE_NOT_EXISTS, updateReqVO.getTable().getMasterTableId()); + } + if (CollUtil.findOne(updateReqVO.getColumns(), // 关联主表的字段不存在 + column -> column.getId().equals(updateReqVO.getTable().getSubJoinColumnId())) == null) { + throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, updateReqVO.getTable().getSubJoinColumnId()); + } + } + + // 更新 table 表定义 + CodegenTableDO updateTableObj = BeanUtils.toBean(updateReqVO.getTable(), CodegenTableDO.class); + codegenTableMapper.updateById(updateTableObj); + // 更新 column 字段定义 + List updateColumnObjs = BeanUtils.toBean(updateReqVO.getColumns(), CodegenColumnDO.class); + updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncCodegenFromDB(Long tableId) { + // 校验是否已经存在 + CodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + // 从数据库中,获得数据库表结构 + TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName()); + // 执行同步 + syncCodegen0(tableId, tableInfo); + } + + private void syncCodegen0(Long tableId, TableInfo tableInfo) { + // 1. 校验导入的表和字段非空 + validateTableInfo(tableInfo); + List tableFields = tableInfo.getFields(); + + // 2. 构建 CodegenColumnDO 数组,只同步新增的字段 + List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); + Set codegenColumnNames = convertSet(codegenColumns, CodegenColumnDO::getColumnName); + + // 3.1 计算需要【修改】的字段,插入时重新插入,删除时将原来的删除 + Map codegenColumnDOMap = convertMap(codegenColumns, CodegenColumnDO::getColumnName); + BiPredicate primaryKeyPredicate = + (tableField, codegenColumn) -> tableField.getMetaInfo().getJdbcType().name().equals(codegenColumn.getDataType()) + && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable() + && tableField.isKeyFlag() == codegenColumn.getPrimaryKey() + && tableField.getComment().equals(codegenColumn.getColumnComment()); + Set modifyFieldNames = IntStream.range(0, tableFields.size()).mapToObj(index -> { + TableField tableField = tableFields.get(index); + String columnName = tableField.getColumnName(); + CodegenColumnDO codegenColumn = codegenColumnDOMap.get(columnName); + if (codegenColumn == null) { + return null; + } + if (!primaryKeyPredicate.test(tableField, codegenColumn) || codegenColumn.getOrdinalPosition() != index) { + return columnName; + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toSet()); + // 3.2 计算需要【删除】的字段 + Set tableFieldNames = convertSet(tableFields, TableField::getName); + Set deleteColumnIds = codegenColumns.stream() + .filter(column -> (!tableFieldNames.contains(column.getColumnName())) || modifyFieldNames.contains(column.getColumnName())) + .map(CodegenColumnDO::getId).collect(Collectors.toSet()); + // 移除已经存在的字段 + tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()) && (!modifyFieldNames.contains(column.getColumnName()))); + if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) { + throw exception(CODEGEN_SYNC_NONE_CHANGE); + } + + // 4.1 插入新增的字段 + List columns = codegenBuilder.buildColumns(tableId, tableFields); + codegenColumnMapper.insertBatch(columns); + // 4.2 删除不存在的字段 + if (CollUtil.isNotEmpty(deleteColumnIds)) { + codegenColumnMapper.deleteBatchIds(deleteColumnIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCodegen(Long tableId) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(tableId) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 删除 table 表定义 + codegenTableMapper.deleteById(tableId); + // 删除 column 字段定义 + codegenColumnMapper.deleteListByTableId(tableId); + } + + @Override + public List getCodegenTableList(Long dataSourceConfigId) { + return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId); + } + + @Override + public PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO) { + return codegenTableMapper.selectPage(pageReqVO); + } + + @Override + public CodegenTableDO getCodegenTable(Long id) { + return codegenTableMapper.selectById(id); + } + + @Override + public List getCodegenColumnListByTableId(Long tableId) { + return codegenColumnMapper.selectListByTableId(tableId); + } + + @Override + public Map generationCodes(Long tableId) { + // 校验是否已经存在 + CodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + List columns = codegenColumnMapper.selectListByTableId(tableId); + if (CollUtil.isEmpty(columns)) { + throw exception(CODEGEN_COLUMN_NOT_EXISTS); + } + + // 如果是主子表,则加载对应的子表信息 + List subTables = null; + List> subColumnsList = null; + if (CodegenTemplateTypeEnum.isMaster(table.getTemplateType())) { + // 校验子表存在 + subTables = codegenTableMapper.selectListByTemplateTypeAndMasterTableId( + CodegenTemplateTypeEnum.SUB.getType(), tableId); + if (CollUtil.isEmpty(subTables)) { + throw exception(CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE); + } + // 校验子表的关联字段存在 + subColumnsList = new ArrayList<>(); + for (CodegenTableDO subTable : subTables) { + List subColumns = codegenColumnMapper.selectListByTableId(subTable.getId()); + if (CollUtil.findOne(subColumns, column -> column.getId().equals(subTable.getSubJoinColumnId())) == null) { + throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, subTable.getId()); + } + subColumnsList.add(subColumns); + } + } + + // 执行生成 + return codegenEngine.execute(table, columns, subTables, subColumnsList); + } + + @Override + public List getDatabaseTableList(Long dataSourceConfigId, String name, String comment) { + List tables = databaseTableService.getTableList(dataSourceConfigId, name, comment); + // 移除在 Codegen 中,已经存在的 + Set existsTables = convertSet( + codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName); + tables.removeIf(table -> existsTables.contains(table.getName())); + return BeanUtils.toBean(tables, DatabaseTableRespVO.class); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java new file mode 100644 index 0000000..d40a397 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java @@ -0,0 +1,221 @@ +package com.win.module.infra.service.codegen.inner; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.convert.codegen.CodegenConvert; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; +import com.win.module.infra.enums.codegen.CodegenColumnListConditionEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.google.common.collect.Sets; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.*; + +import static cn.hutool.core.text.CharSequenceUtil.*; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.hutool.core.util.RandomUtil.randomInt; + +/** + * 代码生成器的 Builder,负责: + * 1. 将数据库的表 {@link TableInfo} 定义,构建成 {@link CodegenTableDO} + * 2. 将数据库的列 {@link TableField} 构定义,建成 {@link CodegenColumnDO} + */ +@Component +public class CodegenBuilder { + + /** + * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map COLUMN_LIST_OPERATION_CONDITION_MAPPINGS = + MapUtil.builder() + .put("name", CodegenColumnListConditionEnum.LIKE) + .put("time", CodegenColumnListConditionEnum.BETWEEN) + .put("date", CodegenColumnListConditionEnum.BETWEEN) + .build(); + + /** + * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map COLUMN_HTML_TYPE_MAPPINGS = + MapUtil.builder() + .put("status", CodegenColumnHtmlTypeEnum.RADIO) + .put("sex", CodegenColumnHtmlTypeEnum.RADIO) + .put("type", CodegenColumnHtmlTypeEnum.SELECT) + .put("image", CodegenColumnHtmlTypeEnum.IMAGE_UPLOAD) + .put("file", CodegenColumnHtmlTypeEnum.FILE_UPLOAD) + .put("content", CodegenColumnHtmlTypeEnum.EDITOR) + .put("description", CodegenColumnHtmlTypeEnum.EDITOR) + .put("demo", CodegenColumnHtmlTypeEnum.EDITOR) + .put("time", CodegenColumnHtmlTypeEnum.DATETIME) + .put("date", CodegenColumnHtmlTypeEnum.DATETIME) + .build(); + + /** + * 多租户编号的字段名 + */ + public static final String TENANT_ID_FIELD = "tenantId"; + /** + * {@link com.win.framework.mybatis.core.dataobject.BaseDO} 的字段 + */ + public static final Set BASE_DO_FIELDS = new HashSet<>(); + /** + * 新增操作,不需要传递的字段 + */ + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 修改操作,不需要传递的字段 + */ + private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); + /** + * 列表操作的条件,不需要传递的字段 + */ + private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 列表操作的结果,不需要返回的字段 + */ + private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); + + static { + Arrays.stream(ReflectUtil.getFields(BaseDO.class)).forEach(field -> BASE_DO_FIELDS.add(field.getName())); + BASE_DO_FIELDS.add(TENANT_ID_FIELD); + // 处理 OPERATION 相关的字段 + CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 + } + + public CodegenTableDO buildTable(TableInfo tableInfo) { + CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo); + initTableDefault(table); + return table; + } + + /** + * 初始化 Table 表的默认字段 + * + * @param table 表定义 + */ + private void initTableDefault(CodegenTableDO table) { + // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 Dept + // 如果希望以 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 SystemDept 即可 + String tableName = table.getTableName().toLowerCase(); + // 第一步,_ 前缀的前面,作为 module 名字;第二步,moduleName 必须小写; + table.setModuleName(subBefore(tableName, '_', false).toLowerCase()); + // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰; 第三步,businessName 必须小写; + table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); + // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 + table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); + // 去除结尾的表,作为类描述 + table.setClassComment(StrUtil.removeSuffixIgnoreCase(table.getTableComment(), "表")); + table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()); + } + + public List buildColumns(Long tableId, List tableFields) { + List columns = CodegenConvert.INSTANCE.convertList(tableFields); + int index = 1; + for (CodegenColumnDO column : columns) { + column.setTableId(tableId); + column.setOrdinalPosition(index++); + // 特殊处理:Byte => Integer + if (Byte.class.getSimpleName().equals(column.getJavaType())) { + column.setJavaType(Integer.class.getSimpleName()); + } + // 初始化 Column 列的默认字段 + processColumnOperation(column); // 处理 CRUD 相关的字段的默认值 + processColumnUI(column); // 处理 UI 相关的字段的默认值 + processColumnExample(column); // 处理字段的 swagger example 示例 + } + return columns; + } + + private void processColumnOperation(CodegenColumnDO column) { + // 处理 createOperation 字段 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 + // 处理 updateOperation 字段 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + || column.getPrimaryKey()); // 对于主键,更新时需要传递 + // 处理 listOperation 字段 + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 + // 处理 listOperationCondition 字段 + COLUMN_LIST_OPERATION_CONDITION_MAPPINGS.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + if (column.getListOperationCondition() == null) { + column.setListOperationCondition(CodegenColumnListConditionEnum.EQ.getCondition()); + } + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); + } + + private void processColumnUI(CodegenColumnDO column) { + // 基于后缀进行匹配 + COLUMN_HTML_TYPE_MAPPINGS.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); + // 如果是 Boolean 类型时,设置为 radio 类型. + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.RADIO.getType()); + } + // 如果是 LocalDateTime 类型,则设置为 datetime 类型 + if (LocalDateTime.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.DATETIME.getType()); + } + // 兜底,设置默认为 input 类型 + if (column.getHtmlType() == null) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.INPUT.getType()); + } + } + + /** + * 处理字段的 swagger example 示例 + * + * @param column 字段 + */ + private void processColumnExample(CodegenColumnDO column) { + // id、price、count 等可能是整数的后缀 + if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "id", "price", "count")) { + column.setExample(String.valueOf(randomInt(1, Short.MAX_VALUE))); + return; + } + // name + if (StrUtil.endWithIgnoreCase(column.getJavaField(), "name")) { + column.setExample(randomEle(new String[]{"张三", "李四", "王五", "赵六", "芋艿"})); + return; + } + // status + if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "status", "type")) { + column.setExample(randomEle(new String[]{"1", "2"})); + return; + } + // url + if (StrUtil.endWithIgnoreCase(column.getColumnName(), "url")) { + column.setExample("https://www.iocoder.cn"); + return; + } + // reason + if (StrUtil.endWithIgnoreCase(column.getColumnName(), "reason")) { + column.setExample(randomEle(new String[]{"不喜欢", "不对", "不好", "不香"})); + return; + } + // description、memo、remark + if (StrUtil.endWithAnyIgnoreCase(column.getColumnName(), "description", "memo", "remark")) { + column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"})); + return; + } + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java new file mode 100644 index 0000000..7fd817d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java @@ -0,0 +1,511 @@ +package com.win.module.infra.service.codegen.inner; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.engine.velocity.VelocityEngine; +import cn.hutool.system.SystemUtil; +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.apilog.core.enums.OperateTypeEnum; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.date.LocalDateTimeUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.common.util.object.ObjectUtils; +import com.win.framework.common.util.string.StrUtils; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.enums.codegen.CodegenFrontTypeEnum; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.win.module.infra.framework.codegen.config.CodegenProperties; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.Maps; +import com.google.common.collect.Table; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.Setter; +import org.springframework.stereotype.Component; + +import java.util.*; + +import static cn.hutool.core.map.MapUtil.getStr; +import static cn.hutool.core.text.CharSequenceUtil.*; + +/** + * 代码生成的引擎,用于具体生成代码 + * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 + * + * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 + * + * @author 芋道源码 + */ +@Component +public class CodegenEngine { + + /** + * 后端的模板配置 + * + * key:模板在 resources 的地址 + * value:生成的路径 + */ + private static final Map SERVER_TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 + // Java module-biz Main + .put(javaTemplatePath("controller/vo/pageReqVO"), javaModuleImplVOFilePath("PageReqVO")) + .put(javaTemplatePath("controller/vo/listReqVO"), javaModuleImplVOFilePath("ListReqVO")) + .put(javaTemplatePath("controller/vo/respVO"), javaModuleImplVOFilePath("RespVO")) + .put(javaTemplatePath("controller/vo/saveReqVO"), javaModuleImplVOFilePath("SaveReqVO")) + .put(javaTemplatePath("controller/controller"), javaModuleImplControllerFilePath()) + .put(javaTemplatePath("dal/do"), + javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) + .put(javaTemplatePath("dal/do_sub"), // 特殊:主子表专属逻辑 + javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${subTable.className}DO")) + .put(javaTemplatePath("dal/mapper"), + javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) + .put(javaTemplatePath("dal/mapper_sub"), // 特殊:主子表专属逻辑 + javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${subTable.className}Mapper")) + .put(javaTemplatePath("dal/mapper.xml"), mapperXmlFilePath()) + .put(javaTemplatePath("service/serviceImpl"), + javaModuleImplMainFilePath("service/${table.businessName}/${table.className}ServiceImpl")) + .put(javaTemplatePath("service/service"), + javaModuleImplMainFilePath("service/${table.businessName}/${table.className}Service")) + // Java module-biz Test + .put(javaTemplatePath("test/serviceTest"), + javaModuleImplTestFilePath("service/${table.businessName}/${table.className}ServiceImplTest")) + // Java module-api Main + .put(javaTemplatePath("enums/errorcode"), javaModuleApiMainFilePath("enums/ErrorCodeConstants_手动操作")) + // SQL + .put("codegen/sql/sql.vm", "sql/sql.sql") + .put("codegen/sql/h2.vm", "sql/h2.sql") + .build(); + + /** + * 后端的配置模版 + * + * key1:UI 模版的类型 {@link CodegenFrontTypeEnum#getType()} + * key2:模板在 resources 的地址 + * value:生成的路径 + */ + private static final Table FRONT_TEMPLATES = ImmutableTable.builder() + // Vue2 标准模版 + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/index.vue"), + vueFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("api/api.js"), + vueFilePath("api/${table.moduleName}/${table.businessName}/index.js")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/form.vue"), + vueFilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/components/form_sub_normal.vue"), // 特殊:主子表专属逻辑 + vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/components/form_sub_inner.vue"), // 特殊:主子表专属逻辑 + vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/components/form_sub_erp.vue"), // 特殊:主子表专属逻辑 + vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/components/list_sub_inner.vue"), // 特殊:主子表专属逻辑 + vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/components/list_sub_erp.vue"), // 特殊:主子表专属逻辑 + vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) + // Vue3 标准模版 + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/index.vue"), + vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/form.vue"), + vue3FilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/components/form_sub_normal.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/components/form_sub_inner.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/components/form_sub_erp.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/components/list_sub_inner.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/components/list_sub_erp.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("api/api.ts"), + vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) + // Vue3 vben 模版 + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("views/data.ts"), + vue3FilePath("views/${table.moduleName}/${table.businessName}/${classNameVar}.data.ts")) + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("views/index.vue"), + vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("views/form.vue"), + vue3FilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Modal.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("api/api.ts"), + vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) + .build(); + + @Resource + private CodegenProperties codegenProperties; + + /** + * 是否使用 jakarta 包,用于解决 Spring Boot 2.X 和 3.X 的兼容性问题 + * + * true - 使用 jakarta.validation.constraints.* + * false - 使用 javax.validation.constraints.* + */ + @Setter // 允许设置的原因,是因为单测需要手动改变 + private Boolean jakartaEnable; + + /** + * 模板引擎,由 hutool 实现 + */ + private final TemplateEngine templateEngine; + /** + * 全局通用变量映射 + */ + private final Map globalBindingMap = new HashMap<>(); + + public CodegenEngine() { + // 初始化 TemplateEngine 属性 + TemplateConfig config = new TemplateConfig(); + config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); + this.templateEngine = new VelocityEngine(config); + // 设置 javaxEnable,按照是否使用 JDK17 来判断 + this.jakartaEnable = SystemUtil.getJavaInfo().isJavaVersionAtLeast(1700); // 17.00 * 100 + } + + @PostConstruct + @VisibleForTesting + void initGlobalBindingMap() { + // 全局配置 + globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); + globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() + + '.' + "framework"); // 用于后续获取测试类的 package 地址 + globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); + // 全局 Java Bean + globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); + globalBindingMap.put("PageResultClassName", PageResult.class.getName()); + // VO 类,独有字段 + globalBindingMap.put("PageParamClassName", PageParam.class.getName()); + globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); + // DO 类,独有字段 + globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); + globalBindingMap.put("baseDOFields", CodegenBuilder.BASE_DO_FIELDS); + globalBindingMap.put("QueryWrapperClassName", LambdaQueryWrapperX.class.getName()); + globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); + // Util 工具类 + globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); + globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); + globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); + globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName()); + globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName()); + globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); + globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName()); + globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); + globalBindingMap.put("BeanUtils", BeanUtils.class.getName()); + } + + /** + * 生成代码 + * + * @param table 表定义 + * @param columns table 的字段定义数组 + * @param subTables 子表数组,当且仅当主子表时使用 + * @param subColumnsList subTables 的字段定义数组 + * @return 生成的代码,key 是路径,value 是对应代码 + */ + public Map execute(CodegenTableDO table, List columns, + List subTables, List> subColumnsList) { + // 1.1 初始化 bindMap 上下文 + Map bindingMap = initBindingMap(table, columns, subTables, subColumnsList); + // 1.2 获得模版 + Map templates = getTemplates(table.getFrontType()); + + // 2. 执行生成 + Map result = Maps.newLinkedHashMapWithExpectedSize(templates.size()); // 有序 + templates.forEach((vmPath, filePath) -> { + // 2.1 特殊:主子表专属逻辑 + if (isSubTemplate(vmPath)) { + generateSubCode(table, subTables, result, vmPath, filePath, bindingMap); + return; + // 2.2 特殊:树表专属逻辑 + } else if (isPageReqVOTemplate(vmPath)) { + // 减少多余的类生成,例如说 PageVO.java 类 + if (CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { + return; + } + } else if (isListReqVOTemplate(vmPath)) { + // 减少多余的类生成,例如说 ListVO.java 类 + if (!CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { + return; + } + } + // 2.3 默认生成 + generateCode(result, vmPath, filePath, bindingMap); + }); + return result; + } + + private void generateCode(Map result, String vmPath, + String filePath, Map bindingMap) { + filePath = formatFilePath(filePath, bindingMap); + String content = templateEngine.getTemplate(vmPath).render(bindingMap); + // 格式化代码 + content = prettyCode(content); + result.put(filePath, content); + } + + private void generateSubCode(CodegenTableDO table, List subTables, + Map result, String vmPath, + String filePath, Map bindingMap) { + // 没有子表,所以不生成 + if (CollUtil.isEmpty(subTables)) { + return; + } + // 主子表的模式匹配。目的:过滤掉个性化的模版 + if (vmPath.contains("_normal") + && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_NORMAL.getType())) { + return; + } + if (vmPath.contains("_erp") + && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_ERP.getType())) { + return; + } + if (vmPath.contains("_inner") + && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_INNER.getType())) { + return; + } + + // 逐个生成 + for (int i = 0; i < subTables.size(); i++) { + bindingMap.put("subIndex", i); + generateCode(result, vmPath, filePath, bindingMap); + } + bindingMap.remove("subIndex"); + } + + /** + * 格式化生成后的代码 + * + * 因为尽量让 vm 模版简单,所以统一的处理都在这个方法。 + * 如果不处理,Vue 的 Pretty 格式校验可能会报错 + * + * @param content 格式化前的代码 + * @return 格式化后的代码 + */ + private String prettyCode(String content) { + // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错 + content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }"); + // Vue 界面:去除多的 dateFormatter,只有一个的情况下,说明没使用到 + if (StrUtil.count(content, "dateFormatter") == 1) { + content = StrUtils.removeLineContains(content, "dateFormatter"); + } + // Vue2 界面:修正 $refs + if (StrUtil.count(content, "this.refs") >= 1) { + content = content.replace("this.refs", "this.$refs"); + } + // Vue 界面:去除多的 dict 相关,只有一个的情况下,说明没使用到 + if (StrUtil.count(content, "getIntDictOptions") == 1) { + content = content.replace("getIntDictOptions, ", ""); + } + if (StrUtil.count(content, "getStrDictOptions") == 1) { + content = content.replace("getStrDictOptions, ", ""); + } + if (StrUtil.count(content, "getBoolDictOptions") == 1) { + content = content.replace("getBoolDictOptions, ", ""); + } + if (StrUtil.count(content, "DICT_TYPE.") == 0) { + content = StrUtils.removeLineContains(content, "DICT_TYPE"); + } + return content; + } + + private Map initBindingMap(CodegenTableDO table, List columns, + List subTables, List> subColumnsList) { + // 创建 bindingMap + Map bindingMap = new HashMap<>(globalBindingMap); + bindingMap.put("table", table); + bindingMap.put("columns", columns); + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 + bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); + + // className 相关 + // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 + String simpleClassName = equalsAnyIgnoreCase(table.getClassName(), table.getModuleName()) ? table.getClassName() + : removePrefix(table.getClassName(), upperFirst(table.getModuleName())); + bindingMap.put("simpleClassName", simpleClassName); + bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type + bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 + // 将 DictType 转换成 dict-type + String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); + bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); + // permission 前缀 + bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); + + // 特殊:树表专属逻辑 + if (CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { + CodegenColumnDO treeParentColumn = CollUtil.findOne(columns, + column -> Objects.equals(column.getId(), table.getTreeParentColumnId())); + bindingMap.put("treeParentColumn", treeParentColumn); + bindingMap.put("treeParentColumn_javaField_underlineCase", toUnderlineCase(treeParentColumn.getJavaField())); + CodegenColumnDO treeNameColumn = CollUtil.findOne(columns, + column -> Objects.equals(column.getId(), table.getTreeNameColumnId())); + bindingMap.put("treeNameColumn", treeNameColumn); + bindingMap.put("treeNameColumn_javaField_underlineCase", toUnderlineCase(treeNameColumn.getJavaField())); + } + + // 特殊:主子表专属逻辑 + if (CollUtil.isNotEmpty(subTables)) { + // 创建 bindingMap + bindingMap.put("subTables", subTables); + bindingMap.put("subColumnsList", subColumnsList); + List subPrimaryColumns = new ArrayList<>(); + List subJoinColumns = new ArrayList<>(); + List subJoinColumnStrikeCases = new ArrayList<>(); + List subSimpleClassNames = new ArrayList<>(); + List subClassNameVars = new ArrayList<>(); + List simpleClassNameUnderlineCases = new ArrayList<>(); + List subSimpleClassNameStrikeCases = new ArrayList<>(); + for (int i = 0; i < subTables.size(); i++) { + CodegenTableDO subTable = subTables.get(i); + List subColumns = subColumnsList.get(i); + subPrimaryColumns.add(CollectionUtils.findFirst(subColumns, CodegenColumnDO::getPrimaryKey)); // + CodegenColumnDO subColumn = CollectionUtils.findFirst(subColumns, // 关联的字段 + column -> Objects.equals(column.getId(), subTable.getSubJoinColumnId())); + subJoinColumns.add(subColumn); + subJoinColumnStrikeCases.add(toSymbolCase(subColumn.getJavaField(), '-')); // 将 DictType 转换成 dict-type + // className 相关 + String subSimpleClassName = removePrefix(subTable.getClassName(), upperFirst(subTable.getModuleName())); + subSimpleClassNames.add(subSimpleClassName); + simpleClassNameUnderlineCases.add(toUnderlineCase(subSimpleClassName)); // 将 DictType 转换成 dict_type + subClassNameVars.add(lowerFirst(subSimpleClassName)); // 将 DictType 转换成 dictType,用于变量 + subSimpleClassNameStrikeCases.add(toSymbolCase(subSimpleClassName, '-')); // 将 DictType 转换成 dict-type + } + bindingMap.put("subPrimaryColumns", subPrimaryColumns); + bindingMap.put("subJoinColumns", subJoinColumns); + bindingMap.put("subJoinColumn_strikeCases", subJoinColumnStrikeCases); + bindingMap.put("subSimpleClassNames", subSimpleClassNames); + bindingMap.put("simpleClassNameUnderlineCases", simpleClassNameUnderlineCases); + bindingMap.put("subClassNameVars", subClassNameVars); + bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases); + } + return bindingMap; + } + + private Map getTemplates(Integer frontType) { + Map templates = new LinkedHashMap<>(); + templates.putAll(SERVER_TEMPLATES); + templates.putAll(FRONT_TEMPLATES.row(frontType)); + // 如果禁用单元测试,则移除对应的模版 + if (Boolean.FALSE.equals(codegenProperties.getUnitTestEnable())) { + templates.remove(javaTemplatePath("test/serviceTest")); + templates.remove("codegen/sql/h2.vm"); + } + return templates; + } + + @SuppressWarnings("unchecked") + private String formatFilePath(String filePath, Map bindingMap) { + filePath = StrUtil.replace(filePath, "${basePackage}", + getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); + filePath = StrUtil.replace(filePath, "${classNameVar}", + getStr(bindingMap, "classNameVar")); + filePath = StrUtil.replace(filePath, "${simpleClassName}", + getStr(bindingMap, "simpleClassName")); + // sceneEnum 包含的字段 + CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); + filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); + filePath = StrUtil.replace(filePath, "${sceneEnum.basePackage}", sceneEnum.getBasePackage()); + // table 包含的字段 + CodegenTableDO table = (CodegenTableDO) bindingMap.get("table"); + filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); + filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); + filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); + // 特殊:主子表专属逻辑 + Integer subIndex = (Integer) bindingMap.get("subIndex"); + if (subIndex != null) { + CodegenTableDO subTable = ((List) bindingMap.get("subTables")).get(subIndex); + filePath = StrUtil.replace(filePath, "${subTable.moduleName}", subTable.getModuleName()); + filePath = StrUtil.replace(filePath, "${subTable.businessName}", subTable.getBusinessName()); + filePath = StrUtil.replace(filePath, "${subTable.className}", subTable.getClassName()); + filePath = StrUtil.replace(filePath, "${subSimpleClassName}", + ((List) bindingMap.get("subSimpleClassNames")).get(subIndex)); + } + return filePath; + } + + private static String javaTemplatePath(String path) { + return "codegen/java/" + path + ".vm"; + } + + private static String javaModuleImplVOFilePath(String path) { + return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + + "vo/${sceneEnum.prefixClass}${table.className}" + path, "biz", "main"); + } + + private static String javaModuleImplControllerFilePath() { + return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + + "${sceneEnum.prefixClass}${table.className}Controller", "biz", "main"); + } + + private static String javaModuleImplMainFilePath(String path) { + return javaModuleFilePath(path, "biz", "main"); + } + + private static String javaModuleApiMainFilePath(String path) { + return javaModuleFilePath(path, "api", "main"); + } + + private static String javaModuleImplTestFilePath(String path) { + return javaModuleFilePath(path, "biz", "test"); + } + + private static String javaModuleFilePath(String path, String module, String src) { + return "win-module-${table.moduleName}/" + // 顶级模块 + "win-module-${table.moduleName}-" + module + "/" + // 子模块 + "src/" + src + "/java/${basePackage}/module/${table.moduleName}/" + path + ".java"; + } + + private static String mapperXmlFilePath() { + return "win-module-${table.moduleName}/" + // 顶级模块 + "win-module-${table.moduleName}-biz/" + // 子模块 + "src/main/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; + } + + private static String vueTemplatePath(String path) { + return "codegen/vue/" + path + ".vm"; + } + + private static String vueFilePath(String path) { + return "win-ui-${sceneEnum.basePackage}-vue2/" + // 顶级目录 + "src/" + path; + } + + private static String vue3TemplatePath(String path) { + return "codegen/vue3/" + path + ".vm"; + } + + private static String vue3FilePath(String path) { + return "win-ui-${sceneEnum.basePackage}-vue3/" + // 顶级目录 + "src/" + path; + } + + private static String vue3VbenTemplatePath(String path) { + return "codegen/vue3_vben/" + path + ".vm"; + } + + private static boolean isSubTemplate(String path) { + return path.contains("_sub"); + } + + private static boolean isPageReqVOTemplate(String path) { + return path.contains("pageReqVO"); + } + + private static boolean isListReqVOTemplate(String path) { + return path.contains("listReqVO"); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java new file mode 100644 index 0000000..520c77d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java @@ -0,0 +1,63 @@ +package com.win.module.infra.service.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.win.module.infra.controller.admin.config.vo.ConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.config.ConfigDO; + +import jakarta.validation.Valid; + +/** + * 参数配置 Service 接口 + * + * @author 芋道源码 + */ +public interface ConfigService { + + /** + * 创建参数配置 + * + * @param createReqVO 创建信息 + * @return 配置编号 + */ + Long createConfig(@Valid ConfigSaveReqVO createReqVO); + + /** + * 更新参数配置 + * + * @param updateReqVO 更新信息 + */ + void updateConfig(@Valid ConfigSaveReqVO updateReqVO); + + /** + * 删除参数配置 + * + * @param id 配置编号 + */ + void deleteConfig(Long id); + + /** + * 获得参数配置 + * + * @param id 配置编号 + * @return 参数配置 + */ + ConfigDO getConfig(Long id); + + /** + * 根据参数键,获得参数配置 + * + * @param key 配置键 + * @return 参数配置 + */ + ConfigDO getConfigByKey(String key); + + /** + * 获得参数配置分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getConfigPage(ConfigPageReqVO reqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java new file mode 100644 index 0000000..5f29c3c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java @@ -0,0 +1,109 @@ +package com.win.module.infra.service.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.win.module.infra.controller.admin.config.vo.ConfigSaveReqVO; +import com.win.module.infra.convert.config.ConfigConvert; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import com.win.module.infra.dal.mysql.config.ConfigMapper; +import com.win.module.infra.enums.config.ConfigTypeEnum; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 参数配置 Service 实现类 + */ +@Service +@Slf4j +@Validated +public class ConfigServiceImpl implements ConfigService { + + @Resource + private ConfigMapper configMapper; + + @Override + public Long createConfig(ConfigSaveReqVO createReqVO) { + // 校验参数配置 key 的唯一性 + validateConfigKeyUnique(null, createReqVO.getKey()); + + // 插入参数配置 + ConfigDO config = ConfigConvert.INSTANCE.convert(createReqVO); + config.setType(ConfigTypeEnum.CUSTOM.getType()); + configMapper.insert(config); + return config.getId(); + } + + @Override + public void updateConfig(ConfigSaveReqVO updateReqVO) { + // 校验自己存在 + validateConfigExists(updateReqVO.getId()); + // 校验参数配置 key 的唯一性 + validateConfigKeyUnique(updateReqVO.getId(), updateReqVO.getKey()); + + // 更新参数配置 + ConfigDO updateObj = ConfigConvert.INSTANCE.convert(updateReqVO); + configMapper.updateById(updateObj); + } + + @Override + public void deleteConfig(Long id) { + // 校验配置存在 + ConfigDO config = validateConfigExists(id); + // 内置配置,不允许删除 + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + // 删除 + configMapper.deleteById(id); + } + + @Override + public ConfigDO getConfig(Long id) { + return configMapper.selectById(id); + } + + @Override + public ConfigDO getConfigByKey(String key) { + return configMapper.selectByKey(key); + } + + @Override + public PageResult getConfigPage(ConfigPageReqVO pageReqVO) { + return configMapper.selectPage(pageReqVO); + } + + @VisibleForTesting + public ConfigDO validateConfigExists(Long id) { + if (id == null) { + return null; + } + ConfigDO config = configMapper.selectById(id); + if (config == null) { + throw exception(CONFIG_NOT_EXISTS); + } + return config; + } + + @VisibleForTesting + public void validateConfigKeyUnique(Long id, String key) { + ConfigDO config = configMapper.selectByKey(key); + if (config == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 + if (id == null) { + throw exception(CONFIG_KEY_DUPLICATE); + } + if (!config.getId().equals(id)) { + throw exception(CONFIG_KEY_DUPLICATE); + } + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java new file mode 100644 index 0000000..9e8bcb9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java @@ -0,0 +1,53 @@ +package com.win.module.infra.service.db; + +import com.win.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 数据源配置 Service 接口 + * + * @author 芋道源码 + */ +public interface DataSourceConfigService { + + /** + * 创建数据源配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDataSourceConfig(@Valid DataSourceConfigSaveReqVO createReqVO); + + /** + * 更新数据源配置 + * + * @param updateReqVO 更新信息 + */ + void updateDataSourceConfig(@Valid DataSourceConfigSaveReqVO updateReqVO); + + /** + * 删除数据源配置 + * + * @param id 编号 + */ + void deleteDataSourceConfig(Long id); + + /** + * 获得数据源配置 + * + * @param id 编号 + * @return 数据源配置 + */ + DataSourceConfigDO getDataSourceConfig(Long id); + + /** + * 获得数据源配置列表 + * + * @return 数据源配置列表 + */ + List getDataSourceConfigList(); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java new file mode 100644 index 0000000..15bf894 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java @@ -0,0 +1,106 @@ +package com.win.module.infra.service.db; + +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.win.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.win.module.infra.dal.mysql.db.DataSourceConfigMapper; +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; +import static com.win.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_OK; + +/** + * 数据源配置 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class DataSourceConfigServiceImpl implements DataSourceConfigService { + + @Resource + private DataSourceConfigMapper dataSourceConfigMapper; + + @Resource + private DynamicDataSourceProperties dynamicDataSourceProperties; + + @Override + public Long createDataSourceConfig(DataSourceConfigSaveReqVO createReqVO) { + DataSourceConfigDO config = BeanUtils.toBean(createReqVO, DataSourceConfigDO.class); + validateConnectionOK(config); + + // 插入 + dataSourceConfigMapper.insert(config); + // 返回 + return config.getId(); + } + + @Override + public void updateDataSourceConfig(DataSourceConfigSaveReqVO updateReqVO) { + // 校验存在 + validateDataSourceConfigExists(updateReqVO.getId()); + DataSourceConfigDO updateObj = BeanUtils.toBean(updateReqVO, DataSourceConfigDO.class); + validateConnectionOK(updateObj); + + // 更新 + dataSourceConfigMapper.updateById(updateObj); + } + + @Override + public void deleteDataSourceConfig(Long id) { + // 校验存在 + validateDataSourceConfigExists(id); + // 删除 + dataSourceConfigMapper.deleteById(id); + } + + private void validateDataSourceConfigExists(Long id) { + if (dataSourceConfigMapper.selectById(id) == null) { + throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); + } + } + + @Override + public DataSourceConfigDO getDataSourceConfig(Long id) { + // 如果 id 为 0,默认为 master 的数据源 + if (Objects.equals(id, DataSourceConfigDO.ID_MASTER)) { + return buildMasterDataSourceConfig(); + } + // 从 DB 中读取 + return dataSourceConfigMapper.selectById(id); + } + + @Override + public List getDataSourceConfigList() { + List result = dataSourceConfigMapper.selectList(); + // 补充 master 数据源 + result.add(0, buildMasterDataSourceConfig()); + return result; + } + + private void validateConnectionOK(DataSourceConfigDO config) { + boolean success = JdbcUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword()); + if (!success) { + throw exception(DATA_SOURCE_CONFIG_NOT_OK); + } + } + + private DataSourceConfigDO buildMasterDataSourceConfig() { + String primary = dynamicDataSourceProperties.getPrimary(); + DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); + return new DataSourceConfigDO().setId(DataSourceConfigDO.ID_MASTER).setName(primary) + .setUrl(dataSourceProperty.getUrl()) + .setUsername(dataSourceProperty.getUsername()) + .setPassword(dataSourceProperty.getPassword()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java new file mode 100644 index 0000000..342dc8c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java @@ -0,0 +1,33 @@ +package com.win.module.infra.service.db; + +import com.baomidou.mybatisplus.generator.config.po.TableInfo; + +import java.util.List; + +/** + * 数据库表 Service + * + * @author 芋道源码 + */ +public interface DatabaseTableService { + + /** + * 获得表列表,基于表名称 + 表描述进行模糊匹配 + * + * @param dataSourceConfigId 数据源配置的编号 + * @param nameLike 表名称,模糊匹配 + * @param commentLike 表描述,模糊匹配 + * @return 表列表 + */ + List getTableList(Long dataSourceConfigId, String nameLike, String commentLike); + + /** + * 获得指定表名 + * + * @param dataSourceConfigId 数据源配置的编号 + * @param tableName 表名称 + * @return 表 + */ + TableInfo getTable(Long dataSourceConfigId, String tableName); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java new file mode 100644 index 0000000..5ecd3bd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java @@ -0,0 +1,77 @@ +package com.win.module.infra.service.db; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.query.SQLQuery; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 数据库表 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class DatabaseTableServiceImpl implements DatabaseTableService { + + @Resource + private DataSourceConfigService dataSourceConfigService; + + @Override + public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { + List tables = getTableList0(dataSourceConfigId, null); + return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) + && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) + .collect(Collectors.toList()); + } + + @Override + public TableInfo getTable(Long dataSourceConfigId, String name) { + return CollUtil.getFirst(getTableList0(dataSourceConfigId, name)); + } + + private List getTableList0(Long dataSourceConfigId, String name) { + // 获得数据源配置 + DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); + Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); + + // 使用 MyBatis Plus Generator 解析表结构 + DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(), + config.getPassword()); + if (JdbcUtils.isSQLServer(config.getUrl())) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419 + dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class); + } + StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到 + if (StrUtil.isNotEmpty(name)) { + strategyConfig.addInclude(name); + } else { + // 移除工作流和定时任务前缀的表名 + strategyConfig.addExclude("ACT_[\\S\\s]+|QRTZ_[\\S\\s]+|FLW_[\\S\\s]+"); + // 移除 ORACLE 相关的系统表 + strategyConfig.addExclude("IMPDP_[\\S\\s]+|ALL_[\\S\\s]+|HS_[\\S\\\\s]+"); + strategyConfig.addExclude("[\\S\\s]+\\$[\\S\\s]+|[\\S\\s]+\\$"); // 表里不能有 $,一般有都是系统的表 + } + + GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build(); // 只使用 LocalDateTime 类型,不使用 LocalDate + ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfigBuilder.build(), strategyConfig.build(), + null, globalConfig, null); + // 按照名字排序 + List tables = builder.getTableInfoList(); + tables.sort(Comparator.comparing(TableInfo::getName)); + return tables; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactService.java new file mode 100644 index 0000000..1ade2d8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactService.java @@ -0,0 +1,55 @@ +package com.win.module.infra.service.demo.demo01; + +import jakarta.validation.*; + +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 示例联系人 Service 接口 + * + * @author 芋道源码 + */ +public interface Demo01ContactService { + + /** + * 创建示例联系人 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDemo01Contact(@Valid Demo01ContactSaveReqVO createReqVO); + + /** + * 更新示例联系人 + * + * @param updateReqVO 更新信息 + */ + void updateDemo01Contact(@Valid Demo01ContactSaveReqVO updateReqVO); + + /** + * 删除示例联系人 + * + * @param id 编号 + */ + void deleteDemo01Contact(Long id); + + /** + * 获得示例联系人 + * + * @param id 编号 + * @return 示例联系人 + */ + Demo01ContactDO getDemo01Contact(Long id); + + /** + * 获得示例联系人分页 + * + * @param pageReqVO 分页查询 + * @return 示例联系人分页 + */ + PageResult getDemo01ContactPage(Demo01ContactPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactServiceImpl.java new file mode 100644 index 0000000..ac77186 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo01/Demo01ContactServiceImpl.java @@ -0,0 +1,72 @@ +package com.win.module.infra.service.demo.demo01; + +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactPageReqVO; +import com.win.module.infra.controller.admin.demo.demo01.vo.Demo01ContactSaveReqVO; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import com.win.module.infra.dal.dataobject.demo.demo01.Demo01ContactDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; + +import com.win.module.infra.dal.mysql.demo.demo01.Demo01ContactMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 示例联系人 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class Demo01ContactServiceImpl implements Demo01ContactService { + + @Resource + private Demo01ContactMapper demo01ContactMapper; + + @Override + public Long createDemo01Contact(Demo01ContactSaveReqVO createReqVO) { + // 插入 + Demo01ContactDO demo01Contact = BeanUtils.toBean(createReqVO, Demo01ContactDO.class); + demo01ContactMapper.insert(demo01Contact); + // 返回 + return demo01Contact.getId(); + } + + @Override + public void updateDemo01Contact(Demo01ContactSaveReqVO updateReqVO) { + // 校验存在 + validateDemo01ContactExists(updateReqVO.getId()); + // 更新 + Demo01ContactDO updateObj = BeanUtils.toBean(updateReqVO, Demo01ContactDO.class); + demo01ContactMapper.updateById(updateObj); + } + + @Override + public void deleteDemo01Contact(Long id) { + // 校验存在 + validateDemo01ContactExists(id); + // 删除 + demo01ContactMapper.deleteById(id); + } + + private void validateDemo01ContactExists(Long id) { + if (demo01ContactMapper.selectById(id) == null) { + throw exception(DEMO01_CONTACT_NOT_EXISTS); + } + } + + @Override + public Demo01ContactDO getDemo01Contact(Long id) { + return demo01ContactMapper.selectById(id); + } + + @Override + public PageResult getDemo01ContactPage(Demo01ContactPageReqVO pageReqVO) { + return demo01ContactMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryService.java new file mode 100644 index 0000000..5d2f8c2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryService.java @@ -0,0 +1,55 @@ +package com.win.module.infra.service.demo.demo02; + +import java.util.*; +import jakarta.validation.*; + +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; + +/** + * 示例分类 Service 接口 + * + * @author 芋道源码 + */ +public interface Demo02CategoryService { + + /** + * 创建示例分类 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDemo02Category(@Valid Demo02CategorySaveReqVO createReqVO); + + /** + * 更新示例分类 + * + * @param updateReqVO 更新信息 + */ + void updateDemo02Category(@Valid Demo02CategorySaveReqVO updateReqVO); + + /** + * 删除示例分类 + * + * @param id 编号 + */ + void deleteDemo02Category(Long id); + + /** + * 获得示例分类 + * + * @param id 编号 + * @return 示例分类 + */ + Demo02CategoryDO getDemo02Category(Long id); + + /** + * 获得示例分类列表 + * + * @param listReqVO 查询条件 + * @return 示例分类列表 + */ + List getDemo02CategoryList(Demo02CategoryListReqVO listReqVO); + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryServiceImpl.java new file mode 100644 index 0000000..58aef94 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo02/Demo02CategoryServiceImpl.java @@ -0,0 +1,134 @@ +package com.win.module.infra.service.demo.demo02; + +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategoryListReqVO; +import com.win.module.infra.controller.admin.demo.demo02.vo.Demo02CategorySaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo02.Demo02CategoryDO; +import com.win.module.infra.dal.mysql.demo.demo02.Demo02CategoryMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 示例分类 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class Demo02CategoryServiceImpl implements Demo02CategoryService { + + @Resource + private Demo02CategoryMapper demo02CategoryMapper; + + @Override + public Long createDemo02Category(Demo02CategorySaveReqVO createReqVO) { + // 校验父级编号的有效性 + validateParentDemo02Category(null, createReqVO.getParentId()); + // 校验名字的唯一性 + validateDemo02CategoryNameUnique(null, createReqVO.getParentId(), createReqVO.getName()); + + // 插入 + Demo02CategoryDO demo02Category = BeanUtils.toBean(createReqVO, Demo02CategoryDO.class); + demo02CategoryMapper.insert(demo02Category); + // 返回 + return demo02Category.getId(); + } + + @Override + public void updateDemo02Category(Demo02CategorySaveReqVO updateReqVO) { + // 校验存在 + validateDemo02CategoryExists(updateReqVO.getId()); + // 校验父级编号的有效性 + validateParentDemo02Category(updateReqVO.getId(), updateReqVO.getParentId()); + // 校验名字的唯一性 + validateDemo02CategoryNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName()); + + // 更新 + Demo02CategoryDO updateObj = BeanUtils.toBean(updateReqVO, Demo02CategoryDO.class); + demo02CategoryMapper.updateById(updateObj); + } + + @Override + public void deleteDemo02Category(Long id) { + // 校验存在 + validateDemo02CategoryExists(id); + // 校验是否有子示例分类 + if (demo02CategoryMapper.selectCountByParentId(id) > 0) { + throw exception(DEMO02_CATEGORY_EXITS_CHILDREN); + } + // 删除 + demo02CategoryMapper.deleteById(id); + } + + private void validateDemo02CategoryExists(Long id) { + if (demo02CategoryMapper.selectById(id) == null) { + throw exception(DEMO02_CATEGORY_NOT_EXISTS); + } + } + + private void validateParentDemo02Category(Long id, Long parentId) { + if (parentId == null || Demo02CategoryDO.PARENT_ID_ROOT.equals(parentId)) { + return; + } + // 1. 不能设置自己为父示例分类 + if (Objects.equals(id, parentId)) { + throw exception(DEMO02_CATEGORY_PARENT_ERROR); + } + // 2. 父示例分类不存在 + Demo02CategoryDO parentDemo02Category = demo02CategoryMapper.selectById(parentId); + if (parentDemo02Category == null) { + throw exception(DEMO02_CATEGORY_PARENT_NOT_EXITS); + } + // 3. 递归校验父示例分类,如果父示例分类是自己的子示例分类,则报错,避免形成环路 + if (id == null) { // id 为空,说明新增,不需要考虑环路 + return; + } + for (int i = 0; i < Short.MAX_VALUE; i++) { + // 3.1 校验环路 + parentId = parentDemo02Category.getParentId(); + if (Objects.equals(id, parentId)) { + throw exception(DEMO02_CATEGORY_PARENT_IS_CHILD); + } + // 3.2 继续递归下一级父示例分类 + if (parentId == null || Demo02CategoryDO.PARENT_ID_ROOT.equals(parentId)) { + break; + } + parentDemo02Category = demo02CategoryMapper.selectById(parentId); + if (parentDemo02Category == null) { + break; + } + } + } + + private void validateDemo02CategoryNameUnique(Long id, Long parentId, String name) { + Demo02CategoryDO demo02Category = demo02CategoryMapper.selectByParentIdAndName(parentId, name); + if (demo02Category == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的示例分类 + if (id == null) { + throw exception(DEMO02_CATEGORY_NAME_DUPLICATE); + } + if (!Objects.equals(demo02Category.getId(), id)) { + throw exception(DEMO02_CATEGORY_NAME_DUPLICATE); + } + } + + @Override + public Demo02CategoryDO getDemo02Category(Long id) { + return demo02CategoryMapper.selectById(id); + } + + @Override + public List getDemo02CategoryList(Demo02CategoryListReqVO listReqVO) { + return demo02CategoryMapper.selectList(listReqVO); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentService.java new file mode 100644 index 0000000..11ef6c8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentService.java @@ -0,0 +1,158 @@ +package com.win.module.infra.service.demo.demo03; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 学生 Service 接口 + * + * @author 芋道源码 + */ +public interface Demo03StudentService { + + /** + * 创建学生 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDemo03Student(@Valid Demo03StudentSaveReqVO createReqVO); + + /** + * 更新学生 + * + * @param updateReqVO 更新信息 + */ + void updateDemo03Student(@Valid Demo03StudentSaveReqVO updateReqVO); + + /** + * 删除学生 + * + * @param id 编号 + */ + void deleteDemo03Student(Long id); + + /** + * 获得学生 + * + * @param id 编号 + * @return 学生 + */ + Demo03StudentDO getDemo03Student(Long id); + + /** + * 获得学生分页 + * + * @param pageReqVO 分页查询 + * @return 学生分页 + */ + PageResult getDemo03StudentPage(Demo03StudentPageReqVO pageReqVO); + + + // ==================== 子表(学生课程) ==================== + + /** + * 获得学生课程列表 + * + * @param studentId 学生编号 + * @return 学生课程列表 + */ + List getDemo03CourseListByStudentId(Long studentId); + + /** + * 获得学生课程分页 + * + * @param pageReqVO 分页查询 + * @param studentId 学生编号 + * @return 学生课程分页 + */ + PageResult getDemo03CoursePage(PageParam pageReqVO, Long studentId); + + /** + * 创建学生课程 + * + * @param demo03Course 创建信息 + * @return 编号 + */ + Long createDemo03Course(@Valid Demo03CourseDO demo03Course); + + /** + * 更新学生课程 + * + * @param demo03Course 更新信息 + */ + void updateDemo03Course(@Valid Demo03CourseDO demo03Course); + + /** + * 删除学生课程 + * + * @param id 编号 + */ + void deleteDemo03Course(Long id); + + /** + * 获得学生课程 + * + * @param id 编号 + * @return 学生课程 + */ + Demo03CourseDO getDemo03Course(Long id); + + // ==================== 子表(学生班级) ==================== + + /** + * 获得学生班级 + * + * @param studentId 学生编号 + * @return 学生班级 + */ + Demo03GradeDO getDemo03GradeByStudentId(Long studentId); + + /** + * 获得学生班级分页 + * + * @param pageReqVO 分页查询 + * @param studentId 学生编号 + * @return 学生班级分页 + */ + PageResult getDemo03GradePage(PageParam pageReqVO, Long studentId); + + /** + * 创建学生班级 + * + * @param demo03Grade 创建信息 + * @return 编号 + */ + Long createDemo03Grade(@Valid Demo03GradeDO demo03Grade); + + /** + * 更新学生班级 + * + * @param demo03Grade 更新信息 + */ + void updateDemo03Grade(@Valid Demo03GradeDO demo03Grade); + + /** + * 删除学生班级 + * + * @param id 编号 + */ + void deleteDemo03Grade(Long id); + + /** + * 获得学生班级 + * + * @param id 编号 + * @return 学生班级 + */ + Demo03GradeDO getDemo03Grade(Long id); + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentServiceImpl.java new file mode 100644 index 0000000..213dfd4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/demo/demo03/Demo03StudentServiceImpl.java @@ -0,0 +1,217 @@ +package com.win.module.infra.service.demo.demo03; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentPageReqVO; +import com.win.module.infra.controller.admin.demo.demo03.vo.Demo03StudentSaveReqVO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03CourseDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03GradeDO; +import com.win.module.infra.dal.dataobject.demo.demo03.Demo03StudentDO; +import com.win.module.infra.dal.mysql.demo.demo03.Demo03CourseMapper; +import com.win.module.infra.dal.mysql.demo.demo03.Demo03GradeMapper; +import com.win.module.infra.dal.mysql.demo.demo03.Demo03StudentMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 学生 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class Demo03StudentServiceImpl implements Demo03StudentService { + + @Resource + private Demo03StudentMapper demo03StudentMapper; + @Resource + private Demo03CourseMapper demo03CourseMapper; + @Resource + private Demo03GradeMapper demo03GradeMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDemo03Student(Demo03StudentSaveReqVO createReqVO) { + // 插入 + Demo03StudentDO demo03Student = BeanUtils.toBean(createReqVO, Demo03StudentDO.class); + demo03StudentMapper.insert(demo03Student); + + // 插入子表 + createDemo03CourseList(demo03Student.getId(), createReqVO.getDemo03Courses()); + createDemo03Grade(demo03Student.getId(), createReqVO.getDemo03Grade()); + // 返回 + return demo03Student.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDemo03Student(Demo03StudentSaveReqVO updateReqVO) { + // 校验存在 + validateDemo03StudentExists(updateReqVO.getId()); + // 更新 + Demo03StudentDO updateObj = BeanUtils.toBean(updateReqVO, Demo03StudentDO.class); + demo03StudentMapper.updateById(updateObj); + + // 更新子表 + updateDemo03CourseList(updateReqVO.getId(), updateReqVO.getDemo03Courses()); + updateDemo03Grade(updateReqVO.getId(), updateReqVO.getDemo03Grade()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDemo03Student(Long id) { + // 校验存在 + validateDemo03StudentExists(id); + // 删除 + demo03StudentMapper.deleteById(id); + + // 删除子表 + deleteDemo03CourseByStudentId(id); + deleteDemo03GradeByStudentId(id); + } + + private void validateDemo03StudentExists(Long id) { + if (demo03StudentMapper.selectById(id) == null) { + throw exception(DEMO03_STUDENT_NOT_EXISTS); + } + } + + @Override + public Demo03StudentDO getDemo03Student(Long id) { + return demo03StudentMapper.selectById(id); + } + + @Override + public PageResult getDemo03StudentPage(Demo03StudentPageReqVO pageReqVO) { + return demo03StudentMapper.selectPage(pageReqVO); + } + + // ==================== 子表(学生课程) ==================== + + @Override + public List getDemo03CourseListByStudentId(Long studentId) { + return demo03CourseMapper.selectListByStudentId(studentId); + } + + private void createDemo03CourseList(Long studentId, List list) { + if (list != null) { + list.forEach(o -> o.setStudentId(studentId)); + } + demo03CourseMapper.insertBatch(list); + } + + private void updateDemo03CourseList(Long studentId, List list) { + deleteDemo03CourseByStudentId(studentId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createDemo03CourseList(studentId, list); + } + + private void deleteDemo03CourseByStudentId(Long studentId) { + demo03CourseMapper.deleteByStudentId(studentId); + } + + @Override + public PageResult getDemo03CoursePage(PageParam pageReqVO, Long studentId) { + return demo03CourseMapper.selectPage(pageReqVO, studentId); + } + + @Override + public Long createDemo03Course(Demo03CourseDO demo03Course) { + demo03CourseMapper.insert(demo03Course); + return demo03Course.getId(); + } + + @Override + public void updateDemo03Course(Demo03CourseDO demo03Course) { + demo03CourseMapper.updateById(demo03Course); + } + + @Override + public void deleteDemo03Course(Long id) { + demo03CourseMapper.deleteById(id); + } + + @Override + public Demo03CourseDO getDemo03Course(Long id) { + return demo03CourseMapper.selectById(id); + } + + // ==================== 子表(学生班级) ==================== + + @Override + public Demo03GradeDO getDemo03GradeByStudentId(Long studentId) { + return demo03GradeMapper.selectByStudentId(studentId); + } + + private void createDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) { + if (demo03Grade == null) { + return; + } + demo03Grade.setStudentId(studentId); + demo03GradeMapper.insert(demo03Grade); + } + + private void updateDemo03Grade(Long studentId, Demo03GradeDO demo03Grade) { + if (demo03Grade == null) { + return; + } + demo03Grade.setStudentId(studentId); + demo03Grade.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新 + demo03GradeMapper.insertOrUpdate(demo03Grade); + } + + private void deleteDemo03GradeByStudentId(Long studentId) { + demo03GradeMapper.deleteByStudentId(studentId); + } + + @Override + public PageResult getDemo03GradePage(PageParam pageReqVO, Long studentId) { + return demo03GradeMapper.selectPage(pageReqVO, studentId); + } + + @Override + public Long createDemo03Grade(Demo03GradeDO demo03Grade) { + // 校验是否已经存在 + if (demo03GradeMapper.selectByStudentId(demo03Grade.getStudentId()) != null) { + throw exception(DEMO03_GRADE_EXISTS); + } + demo03GradeMapper.insert(demo03Grade); + return demo03Grade.getId(); + } + + @Override + public void updateDemo03Grade(Demo03GradeDO demo03Grade) { + // 校验存在 + validateDemo03GradeExists(demo03Grade.getId()); + // 更新 + demo03GradeMapper.updateById(demo03Grade); + } + + @Override + public void deleteDemo03Grade(Long id) { + // 校验存在 + validateDemo03GradeExists(id); + // 删除 + demo03GradeMapper.deleteById(id); + } + + @Override + public Demo03GradeDO getDemo03Grade(Long id) { + return demo03GradeMapper.selectById(id); + } + + private void validateDemo03GradeExists(Long id) { + if (demo03GradeMapper.selectById(id) == null) { + throw exception(DEMO03_GRADE_NOT_EXISTS); + } + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java new file mode 100644 index 0000000..81fcb64 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java @@ -0,0 +1,86 @@ +package com.win.module.infra.service.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.framework.file.core.client.FileClient; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; + +import jakarta.validation.Valid; + +/** + * 文件配置 Service 接口 + * + * @author 芋道源码 + */ +public interface FileConfigService { + + /** + * 创建文件配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFileConfig(@Valid FileConfigSaveReqVO createReqVO); + + /** + * 更新文件配置 + * + * @param updateReqVO 更新信息 + */ + void updateFileConfig(@Valid FileConfigSaveReqVO updateReqVO); + + /** + * 更新文件配置为 Master + * + * @param id 编号 + */ + void updateFileConfigMaster(Long id); + + /** + * 删除文件配置 + * + * @param id 编号 + */ + void deleteFileConfig(Long id); + + /** + * 获得文件配置 + * + * @param id 编号 + * @return 文件配置 + */ + FileConfigDO getFileConfig(Long id); + + /** + * 获得文件配置分页 + * + * @param pageReqVO 分页查询 + * @return 文件配置分页 + */ + PageResult getFileConfigPage(FileConfigPageReqVO pageReqVO); + + /** + * 测试文件配置是否正确,通过上传文件 + * + * @param id 编号 + * @return 文件 URL + */ + String testFileConfig(Long id) throws Exception; + + /** + * 获得指定编号的文件客户端 + * + * @param id 配置编号 + * @return 文件客户端 + */ + FileClient getFileClient(Long id); + + /** + * 获得 Master 文件客户端 + * + * @return 文件客户端 + */ + FileClient getMasterFileClient(); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java new file mode 100644 index 0000000..2f016ed --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java @@ -0,0 +1,189 @@ +package com.win.module.infra.service.file; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.validation.ValidationUtils; +import com.win.module.infra.framework.file.core.client.FileClient; +import com.win.module.infra.framework.file.core.client.FileClientConfig; +import com.win.module.infra.framework.file.core.client.FileClientFactory; +import com.win.module.infra.framework.file.core.enums.FileStorageEnum; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO; +import com.win.module.infra.convert.file.FileConfigConvert; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import com.win.module.infra.dal.mysql.file.FileConfigMapper; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import jakarta.validation.Validator; +import java.time.Duration; +import java.util.Map; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_NOT_EXISTS; + +/** + * 文件配置 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class FileConfigServiceImpl implements FileConfigService { + + private static final Long CACHE_MASTER_ID = 0L; + + /** + * {@link FileClient} 缓存,通过它异步刷新 fileClientFactory + */ + @Getter + private final LoadingCache clientCache = buildAsyncReloadingCache(Duration.ofSeconds(10L), + new CacheLoader() { + + @Override + public FileClient load(Long id) { + FileConfigDO config = Objects.equals(CACHE_MASTER_ID, id) ? + fileConfigMapper.selectByMaster() : fileConfigMapper.selectById(id); + if (config != null) { + fileClientFactory.createOrUpdateFileClient(config.getId(), config.getStorage(), config.getConfig()); + } + return fileClientFactory.getFileClient(null == config ? id : config.getId()); + } + + }); + + @Resource + private FileClientFactory fileClientFactory; + + @Resource + private FileConfigMapper fileConfigMapper; + + @Resource + private Validator validator; + + @Override + public Long createFileConfig(FileConfigSaveReqVO createReqVO) { + FileConfigDO fileConfig = FileConfigConvert.INSTANCE.convert(createReqVO) + .setConfig(parseClientConfig(createReqVO.getStorage(), createReqVO.getConfig())) + .setMaster(false); // 默认非 master + fileConfigMapper.insert(fileConfig); + return fileConfig.getId(); + } + + @Override + public void updateFileConfig(FileConfigSaveReqVO updateReqVO) { + // 校验存在 + FileConfigDO config = validateFileConfigExists(updateReqVO.getId()); + // 更新 + FileConfigDO updateObj = FileConfigConvert.INSTANCE.convert(updateReqVO) + .setConfig(parseClientConfig(config.getStorage(), updateReqVO.getConfig())); + fileConfigMapper.updateById(updateObj); + + // 清空缓存 + clearCache(config.getId(), null); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateFileConfigMaster(Long id) { + // 校验存在 + validateFileConfigExists(id); + // 更新其它为非 master + fileConfigMapper.updateBatch(new FileConfigDO().setMaster(false)); + // 更新 + fileConfigMapper.updateById(new FileConfigDO().setId(id).setMaster(true)); + + // 清空缓存 + clearCache(null, true); + } + + private FileClientConfig parseClientConfig(Integer storage, Map config) { + // 获取配置类 + Class configClass = FileStorageEnum.getByStorage(storage) + .getConfigClass(); + FileClientConfig clientConfig = JsonUtils.parseObject2(JsonUtils.toJsonString(config), configClass); + // 参数校验 + ValidationUtils.validate(validator, clientConfig); + // 设置参数 + return clientConfig; + } + + @Override + public void deleteFileConfig(Long id) { + // 校验存在 + FileConfigDO config = validateFileConfigExists(id); + if (Boolean.TRUE.equals(config.getMaster())) { + throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); + } + // 删除 + fileConfigMapper.deleteById(id); + + // 清空缓存 + clearCache(id, null); + } + + /** + * 清空指定文件配置 + * + * @param id 配置编号 + * @param master 是否主配置 + */ + private void clearCache(Long id, Boolean master) { + if (id != null) { + clientCache.invalidate(id); + } + if (Boolean.TRUE.equals(master)) { + clientCache.invalidate(CACHE_MASTER_ID); + } + } + + private FileConfigDO validateFileConfigExists(Long id) { + FileConfigDO config = fileConfigMapper.selectById(id); + if (config == null) { + throw exception(FILE_CONFIG_NOT_EXISTS); + } + return config; + } + + @Override + public FileConfigDO getFileConfig(Long id) { + return fileConfigMapper.selectById(id); + } + + @Override + public PageResult getFileConfigPage(FileConfigPageReqVO pageReqVO) { + return fileConfigMapper.selectPage(pageReqVO); + } + + @Override + public String testFileConfig(Long id) throws Exception { + // 校验存在 + validateFileConfigExists(id); + // 上传文件 + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + return getFileClient(id).upload(content, IdUtil.fastSimpleUUID() + ".jpg", "image/jpeg"); + } + + @Override + public FileClient getFileClient(Long id) { + return clientCache.getUnchecked(id); + } + + @Override + public FileClient getMasterFileClient() { + return clientCache.getUnchecked(CACHE_MASTER_ID); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java new file mode 100644 index 0000000..e22f7cd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java @@ -0,0 +1,66 @@ +package com.win.module.infra.service.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.file.vo.file.FileCreateReqVO; +import com.win.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.win.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; +import com.win.module.infra.dal.dataobject.file.FileDO; + +/** + * 文件 Service 接口 + * + * @author 芋道源码 + */ +public interface FileService { + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(FilePageReqVO pageReqVO); + + /** + * 保存文件,并返回文件的访问路径 + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String name, String path, byte[] content); + + /** + * 创建文件 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFile(FileCreateReqVO createReqVO); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(Long id) throws Exception; + + /** + * 获得文件内容 + * + * @param configId 配置编号 + * @param path 文件路径 + * @return 文件内容 + */ + byte[] getFileContent(Long configId, String path) throws Exception; + + /** + * 生成文件预签名地址信息 + * + * @param path 文件路径 + * @return 预签名地址信息 + */ + FilePresignedUrlRespVO getFilePresignedUrl(String path) throws Exception; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java new file mode 100644 index 0000000..6a09fc8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java @@ -0,0 +1,116 @@ +package com.win.module.infra.service.file; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.io.FileUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.framework.file.core.client.FileClient; +import com.win.module.infra.framework.file.core.client.s3.FilePresignedUrlRespDTO; +import com.win.module.infra.framework.file.core.utils.FileTypeUtils; +import com.win.module.infra.controller.admin.file.vo.file.FileCreateReqVO; +import com.win.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.win.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; +import com.win.module.infra.dal.dataobject.file.FileDO; +import com.win.module.infra.dal.mysql.file.FileMapper; +import jakarta.annotation.Resource; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; + +/** + * 文件 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class FileServiceImpl implements FileService { + + @Resource + private FileConfigService fileConfigService; + + @Resource + private FileMapper fileMapper; + + @Override + public PageResult getFilePage(FilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + + @Override + @SneakyThrows + public String createFile(String name, String path, byte[] content) { + // 计算默认的 path 名 + String type = FileTypeUtils.getMineType(content, name); + if (StrUtil.isEmpty(path)) { + path = FileUtils.generatePath(content, name); + } + // 如果 name 为空,则使用 path 填充 + if (StrUtil.isEmpty(name)) { + name = path; + } + + // 上传到文件存储器 + FileClient client = fileConfigService.getMasterFileClient(); + Assert.notNull(client, "客户端(master) 不能为空"); + String url = client.upload(content, path, type); + + // 保存到数据库 + FileDO file = new FileDO(); + file.setConfigId(client.getId()); + file.setName(name); + file.setPath(path); + file.setUrl(url); + file.setType(type); + file.setSize(content.length); + fileMapper.insert(file); + return url; + } + + @Override + public Long createFile(FileCreateReqVO createReqVO) { + FileDO file = BeanUtils.toBean(createReqVO, FileDO.class); + fileMapper.insert(file); + return file.getId(); + } + + @Override + public void deleteFile(Long id) throws Exception { + // 校验存在 + FileDO file = validateFileExists(id); + + // 从文件存储器中删除 + FileClient client = fileConfigService.getFileClient(file.getConfigId()); + Assert.notNull(client, "客户端({}) 不能为空", file.getConfigId()); + client.delete(file.getPath()); + + // 删除记录 + fileMapper.deleteById(id); + } + + private FileDO validateFileExists(Long id) { + FileDO fileDO = fileMapper.selectById(id); + if (fileDO == null) { + throw exception(FILE_NOT_EXISTS); + } + return fileDO; + } + + @Override + public byte[] getFileContent(Long configId, String path) throws Exception { + FileClient client = fileConfigService.getFileClient(configId); + Assert.notNull(client, "客户端({}) 不能为空", configId); + return client.getContent(path); + } + + @Override + public FilePresignedUrlRespVO getFilePresignedUrl(String path) throws Exception { + FileClient fileClient = fileConfigService.getMasterFileClient(); + FilePresignedUrlRespDTO presignedObjectUrl = fileClient.getPresignedObjectUrl(path); + return BeanUtils.toBean(presignedObjectUrl, FilePresignedUrlRespVO.class, + object -> object.setConfigId(fileClient.getId())); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java new file mode 100644 index 0000000..6f61f5c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java @@ -0,0 +1,39 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.quartz.core.service.JobLogFrameworkService; +import com.win.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; + +/** + * Job 日志 Service 接口 + * + * @author 芋道源码 + */ +public interface JobLogService extends JobLogFrameworkService { + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + JobLogDO getJobLog(Long id); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobLogPage(JobLogPageReqVO pageReqVO); + + /** + * 清理 exceedDay 天前的任务日志 + * + * @param exceedDay 超过多少天就进行清理 + * @param deleteLimit 清理的间隔条数 + */ + Integer cleanJobLog(Integer exceedDay, Integer deleteLimit); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java new file mode 100644 index 0000000..093414b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java @@ -0,0 +1,80 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import com.win.module.infra.dal.mysql.job.JobLogMapper; +import com.win.module.infra.enums.job.JobLogStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; + +/** + * Job 日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class JobLogServiceImpl implements JobLogService { + + @Resource + private JobLogMapper jobLogMapper; + + @Override + public Long createJobLog(Long jobId, LocalDateTime beginTime, + String jobHandlerName, String jobHandlerParam, Integer executeIndex) { + JobLogDO log = JobLogDO.builder().jobId(jobId).handlerName(jobHandlerName) + .handlerParam(jobHandlerParam).executeIndex(executeIndex) + .beginTime(beginTime).status(JobLogStatusEnum.RUNNING.getStatus()).build(); + jobLogMapper.insert(log); + return log.getId(); + } + + @Override + @Async + public void updateJobLogResultAsync(Long logId, LocalDateTime endTime, Integer duration, boolean success, String result) { + try { + JobLogDO updateObj = JobLogDO.builder().id(logId).endTime(endTime).duration(duration) + .status(success ? JobLogStatusEnum.SUCCESS.getStatus() : JobLogStatusEnum.FAILURE.getStatus()) + .result(result).build(); + jobLogMapper.updateById(updateObj); + } catch (Exception ex) { + log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", + logId, endTime, duration, success, result); + } + } + + @Override + @SuppressWarnings("DuplicatedCode") + public Integer cleanJobLog(Integer exceedDay, Integer deleteLimit) { + int count = 0; + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay); + // 循环删除,直到没有满足条件的数据 + for (int i = 0; i < Short.MAX_VALUE; i++) { + int deleteCount = jobLogMapper.deleteByCreateTimeLt(expireDate, deleteLimit); + count += deleteCount; + // 达到删除预期条数,说明到底了 + if (deleteCount < deleteLimit) { + break; + } + } + return count; + } + + @Override + public JobLogDO getJobLog(Long id) { + return jobLogMapper.selectById(id); + } + + @Override + public PageResult getJobLogPage(JobLogPageReqVO pageReqVO) { + return jobLogMapper.selectPage(pageReqVO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java new file mode 100644 index 0000000..b8c579a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java @@ -0,0 +1,78 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.win.module.infra.controller.admin.job.vo.job.JobSaveReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import org.quartz.SchedulerException; + +import jakarta.validation.Valid; + +/** + * 定时任务 Service 接口 + * + * @author 芋道源码 + */ +public interface JobService { + + /** + * 创建定时任务 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createJob(@Valid JobSaveReqVO createReqVO) throws SchedulerException; + + /** + * 更新定时任务 + * + * @param updateReqVO 更新信息 + */ + void updateJob(@Valid JobSaveReqVO updateReqVO) throws SchedulerException; + + /** + * 更新定时任务的状态 + * + * @param id 任务编号 + * @param status 状态 + */ + void updateJobStatus(Long id, Integer status) throws SchedulerException; + + /** + * 触发定时任务 + * + * @param id 任务编号 + */ + void triggerJob(Long id) throws SchedulerException; + + /** + * 同步定时任务 + * + * 目的:自己存储的 Job 信息,强制同步到 Quartz 中 + */ + void syncJob() throws SchedulerException; + + /** + * 删除定时任务 + * + * @param id 编号 + */ + void deleteJob(Long id) throws SchedulerException; + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + JobDO getJob(Long id); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobPage(JobPageReqVO pageReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java new file mode 100644 index 0000000..5e212a8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java @@ -0,0 +1,202 @@ +package com.win.module.infra.service.job; + +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.framework.quartz.core.scheduler.SchedulerManager; +import com.win.framework.quartz.core.util.CronUtils; +import com.win.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.win.module.infra.controller.admin.job.vo.job.JobSaveReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import com.win.module.infra.dal.mysql.job.JobMapper; +import com.win.module.infra.enums.job.JobStatusEnum; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.List; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.containsAny; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 定时任务 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class JobServiceImpl implements JobService { + + @Resource + private JobMapper jobMapper; + + @Resource + private SchedulerManager schedulerManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createJob(JobSaveReqVO createReqVO) throws SchedulerException { + validateCronExpression(createReqVO.getCronExpression()); + // 1.1 校验唯一性 + if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) { + throw exception(JOB_HANDLER_EXISTS); + } + // 1.2 校验 JobHandler 是否存在 + validateJobHandlerExists(createReqVO.getHandlerName()); + + // 2. 插入 JobDO + JobDO job = BeanUtils.toBean(createReqVO, JobDO.class); + job.setStatus(JobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + + // 3.1 添加 Job 到 Quartz 中 + schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), + createReqVO.getRetryCount(), createReqVO.getRetryInterval()); + // 3.2 更新 JobDO + JobDO updateObj = JobDO.builder().id(job.getId()).status(JobStatusEnum.NORMAL.getStatus()).build(); + jobMapper.updateById(updateObj); + return job.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJob(JobSaveReqVO updateReqVO) throws SchedulerException { + validateCronExpression(updateReqVO.getCronExpression()); + // 1.1 校验存在 + JobDO job = validateJobExists(updateReqVO.getId()); + // 1.2 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行 + if (!job.getStatus().equals(JobStatusEnum.NORMAL.getStatus())) { + throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS); + } + // 1.3 校验 JobHandler 是否存在 + validateJobHandlerExists(updateReqVO.getHandlerName()); + + // 2. 更新 JobDO + JobDO updateObj = BeanUtils.toBean(updateReqVO, JobDO.class); + fillJobMonitorTimeoutEmpty(updateObj); + jobMapper.updateById(updateObj); + + // 3. 更新 Job 到 Quartz 中 + schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), + updateReqVO.getRetryCount(), updateReqVO.getRetryInterval()); + } + + private void validateJobHandlerExists(String handlerName) { + try { + Object handler = SpringUtil.getBean(handlerName); + assert handler != null; + if (!(handler instanceof JobHandler)) { + throw exception(JOB_HANDLER_BEAN_TYPE_ERROR); + } + } catch (NoSuchBeanDefinitionException e) { + throw exception(JOB_HANDLER_BEAN_NOT_EXISTS); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJobStatus(Long id, Integer status) throws SchedulerException { + // 校验 status + if (!containsAny(status, JobStatusEnum.NORMAL.getStatus(), JobStatusEnum.STOP.getStatus())) { + throw exception(JOB_CHANGE_STATUS_INVALID); + } + // 校验存在 + JobDO job = validateJobExists(id); + // 校验是否已经为当前状态 + if (job.getStatus().equals(status)) { + throw exception(JOB_CHANGE_STATUS_EQUALS); + } + // 更新 Job 状态 + JobDO updateObj = JobDO.builder().id(id).status(status).build(); + jobMapper.updateById(updateObj); + + // 更新状态 Job 到 Quartz 中 + if (JobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 + schedulerManager.resumeJob(job.getHandlerName()); + } else { // 暂停 + schedulerManager.pauseJob(job.getHandlerName()); + } + } + + @Override + public void triggerJob(Long id) throws SchedulerException { + // 校验存在 + JobDO job = validateJobExists(id); + + // 触发 Quartz 中的 Job + schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncJob() throws SchedulerException { + // 1. 查询 Job 配置 + List jobList = jobMapper.selectList(); + + // 2. 遍历处理 + for (JobDO job : jobList) { + // 2.1 先删除,再创建 + schedulerManager.deleteJob(job.getHandlerName()); + schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), + job.getRetryCount(), job.getRetryInterval()); + // 2.2 如果 status 为暂停,则需要暂停 + if (Objects.equals(job.getStatus(), JobStatusEnum.STOP.getStatus())) { + schedulerManager.pauseJob(job.getHandlerName()); + } + log.info("[syncJob][id({}) handlerName({}) 同步完成]", job.getId(), job.getHandlerName()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJob(Long id) throws SchedulerException { + // 校验存在 + JobDO job = validateJobExists(id); + // 更新 + jobMapper.deleteById(id); + + // 删除 Job 到 Quartz 中 + schedulerManager.deleteJob(job.getHandlerName()); + } + + private JobDO validateJobExists(Long id) { + JobDO job = jobMapper.selectById(id); + if (job == null) { + throw exception(JOB_NOT_EXISTS); + } + return job; + } + + private void validateCronExpression(String cronExpression) { + if (!CronUtils.isValid(cronExpression)) { + throw exception(JOB_CRON_EXPRESSION_VALID); + } + } + + @Override + public JobDO getJob(Long id) { + return jobMapper.selectById(id); + } + + @Override + public PageResult getJobPage(JobPageReqVO pageReqVO) { + return jobMapper.selectPage(pageReqVO); + } + + private static void fillJobMonitorTimeoutEmpty(JobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java new file mode 100644 index 0000000..487d464 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java @@ -0,0 +1,38 @@ +package com.win.module.infra.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; + +/** + * API 访问日志 Service 接口 + * + * @author 芋道源码 + */ +public interface ApiAccessLogService { + + /** + * 创建 API 访问日志 + * + * @param createReqDTO API 访问日志 + */ + void createApiAccessLog(ApiAccessLogCreateReqDTO createReqDTO); + + /** + * 获得 API 访问日志分页 + * + * @param pageReqVO 分页查询 + * @return API 访问日志分页 + */ + PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO); + + /** + * 清理 exceedDay 天前的访问日志 + * + * @param exceedDay 超过多少天就进行清理 + * @param deleteLimit 清理的间隔条数 + */ + Integer cleanAccessLog(Integer exceedDay, Integer deleteLimit); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java new file mode 100644 index 0000000..96170e5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java @@ -0,0 +1,70 @@ +package com.win.module.infra.service.logger; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.win.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; + +import static com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO.REQUEST_PARAMS_MAX_LENGTH; +import static com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO.RESULT_MSG_MAX_LENGTH; + +/** + * API 访问日志 Service 实现类 + * + * @author 芋道源码 + */ +@Slf4j +@Service +@Validated +public class ApiAccessLogServiceImpl implements ApiAccessLogService { + + @Resource + private ApiAccessLogMapper apiAccessLogMapper; + + @Override + public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) { + ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createDTO, ApiAccessLogDO.class); + apiAccessLog.setRequestParams(StrUtil.maxLength(apiAccessLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); + apiAccessLog.setResultMsg(StrUtil.maxLength(apiAccessLog.getResultMsg(), RESULT_MSG_MAX_LENGTH)); + if (TenantContextHolder.getTenantId() != null) { + apiAccessLogMapper.insert(apiAccessLog); + } else { + // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败! + TenantUtils.executeIgnore(() -> apiAccessLogMapper.insert(apiAccessLog)); + } + } + + @Override + public PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO) { + return apiAccessLogMapper.selectPage(pageReqVO); + } + + @Override + @SuppressWarnings("DuplicatedCode") + public Integer cleanAccessLog(Integer exceedDay, Integer deleteLimit) { + int count = 0; + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay); + // 循环删除,直到没有满足条件的数据 + for (int i = 0; i < Short.MAX_VALUE; i++) { + int deleteCount = apiAccessLogMapper.deleteByCreateTimeLt(expireDate, deleteLimit); + count += deleteCount; + // 达到删除预期条数,说明到底了 + if (deleteCount < deleteLimit) { + break; + } + } + return count; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java new file mode 100644 index 0000000..21b077f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java @@ -0,0 +1,47 @@ +package com.win.module.infra.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; + +/** + * API 错误日志 Service 接口 + * + * @author 芋道源码 + */ +public interface ApiErrorLogService { + + /** + * 创建 API 错误日志 + * + * @param createReqDTO API 错误日志 + */ + void createApiErrorLog(ApiErrorLogCreateReqDTO createReqDTO); + + /** + * 获得 API 错误日志分页 + * + * @param pageReqVO 分页查询 + * @return API 错误日志分页 + */ + PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO); + + /** + * 更新 API 错误日志已处理 + * + * @param id API 日志编号 + * @param processStatus 处理结果 + * @param processUserId 处理人 + */ + void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); + + /** + * 清理 exceedDay 天前的错误日志 + * + * @param exceedDay 超过多少天就进行清理 + * @param deleteLimit 清理的间隔条数 + */ + Integer cleanErrorLog(Integer exceedDay, Integer deleteLimit); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java new file mode 100644 index 0000000..db42d95 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java @@ -0,0 +1,87 @@ +package com.win.module.infra.service.logger; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.win.module.infra.dal.mysql.logger.ApiErrorLogMapper; +import com.win.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO.REQUEST_PARAMS_MAX_LENGTH; +import static com.win.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static com.win.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_PROCESSED; + +/** + * API 错误日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class ApiErrorLogServiceImpl implements ApiErrorLogService { + + @Resource + private ApiErrorLogMapper apiErrorLogMapper; + + @Override + public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) { + ApiErrorLogDO apiErrorLog = BeanUtils.toBean(createDTO, ApiErrorLogDO.class) + .setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); + apiErrorLog.setRequestParams(StrUtil.maxLength(apiErrorLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH)); + if (TenantContextHolder.getTenantId() != null) { + apiErrorLogMapper.insert(apiErrorLog); + } else { + // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败! + TenantUtils.executeIgnore(() -> apiErrorLogMapper.insert(apiErrorLog)); + } + } + + @Override + public PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO) { + return apiErrorLogMapper.selectPage(pageReqVO); + } + + @Override + public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { + ApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); + if (errorLog == null) { + throw exception(API_ERROR_LOG_NOT_FOUND); + } + if (!ApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { + throw exception(API_ERROR_LOG_PROCESSED); + } + // 标记处理 + apiErrorLogMapper.updateById(ApiErrorLogDO.builder().id(id).processStatus(processStatus) + .processUserId(processUserId).processTime(LocalDateTime.now()).build()); + } + + @Override + @SuppressWarnings("DuplicatedCode") + public Integer cleanErrorLog(Integer exceedDay, Integer deleteLimit) { + int count = 0; + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay); + // 循环删除,直到没有满足条件的数据 + for (int i = 0; i < Short.MAX_VALUE; i++) { + int deleteCount = apiErrorLogMapper.deleteByCreateTimeLt(expireDate, deleteLimit); + count += deleteCount; + // 达到删除预期条数,说明到底了 + if (deleteCount < deleteLimit) { + break; + } + } + return count; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/DemoWebSocketMessageListener.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/DemoWebSocketMessageListener.java new file mode 100644 index 0000000..5153925 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/DemoWebSocketMessageListener.java @@ -0,0 +1,48 @@ +package com.win.module.infra.websocket; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.websocket.core.listener.WebSocketMessageListener; +import com.win.framework.websocket.core.sender.WebSocketMessageSender; +import com.win.framework.websocket.core.util.WebSocketFrameworkUtils; +import com.win.module.infra.websocket.message.DemoReceiveMessage; +import com.win.module.infra.websocket.message.DemoSendMessage; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.WebSocketSession; + +import jakarta.annotation.Resource; + +/** + * WebSocket 示例:单发消息 + * + * @author 芋道源码 + */ +@Component +public class DemoWebSocketMessageListener implements WebSocketMessageListener { + + @Resource + private WebSocketMessageSender webSocketMessageSender; + + @Override + public void onMessage(WebSocketSession session, DemoSendMessage message) { + Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); + // 情况一:单发 + if (message.getToUserId() != null) { + DemoReceiveMessage toMessage = new DemoReceiveMessage().setFromUserId(fromUserId) + .setText(message.getText()).setSingle(true); + webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), message.getToUserId(), // 给指定用户 + "demo-message-receive", toMessage); + return; + } + // 情况二:群发 + DemoReceiveMessage toMessage = new DemoReceiveMessage().setFromUserId(fromUserId) + .setText(message.getText()).setSingle(false); + webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), // 给所有用户 + "demo-message-receive", toMessage); + } + + @Override + public String getType() { + return "demo-message-send"; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoReceiveMessage.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoReceiveMessage.java new file mode 100644 index 0000000..bfdfc67 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoReceiveMessage.java @@ -0,0 +1,27 @@ +package com.win.module.infra.websocket.message; + +import lombok.Data; + +/** + * 示例:server -> client 同步消息 + * + * @author 芋道源码 + */ +@Data +public class DemoReceiveMessage { + + /** + * 接收人的编号 + */ + private Long fromUserId; + /** + * 内容 + */ + private String text; + + /** + * 是否单聊 + */ + private Boolean single; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoSendMessage.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoSendMessage.java new file mode 100644 index 0000000..e28fd29 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/message/DemoSendMessage.java @@ -0,0 +1,24 @@ +package com.win.module.infra.websocket.message; + +import lombok.Data; + +/** + * 示例:client -> server 发送消息 + * + * @author 芋道源码 + */ +@Data +public class DemoSendMessage { + + /** + * 发送给谁 + * + * 如果为空,说明发送给所有人 + */ + private Long toUserId; + /** + * 内容 + */ + private String text; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm new file mode 100644 index 0000000..5aa3bae --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm @@ -0,0 +1,233 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}; + +import org.springframework.web.bind.annotation.*; +import ${jakartaPackage}.annotation.Resource; +import org.springframework.validation.annotation.Validated; +#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end + +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import ${jakartaPackage}.validation.constraints.*; +import ${jakartaPackage}.validation.*; +import ${jakartaPackage}.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import ${PageParamClassName}; +import ${PageResultClassName}; +import ${CommonResultClassName}; +import ${BeanUtils}; +import static ${CommonResultClassName}.success; + +import ${ExcelUtilsClassName}; + +import ${ApiAccessLogClassName}; +import static ${OperateTypeEnumClassName}.*; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; +#end +import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service; + +@Tag(name = "${sceneEnum.name} - ${table.classComment}") +@RestController +##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 +@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") +@Validated +public class ${sceneEnum.prefixClass}${table.className}Controller { + + @Resource + private ${table.className}Service ${classNameVar}Service; + + @PostMapping("/create") + @Operation(summary = "创建${table.classComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") +#end + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) { + return success(${classNameVar}Service.create${simpleClassName}(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新${table.classComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") +#end + public CommonResult update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) { + ${classNameVar}Service.update${simpleClassName}(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除${table.classComment}") + @Parameter(name = "id", description = "编号", required = true) +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") +#end + public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${classNameVar}Service.delete${simpleClassName}(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得${table.classComment}") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); + return success(BeanUtils.toBean(${classNameVar}, ${sceneEnum.prefixClass}${table.className}RespVO.class)); + } + +#if ( $table.templateType != 2 ) + @GetMapping("/page") + @Operation(summary = "获得${table.classComment}分页") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO); + return success(BeanUtils.toBean(pageResult, ${sceneEnum.prefixClass}${table.className}RespVO.class)); + } + +## 特殊:树表专属逻辑(树不需要分页接口) +#else + @GetMapping("/list") + @Operation(summary = "获得${table.classComment}列表") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); + return success(BeanUtils.toBean(list, ${sceneEnum.prefixClass}${table.className}RespVO.class)); + } + +#end + @GetMapping("/export-excel") + @Operation(summary = "导出${table.classComment} Excel") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')") +#end + @ApiAccessLog(operateType = EXPORT) +#if ( $table.templateType != 2 ) + public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}RespVO.class, + BeanUtils.toBean(list, ${sceneEnum.prefixClass}${table.className}RespVO.class)); + } +## 特殊:树表专属逻辑(树不需要分页接口) +#else + public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO, + HttpServletResponse response) throws IOException { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); + // 导出 Excel + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${table.className}RespVO.class, + BeanUtils.toBean(list, ${table.className}RespVO.class)); + } +#end + +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 +#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) +#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) +#set ($subClassNameVar = $subClassNameVars.get($index)) + // ==================== 子表($subTable.classComment) ==================== + +## 情况一:MASTER_ERP 时,需要分查询页子表 +#if ( $table.templateType == 11 ) + @GetMapping("/${subSimpleClassName_strikeCase}/page") + @Operation(summary = "获得${subTable.classComment}分页") + @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult> get${subSimpleClassName}Page(PageParam pageReqVO, + @RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return success(${classNameVar}Service.get${subSimpleClassName}Page(pageReqVO, ${subJoinColumn.javaField})); + } + +## 情况二:非 MASTER_ERP 时,需要列表查询子表 +#else + #if ( $subTable.subJoinMany ) + @GetMapping("/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}") + @Operation(summary = "获得${subTable.classComment}列表") + @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult> get${subSimpleClassName}ListBy${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return success(${classNameVar}Service.get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField})); + } + + #else + @GetMapping("/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}") + @Operation(summary = "获得${subTable.classComment}") + @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult<${subTable.className}DO> get${subSimpleClassName}By${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return success(${classNameVar}Service.get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField})); + } + + #end +#end +## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 +#if ( $table.templateType == 11 ) + @PostMapping("/${subSimpleClassName_strikeCase}/create") + @Operation(summary = "创建${subTable.classComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") +#end + public CommonResult<${subPrimaryColumn.javaType}> create${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) { + return success(${classNameVar}Service.create${subSimpleClassName}(${subClassNameVar})); + } + + @PutMapping("/${subSimpleClassName_strikeCase}/update") + @Operation(summary = "更新${subTable.classComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") +#end + public CommonResult update${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) { + ${classNameVar}Service.update${subSimpleClassName}(${subClassNameVar}); + return success(true); + } + + @DeleteMapping("/${subSimpleClassName_strikeCase}/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除${subTable.classComment}") +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") +#end + public CommonResult delete${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) { + ${classNameVar}Service.delete${subSimpleClassName}(id); + return success(true); + } + + @GetMapping("/${subSimpleClassName_strikeCase}/get") + @Operation(summary = "获得${subTable.classComment}") + @Parameter(name = "id", description = "编号", required = true) +#if ($sceneEnum.scene == 1) + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") +#end + public CommonResult<${subTable.className}DO> get${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) { + return success(${classNameVar}Service.get${subSimpleClassName}(id)); + } + +#end +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/listReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/listReqVO.vm new file mode 100644 index 0000000..46b6a25 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/listReqVO.vm @@ -0,0 +1,45 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import ${PageParamClassName}; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +## 处理 LocalDateTime 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment}列表 Request VO") +@Data +public class ${sceneEnum.prefixClass}${table.className}ListReqVO { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm new file mode 100644 index 0000000..003bac9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm @@ -0,0 +1,47 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import ${PageParamClassName}; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +## 处理 LocalDateTime 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperationCondition} && ${column.javaType} == "LocalDateTime") +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm new file mode 100644 index 0000000..24c3519 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm @@ -0,0 +1,53 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +## 处理 BigDecimal 字段的引入 +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +## 处理 LocalDateTime 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperationResult} && ${column.javaType} == "LocalDateTime") +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +#break +#end +#end +## 处理 Excel 导出 +import com.alibaba.excel.annotation.*; +#foreach ($column in $columns) +#if ("$!column.dictType" != "")## 有设置数据字典 +import ${DictFormatClassName}; +import ${DictConvertClassName}; +#break +#end +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") +@Data +@ExcelIgnoreUnannotated +public class ${sceneEnum.prefixClass}${table.className}RespVO { + +## 逐个处理字段 +#foreach ($column in $columns) +#if (${column.listOperationResult}) +## 1. 处理 Swagger 注解 + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) +## 2. 处理 Excel 导出 +#if ("$!column.dictType" != "")##处理枚举值 + @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) + @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 +#else + @ExcelProperty("${column.columnComment}") +#end +## 3. 处理字段定义 + private ${column.javaType} ${column.javaField}; + +#end +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm new file mode 100644 index 0000000..b432c75 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm @@ -0,0 +1,64 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import ${jakartaPackage}.validation.constraints.*; +## 处理 BigDecimal 字段的引入 +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +## 处理 LocalDateTime 字段的引入 +#foreach ($column in $columns) +#if ((${column.createOperation} || ${column.updateOperation}) && ${column.javaType} == "LocalDateTime") +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +#break +#end +#end +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment}新增/修改 Request VO") +@Data +public class ${sceneEnum.prefixClass}${table.className}SaveReqVO { + +## 逐个处理字段 +#foreach ($column in $columns) +#if (${column.createOperation} || ${column.updateOperation}) +## 1. 处理 Swagger 注解 + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) +## 2. 处理 Validator 参数校验 +#if (!${column.nullable} && !${column.primaryKey}) +#if (${column.javaType} == 'String') + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end +## 3. 处理字段定义 + private ${column.javaType} ${column.javaField}; + +#end +#end +## 特殊:主子表专属逻辑(非 ERP 模式) +#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) + #if ( $subTable.subJoinMany) + @Schema(description = "${subTable.classComment}列表") + private List<${subTable.className}DO> ${subClassNameVars.get($index)}s; + + #else + @Schema(description = "${subTable.classComment}") + private ${subTable.className}DO ${subClassNameVars.get($index)}; + + #end +#end +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm new file mode 100644 index 0000000..b019d6e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm @@ -0,0 +1,52 @@ +package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#end +#if (${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +#end +#end +import com.baomidou.mybatisplus.annotation.*; +import ${BaseDOClassName}; + +/** + * ${table.classComment} DO + * + * @author ${table.author} + */ +@TableName("${table.tableName.toLowerCase()}") +@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${table.className}DO extends BaseDO { + +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) + public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT = 0L; + +#end +#foreach ($column in $columns) +#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 + /** + * ${column.columnComment} + #if ("$!column.dictType" != "")##处理枚举值 + * + * 枚举 {@link TODO ${column.dictType} 对应的类} + #end + */ + #if (${column.primaryKey})##处理主键 + @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end + #end + private ${column.javaType} ${column.javaField}; +#end +#end + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do_sub.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do_sub.vm new file mode 100644 index 0000000..16be55e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do_sub.vm @@ -0,0 +1,49 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +package ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}; + +import lombok.*; +import java.util.*; +#foreach ($column in $subColumns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#end +#if (${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +#end +#end +import com.baomidou.mybatisplus.annotation.*; +import ${BaseDOClassName}; + +/** + * ${subTable.classComment} DO + * + * @author ${subTable.author} + */ +@TableName("${subTable.tableName.toLowerCase()}") +@KeySequence("${subTable.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${subTable.className}DO extends BaseDO { + +#foreach ($column in $subColumns) +#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 + /** + * ${column.columnComment} + #if ("$!column.dictType" != "")##处理枚举值 + * + * 枚举 {@link TODO ${column.dictType} 对应的类} + #end + */ + #if (${column.primaryKey})##处理主键 + @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end + #end + private ${column.javaType} ${column.javaField}; +#end +#end + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm new file mode 100644 index 0000000..b98b471 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm @@ -0,0 +1,82 @@ +package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; +import ${QueryWrapperClassName}; +import ${BaseMapperClassName}; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import org.apache.ibatis.annotations.Mapper; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; + +## 字段模板 +#macro(listCondition) +#foreach ($column in $columns) +#if (${column.listOperation}) +#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 +#if (${column.listOperationCondition} == "=")##情况一,= 的时候 + .eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 + .neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">")##情况三,> 的时候 + .gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 + .geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<")##情况五,< 的时候 + .ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候 + .leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 + .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 + .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#end +#end +#end +/** + * ${table.classComment} Mapper + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { + +## 特殊:树表专属逻辑(树不需要分页接口) +#if ( $table.templateType != 2 ) + default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } +#else + default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } +#end + +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) +#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 +#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 + default ${table.className}DO selectBy${TreeParentJavaField}And${TreeNameJavaField}(Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) { + return selectOne(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}, ${table.className}DO::get${TreeNameJavaField}, ${treeNameColumn.javaField}); + } + + default Long selectCountBy${TreeParentJavaField}(${treeParentColumn.javaType} ${treeParentColumn.javaField}) { + return selectCount(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}); + } + +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm new file mode 100644 index 0000000..290378d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper_sub.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper_sub.vm new file mode 100644 index 0000000..6ccaea7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper_sub.vm @@ -0,0 +1,57 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subJoinColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 +package ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}; + +import java.util.*; + +import ${PageResultClassName}; +import ${PageParamClassName}; +import ${QueryWrapperClassName}; +import ${BaseMapperClassName}; +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; +import org.apache.ibatis.annotations.Mapper; + +/** + * ${subTable.classComment} Mapper + * + * @author ${subTable.author} + */ +@Mapper +public interface ${subTable.className}Mapper extends BaseMapperX<${subTable.className}DO> { + +## 情况一:MASTER_ERP 时,需要分查询页子表 +#if ( $table.templateType == 11 ) + default PageResult<${subTable.className}DO> selectPage(PageParam reqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return selectPage(reqVO, new LambdaQueryWrapperX<${subTable.className}DO>() + .eq(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}) + .orderByDesc(${subTable.className}DO::getId));## 大多数情况下,id 倒序 + + } +## 主表与子表是一对一时 + #if (!$subTable.subJoinMany) + default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); + } + #end + +## 情况二:非 MASTER_ERP 时,需要列表查询子表 +#else + #if ( $subTable.subJoinMany) + default List<${subTable.className}DO> selectListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return selectList(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); + } + + #else + default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); + } + + #end + #end + default int deleteBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm new file mode 100644 index 0000000..4097daa --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm @@ -0,0 +1,22 @@ +// TODO 待办:请将下面的错误码复制到 win-module-${table.moduleName}-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! +// ========== ${table.classComment} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN = new ErrorCode(TODO 补充编号, "存在存在子${table.classComment},无法删除"); +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS = new ErrorCode(TODO 补充编号,"父级${table.classComment}不存在"); +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR = new ErrorCode(TODO 补充编号, "不能设置自己为父${table.classComment}"); +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE = new ErrorCode(TODO 补充编号, "已经存在该${treeNameColumn.columnComment}的${table.classComment}"); +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD = new ErrorCode(TODO 补充编号, "不能设置自己的子${table.className}为父${table.className}"); +#end +## 特殊:主子表专属逻辑 +#if ( $table.templateType == 11 )## 特殊:ERP 情况 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index)) +ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}不存在"); +#if ( !$subTable.subJoinMany ) +ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}已存在"); +#end +#end +#end \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm new file mode 100644 index 0000000..c4ee4f0 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm @@ -0,0 +1,147 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import java.util.*; +import ${jakartaPackage}.validation.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; +#end +import ${PageResultClassName}; +import ${PageParamClassName}; + +/** + * ${table.classComment} Service 接口 + * + * @author ${table.author} + */ +public interface ${table.className}Service { + + /** + * 创建${table.classComment} + * + * @param createReqVO 创建信息 + * @return 编号 + */ + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO); + + /** + * 更新${table.classComment} + * + * @param updateReqVO 更新信息 + */ + void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO); + + /** + * 删除${table.classComment} + * + * @param id 编号 + */ + void delete${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment} + * + * @param id 编号 + * @return ${table.classComment} + */ + ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); + +## 特殊:树表专属逻辑(树不需要分页接口) +#if ( $table.templateType != 2 ) + /** + * 获得${table.classComment}分页 + * + * @param pageReqVO 分页查询 + * @return ${table.classComment}分页 + */ + PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO); +#else + /** + * 获得${table.classComment}列表 + * + * @param listReqVO 查询条件 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO); +#end + +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 +#set ($subClassNameVar = $subClassNameVars.get($index)) + // ==================== 子表($subTable.classComment) ==================== + +## 情况一:MASTER_ERP 时,需要分查询页子表 +#if ( $table.templateType == 11 ) + /** + * 获得${subTable.classComment}分页 + * + * @param pageReqVO 分页查询 + * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} + * @return ${subTable.classComment}分页 + */ + PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}); + +## 情况二:非 MASTER_ERP 时,需要列表查询子表 +#else + #if ( $subTable.subJoinMany ) + /** + * 获得${subTable.classComment}列表 + * + * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} + * @return ${subTable.classComment}列表 + */ + List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}); + + #else + /** + * 获得${subTable.classComment} + * + * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} + * @return ${subTable.classComment} + */ + ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}); + + #end +#end +## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 +#if ( $table.templateType == 11 ) + /** + * 创建${subTable.classComment} + * + * @param ${subClassNameVar} 创建信息 + * @return 编号 + */ + ${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}); + + /** + * 更新${subTable.classComment} + * + * @param ${subClassNameVar} 更新信息 + */ + void update${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}); + + /** + * 删除${subTable.classComment} + * + * @param id 编号 + */ + void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id); + + /** + * 获得${subTable.classComment} + * + * @param id 编号 + * @return ${subTable.classComment} + */ + ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id); + +#end +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm new file mode 100644 index 0000000..80bc71b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm @@ -0,0 +1,351 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.springframework.stereotype.Service; +import ${jakartaPackage}.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; +#end +import ${PageResultClassName}; +import ${PageParamClassName}; +import ${BeanUtils}; + +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}.${subTable.className}Mapper; +#end + +import static ${ServiceExceptionUtilClassName}.exception; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; + +/** + * ${table.classComment} Service 实现类 + * + * @author ${table.author} + */ +@Service +@Validated +public class ${table.className}ServiceImpl implements ${table.className}Service { + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) + @Resource + private ${subTable.className}Mapper ${subClassNameVars.get($index)}Mapper; +#end + + @Override +## 特殊:主子表专属逻辑(非 ERP 模式) +#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) + @Transactional(rollbackFor = Exception.class) +#end + public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) { +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) +#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 +#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 + // 校验${treeParentColumn.columnComment}的有效性 + validateParent${simpleClassName}(null, createReqVO.get${TreeParentJavaField}()); + // 校验${treeNameColumn.columnComment}的唯一性 + validate${simpleClassName}${TreeNameJavaField}Unique(null, createReqVO.get${TreeParentJavaField}(), createReqVO.get${TreeNameJavaField}()); + +#end + // 插入 + ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class); + ${classNameVar}Mapper.insert(${classNameVar}); +## 特殊:主子表专属逻辑(非 ERP 模式) +#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) + + // 插入子表 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + #if ( $subTable.subJoinMany) + create${subSimpleClassName}List(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}s()); + #else + create${subSimpleClassName}(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}()); + #end +#end +#end + // 返回 + return ${classNameVar}.getId(); + } + + @Override +## 特殊:主子表专属逻辑(非 ERP 模式) +#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) + @Transactional(rollbackFor = Exception.class) +#end + public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) { + // 校验存在 + validate${simpleClassName}Exists(updateReqVO.getId()); +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) +#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 +#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 + // 校验${treeParentColumn.columnComment}的有效性 + validateParent${simpleClassName}(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}()); + // 校验${treeNameColumn.columnComment}的唯一性 + validate${simpleClassName}${TreeNameJavaField}Unique(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}(), updateReqVO.get${TreeNameJavaField}()); + +#end + // 更新 + ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class); + ${classNameVar}Mapper.updateById(updateObj); +## 特殊:主子表专属逻辑(非 ERP 模式) +#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11) + + // 更新子表 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + #if ( $subTable.subJoinMany) + update${subSimpleClassName}List(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}s()); + #else + update${subSimpleClassName}(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}()); + #end +#end +#end + } + + @Override +## 特殊:主子表专属逻辑 +#if ( $subTables && $subTables.size() > 0) + @Transactional(rollbackFor = Exception.class) +#end + public void delete${simpleClassName}(${primaryColumn.javaType} id) { + // 校验存在 + validate${simpleClassName}Exists(id); +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) +#set ($ParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 + // 校验是否有子${table.classComment} + if (${classNameVar}Mapper.selectCountBy${ParentJavaField}(id) > 0) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN); + } +#end + // 删除 + ${classNameVar}Mapper.deleteById(id); +## 特殊:主子表专属逻辑 +#if ( $subTables && $subTables.size() > 0) + + // 删除子表 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + delete${subSimpleClassName}By${SubJoinColumnName}(id); +#end +#end + } + + private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { + if (${classNameVar}Mapper.selectById(id) == null) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + } + +## 特殊:树表专属逻辑 +#if ( $table.templateType == 2 ) +#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 +#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 + private void validateParent${simpleClassName}(Long id, Long ${treeParentColumn.javaField}) { + if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) { + return; + } + // 1. 不能设置自己为父${table.classComment} + if (Objects.equals(id, ${treeParentColumn.javaField})) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR); + } + // 2. 父${table.classComment}不存在 + ${simpleClassName}DO parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField}); + if (parent${simpleClassName} == null) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS); + } + // 3. 递归校验父${table.classComment},如果父${table.classComment}是自己的子${table.classComment},则报错,避免形成环路 + if (id == null) { // id 为空,说明新增,不需要考虑环路 + return; + } + for (int i = 0; i < Short.MAX_VALUE; i++) { + // 3.1 校验环路 + ${treeParentColumn.javaField} = parent${simpleClassName}.get${TreeParentJavaField}(); + if (Objects.equals(id, ${treeParentColumn.javaField})) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD); + } + // 3.2 继续递归下一级父${table.classComment} + if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) { + break; + } + parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField}); + if (parent${simpleClassName} == null) { + break; + } + } + } + + private void validate${simpleClassName}${TreeNameJavaField}Unique(Long id, Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) { + ${simpleClassName}DO ${classNameVar} = ${classNameVar}Mapper.selectBy${TreeParentJavaField}And${TreeNameJavaField}(${treeParentColumn.javaField}, ${treeNameColumn.javaField}); + if (${classNameVar} == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的${table.classComment} + if (id == null) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE); + } + if (!Objects.equals(${classNameVar}.getId(), id)) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE); + } + } + +#end + @Override + public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { + return ${classNameVar}Mapper.selectById(id); + } + +## 特殊:树表专属逻辑(树不需要分页接口) +#if ( $table.templateType != 2 ) + @Override + public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { + return ${classNameVar}Mapper.selectPage(pageReqVO); + } +#else + @Override + public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { + return ${classNameVar}Mapper.selectList(listReqVO); + } +#end + +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index)) +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 +#set ($subClassNameVar = $subClassNameVars.get($index)) + // ==================== 子表($subTable.classComment) ==================== + +## 情况一:MASTER_ERP 时,需要分查询页子表 +#if ( $table.templateType == 11 ) + @Override + public PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return ${subClassNameVars.get($index)}Mapper.selectPage(pageReqVO, ${subJoinColumn.javaField}); + } + +## 情况二:非 MASTER_ERP 时,需要列表查询子表 +#else + #if ( $subTable.subJoinMany ) + @Override + public List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return ${subClassNameVars.get($index)}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField}); + } + + #else + @Override + public ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { + return ${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subJoinColumn.javaField}); + } + + #end +#end +## 情况一:MASTER_ERP 时,支持单个的新增、修改、删除操作 +#if ( $table.templateType == 11 ) + @Override + public ${subPrimaryColumn.javaType} create${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) { +## 特殊:一对一时,需要保证只有一条,不能重复插入 +#if ( !$subTable.subJoinMany) + // 校验是否已经存在 + if (${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subClassNameVar}.get${SubJoinColumnName}()) != null) { + throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS); + } + // 插入 +#end + ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar}); + return ${subClassNameVar}.getId(); + } + + @Override + public void update${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) { + // 校验存在 + validate${subSimpleClassName}Exists(${subClassNameVar}.getId()); + // 更新 + ${subClassNameVar}.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新 + ${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar}); + } + + @Override + public void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id) { + // 校验存在 + validate${subSimpleClassName}Exists(id); + // 删除 + ${subClassNameVars.get($index)}Mapper.deleteById(id); + } + + @Override + public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) { + return ${subClassNameVars.get($index)}Mapper.selectById(id); + } + + private void validate${subSimpleClassName}Exists(${subPrimaryColumn.javaType} id) { + if (${subClassNameVar}Mapper.selectById(id) == null) { + throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS); + } + } + +## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作 +#else + #if ( $subTable.subJoinMany) + private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { + list.forEach(o -> o.set$SubJoinColumnName(${subJoinColumn.javaField})); + ${subClassNameVars.get($index)}Mapper.insertBatch(list); + } + + private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { + delete${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + create${subSimpleClassName}List(${subJoinColumn.javaField}, list); + } + + #else + private void create${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) { + if (${subClassNameVar} == null) { + return; + } + ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField}); + ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar}); + } + + private void update${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) { + if (${subClassNameVar} == null) { + return; + } + ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField}); + ${subClassNameVar}.setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新 + ${subClassNameVars.get($index)}Mapper.insertOrUpdate(${subClassNameVar}); + } + + #end +#end + private void delete${subSimpleClassName}By${SubJoinColumnName}(${primaryColumn.javaType} ${subJoinColumn.javaField}) { + ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField}); + } + +#end +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm new file mode 100644 index 0000000..bfd4600 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm @@ -0,0 +1,168 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import ${jakartaPackage}.annotation.Resource; + +import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${PageResultClassName}; + +import ${jakartaPackage}.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; +import static ${baseFrameworkPackage}.test.core.util.AssertUtils.*; +import static ${baseFrameworkPackage}.test.core.util.RandomUtils.*; +import static ${LocalDateTimeUtilsClassName}.*; +import static ${ObjectUtilsClassName}.*; +import static ${DateUtilsClassName}.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +## 字段模板 +#macro(getPageCondition $VO) + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + o.set$JavaField(null); + #end + #end + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + // 测试 ${column.javaField} 不匹配 + ${classNameVar}Mapper.insert(cloneIgnoreId(db${simpleClassName}, o -> o.set$JavaField(null))); + #end + #end + // 准备参数 + ${sceneEnum.prefixClass}${table.className}${VO} reqVO = new ${sceneEnum.prefixClass}${table.className}${VO}(); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 + reqVO.set${JavaField}(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + #else + reqVO.set$JavaField(null); + #end + #end + #end +#end +/** + * {@link ${table.className}ServiceImpl} 的单元测试类 + * + * @author ${table.author} + */ +@Import(${table.className}ServiceImpl.class) +public class ${table.className}ServiceImplTest extends BaseDbUnitTest { + + @Resource + private ${table.className}ServiceImpl ${classNameVar}Service; + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Test + public void testCreate${simpleClassName}_success() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class).setId(null); + + // 调用 + ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(createReqVO); + // 断言 + assertNotNull(${classNameVar}Id); + // 校验记录的属性是否正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); + assertPojoEquals(createReqVO, ${classNameVar}, "id"); + } + + @Test + public void testUpdate${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class, o -> { + o.setId(db${simpleClassName}.getId()); // 设置更新的 ID + }); + + // 调用 + ${classNameVar}Service.update${simpleClassName}(updateReqVO); + // 校验是否更新正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_notExists() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(updateReqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testDelete${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${primaryColumn.javaType} id = db${simpleClassName}.getId(); + + // 调用 + ${classNameVar}Service.delete${simpleClassName}(id); + // 校验数据不存在了 + assertNull(${classNameVar}Mapper.selectById(id)); + } + + @Test + public void testDelete${simpleClassName}_notExists() { + // 准备参数 + ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + +## 特殊:树表专属逻辑(树不需要分页接口) +#if ( $table.templateType != 2 ) + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}Page() { + #getPageCondition("PageReqVO") + + // 调用 + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); + } +#else + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}List() { + #getPageCondition("ListReqVO") + + // 调用 + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(db${simpleClassName}, list.get(0)); + } +#end + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm new file mode 100644 index 0000000..b0211e4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm @@ -0,0 +1,37 @@ +-- 将该建表 SQL 语句,添加到 win-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里 +CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" ( +#foreach ($column in $columns) +#if (${column.javaType} == 'Long') + #set ($dataType='bigint') +#elseif (${column.javaType} == 'Integer') + #set ($dataType='int') +#elseif (${column.javaType} == 'Boolean') + #set ($dataType='bit') +#elseif (${column.javaType} == 'Date') + #set ($dataType='datetime') +#else + #set ($dataType='varchar') +#end + #if (${column.primaryKey})##处理主键 + "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end, + #else + #if (${column.columnName} == 'create_time') + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'update_time') + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater') + "${column.columnName}" ${dataType} DEFAULT '', + #elseif (${column.columnName} == 'deleted') + "deleted" bit NOT NULL DEFAULT FALSE, + #elseif (${column.columnName} == 'tenant_id') + "tenant_id" bigint NOT NULL DEFAULT 0, + #else + "${column.columnName.toLowerCase()}" ${dataType}#if (${column.nullable} == false) NOT NULL#end, + #end + #end +#end + PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}") +) COMMENT '${table.tableComment}'; + +-- 将该删表 SQL 语句,添加到 win-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里 +DELETE FROM "${table.tableName}"; \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm new file mode 100644 index 0000000..41b107d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm @@ -0,0 +1,28 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, + '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) +#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) +#foreach ($functionName in $functionNames) +#set ($index = $foreach.count - 1) +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, + '', '', '', 0 +); +#end \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm new file mode 100644 index 0000000..835c019 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm @@ -0,0 +1,141 @@ +import request from '@/utils/request' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// 创建${table.classComment} +export function create${simpleClassName}(data) { + return request({ + url: '${baseURL}/create', + method: 'post', + data: data + }) +} + +// 更新${table.classComment} +export function update${simpleClassName}(data) { + return request({ + url: '${baseURL}/update', + method: 'put', + data: data + }) +} + +// 删除${table.classComment} +export function delete${simpleClassName}(id) { + return request({ + url: '${baseURL}/delete?id=' + id, + method: 'delete' + }) +} + +// 获得${table.classComment} +export function get${simpleClassName}(id) { + return request({ + url: '${baseURL}/get?id=' + id, + method: 'get' + }) +} + +#if ( $table.templateType != 2 ) +// 获得${table.classComment}分页 +export function get${simpleClassName}Page(params) { + return request({ + url: '${baseURL}/page', + method: 'get', + params + }) +} +#else +// 获得${table.classComment}列表 +export function get${simpleClassName}List(params) { + return request({ + url: '${baseURL}/list', + method: 'get', + params + }) +} +#end +// 导出${table.classComment} Excel +export function export${simpleClassName}Excel(params) { + return request({ + url: '${baseURL}/export-excel', + method: 'get', + params, + responseType: 'blob' + }) +} +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) + #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 + #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 + #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) + #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) + #set ($subClassNameVar = $subClassNameVars.get($index)) + +// ==================== 子表($subTable.classComment) ==================== + ## 情况一:MASTER_ERP 时,需要分查询页子表 + #if ($table.templateType == 11) + // 获得${subTable.classComment}分页 + export function get${subSimpleClassName}Page(params) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/page', + method: 'get', + params + }) + } + ## 情况二:非 MASTER_ERP 时,需要列表查询子表 + #else + #if ($subTable.subJoinMany) + // 获得${subTable.classComment}列表 + export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=' + ${subJoinColumn.javaField}, + method: 'get' + }) + } + #else + // 获得${subTable.classComment} + export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=' + ${subJoinColumn.javaField}, + method: 'get' + }) + } + #end + #end + ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 + #if ($table.templateType == 11) + // 新增${subTable.classComment} + export function create${subSimpleClassName}(data) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/create', + method: 'post', + data + }) + } + // 修改${subTable.classComment} + export function update${subSimpleClassName}(data) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/update', + method: 'post', + data + }) + } + // 删除${subTable.classComment} + export function delete${subSimpleClassName}(id) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/delete?id=' + id, + method: 'delete' + }) + } + // 获得${subTable.classComment} + export function get${subSimpleClassName}(id) { + return request({ + url: '${baseURL}/${subSimpleClassName_strikeCase}/get?id=' + id, + method: 'get' + }) + } + #end +#end \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm new file mode 100644 index 0000000..99aa91a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm @@ -0,0 +1,205 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm new file mode 100644 index 0000000..ca266be --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm @@ -0,0 +1,2 @@ +## 主表的 normal 和 inner 使用相同的 form 表单 +#parse("codegen/vue/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm new file mode 100644 index 0000000..48a404a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm @@ -0,0 +1,347 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm new file mode 100644 index 0000000..589736b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm @@ -0,0 +1,165 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm new file mode 100644 index 0000000..90b8e41 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm @@ -0,0 +1,4 @@ +## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: +## 1)inner 使用 list 不分页,erp 使用 page 分页 +## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 +#parse("codegen/vue/views/components/list_sub_erp.vue.vm") \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/form.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/form.vue.vm new file mode 100644 index 0000000..634d05d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/form.vue.vm @@ -0,0 +1,320 @@ + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm new file mode 100644 index 0000000..9c1e124 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm @@ -0,0 +1,340 @@ + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm new file mode 100644 index 0000000..c3044fb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm @@ -0,0 +1,115 @@ +import request from '@/config/axios' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// ${table.classComment} VO +export interface ${simpleClassName}VO { +#foreach ($column in $columns) +#if ($column.createOperation || $column.updateOperation) +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") + ${column.javaField}: number // ${column.columnComment} +#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") + ${column.javaField}: Date // ${column.columnComment} +#else + ${column.javaField}: ${column.javaType.toLowerCase()} // ${column.columnComment} +#end +#end +#end +} + +// ${table.classComment} API +export const ${simpleClassName}Api = { +#if ( $table.templateType != 2 ) + // 查询${table.classComment}分页 + get${simpleClassName}Page: async (params: any) => { + return await request.get({ url: `${baseURL}/page`, params }) + }, +#else + // 查询${table.classComment}列表 + get${simpleClassName}List: async (params) => { + return await request.get({ url: `${baseURL}/list`, params }) + }, +#end + + // 查询${table.classComment}详情 + get${simpleClassName}: async (id: number) => { + return await request.get({ url: `${baseURL}/get?id=` + id }) + }, + + // 新增${table.classComment} + create${simpleClassName}: async (data: ${simpleClassName}VO) => { + return await request.post({ url: `${baseURL}/create`, data }) + }, + + // 修改${table.classComment} + update${simpleClassName}: async (data: ${simpleClassName}VO) => { + return await request.put({ url: `${baseURL}/update`, data }) + }, + + // 删除${table.classComment} + delete${simpleClassName}: async (id: number) => { + return await request.delete({ url: `${baseURL}/delete?id=` + id }) + }, + + // 导出${table.classComment} Excel + export${simpleClassName}: async (params) => { + return await request.download({ url: `${baseURL}/export-excel`, params }) + }, +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) +#set ($index = $foreach.count - 1) +#set ($subSimpleClassName = $subSimpleClassNames.get($index)) +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 +#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) +#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) +#set ($subClassNameVar = $subClassNameVars.get($index)) + +// ==================== 子表($subTable.classComment) ==================== +## 情况一:MASTER_ERP 时,需要分查询页子表 +#if ( $table.templateType == 11 ) + + // 获得${subTable.classComment}分页 + get${subSimpleClassName}Page: async (params) => { + return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/page`, params }) + }, +## 情况二:非 MASTER_ERP 时,需要列表查询子表 +#else + #if ( $subTable.subJoinMany ) + + // 获得${subTable.classComment}列表 + get${subSimpleClassName}ListBy${SubJoinColumnName}: async (${subJoinColumn.javaField}) => { + return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=` + ${subJoinColumn.javaField} }) + }, + #else + + // 获得${subTable.classComment} + get${subSimpleClassName}By${SubJoinColumnName}: async (${subJoinColumn.javaField}) => { + return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=` + ${subJoinColumn.javaField} }) + }, + #end +#end +## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 +#if ( $table.templateType == 11 ) + // 新增${subTable.classComment} + create${subSimpleClassName}: async (data) => { + return await request.post({ url: `${baseURL}/${subSimpleClassName_strikeCase}/create`, data }) + }, + + // 修改${subTable.classComment} + update${subSimpleClassName}: async (data) => { + return await request.put({ url: `${baseURL}/${subSimpleClassName_strikeCase}/update`, data }) + }, + + // 删除${subTable.classComment} + delete${subSimpleClassName}: async (id: number) => { + return await request.delete({ url: `${baseURL}/${subSimpleClassName_strikeCase}/delete?id=` + id }) + }, + + // 获得${subTable.classComment} + get${subSimpleClassName}: async (id: number) => { + return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/get?id=` + id }) + }, +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm new file mode 100644 index 0000000..81cd977 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm @@ -0,0 +1,204 @@ +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm new file mode 100644 index 0000000..d8542c3 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm @@ -0,0 +1,2 @@ +## 主表的 normal 和 inner 使用相同的 form 表单 +#parse("codegen/vue3/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm new file mode 100644 index 0000000..3fa1eff --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm @@ -0,0 +1,360 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm new file mode 100644 index 0000000..3f0710e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm @@ -0,0 +1,184 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm new file mode 100644 index 0000000..3fe6488 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm @@ -0,0 +1,4 @@ +## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: +## 1)inner 使用 list 不分页,erp 使用 page 分页 +## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 +#parse("codegen/vue3/views/components/list_sub_erp.vue.vm") \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/form.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/form.vue.vm new file mode 100644 index 0000000..e37474b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/form.vue.vm @@ -0,0 +1,300 @@ + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm new file mode 100644 index 0000000..399b58e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm @@ -0,0 +1,374 @@ + + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm new file mode 100644 index 0000000..b7f2651 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm @@ -0,0 +1,32 @@ +import { defHttp } from '@/utils/http/axios' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// 查询${table.classComment}列表 +export function get${simpleClassName}Page(params) { + return defHttp.get({ url: '${baseURL}/page', params }) +} + +// 查询${table.classComment}详情 +export function get${simpleClassName}(id: number) { + return defHttp.get({ url: `${baseURL}/get?id=${id}` }) +} + +// 新增${table.classComment} +export function create${simpleClassName}(data) { + return defHttp.post({ url: '${baseURL}/create', data }) +} + +// 修改${table.classComment} +export function update${simpleClassName}(data) { + return defHttp.put({ url: '${baseURL}/update', data }) +} + +// 删除${table.classComment} +export function delete${simpleClassName}(id: number) { + return defHttp.delete({ url: `${baseURL}/delete?id=${id}` }) +} + +// 导出${table.classComment} Excel +export function export${simpleClassName}(params) { + return defHttp.download({ url: '${baseURL}/export-excel', params }, '${table.classComment}.xls') +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm new file mode 100644 index 0000000..56f4e82 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm @@ -0,0 +1,260 @@ +import type {BasicColumn, FormSchema} from '@/components/Table' +import {useRender} from '@/components/Table' +import {DICT_TYPE, getDictOptions} from '@/utils/dict' + +export const columns: BasicColumn[] = [ +#foreach($column in $columns) +#if ($column.listOperationResult) + #set ($dictType=$column.dictType) + #set ($javaField = $column.javaField) + #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #set ($comment=$column.columnComment) +#if ($column.javaType == "LocalDateTime")## 时间类型 + { + title: '${comment}', + dataIndex: '${javaField}', + width: 180, + customRender: ({ text }) => { + return useRender.renderDate(text) + }, + }, +#elseif("" != $column.dictType)## 数据字典 + { + title: '${comment}', + dataIndex: '${javaField}', + width: 180, + customRender: ({ text }) => { + return useRender.renderDict(text, DICT_TYPE.$dictType.toUpperCase()) + }, + }, +#else + { + title: '${comment}', + dataIndex: '${javaField}', + width: 160, + }, +#end +#end +#end +] + +export const searchFormSchema: FormSchema[] = [ +#foreach($column in $columns) +#if ($column.listOperation) + #set ($dictType=$column.dictType) + #set ($javaType = $column.javaType) + #set ($javaField = $column.javaField) + #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #set ($comment=$column.columnComment) + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + #set ($dictMethod = "number") + #elseif ($javaType == "String") + #set ($dictMethod = "string") + #elseif ($javaType == "Boolean") + #set ($dictMethod = "boolean") + #end + { + label: '${comment}', + field: '${javaField}', + #if ($column.htmlType == "input") + component: 'Input', + #elseif ($column.htmlType == "select") + component: 'Select', + componentProps: { + #if ("" != $dictType)## 设置了 dictType 数据字典的情况 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else## 未设置 dictType 数据字典的情况 + options: [], + #end + }, + #elseif ($column.htmlType == "radio") + component: 'RadioButtonGroup', + componentProps: { + #if ("" != $dictType)## 设置了 dictType 数据字典的情况 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else## 未设置 dictType 数据字典的情况 + options: [], + #end + }, + #elseif($column.htmlType == "datetime") + component: 'RangePicker', + #end + colProps: { span: 8 }, + }, +#end +#end +] + +export const createFormSchema: FormSchema[] = [ + { + label: '编号', + field: 'id', + show: false, + component: 'Input', + }, +#foreach($column in $columns) +#if ($column.createOperation) + #set ($dictType = $column.dictType) + #set ($javaType = $column.javaType) + #set ($javaField = $column.javaField) + #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #set ($comment = $column.columnComment) + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + #set ($dictMethod = "number") + #elseif ($javaType == "String") + #set ($dictMethod = "string") + #elseif ($javaType == "Boolean") + #set ($dictMethod = "boolean") + #end +#if (!$column.primaryKey)## 忽略主键,不用在表单里 + { + label: '${comment}', + field: '${javaField}', + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 + required: true, + #end + #if ($column.htmlType == "input") + component: 'Input', + #elseif($column.htmlType == "imageUpload")## 图片上传 + component: 'FileUpload', + componentProps: { + fileType: 'image', + maxCount: 1, + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + component: 'FileUpload', + componentProps: { + fileType: 'file', + maxCount: 1, + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + #elseif($column.htmlType == "select")## 下拉框 + component: 'Select', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "checkbox")## 多选框 + component: 'Checkbox', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "radio")## 单选框 + component: 'RadioButtonGroup', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', + }, + #elseif($column.htmlType == "textarea")## 文本域 + component: 'InputTextArea', + #end + }, +#end +#end +#end +] + +export const updateFormSchema: FormSchema[] = [ + { + label: '编号', + field: 'id', + show: false, + component: 'Input', + }, +#foreach($column in $columns) +#if ($column.updateOperation) +#set ($dictType = $column.dictType) +#set ($javaType = $column.javaType) +#set ($javaField = $column.javaField) +#set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set ($comment = $column.columnComment) +#if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + #set ($dictMethod = "number") +#elseif ($javaType == "String") + #set ($dictMethod = "string") +#elseif ($javaType == "Boolean") + #set ($dictMethod = "boolean") +#end + #if (!$column.primaryKey)## 忽略主键,不用在表单里 + { + label: '${comment}', + field: '${javaField}', + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 + required: true, + #end + #if ($column.htmlType == "input") + component: 'Input', + #elseif($column.htmlType == "imageUpload")## 图片上传 + component: 'FileUpload', + componentProps: { + fileType: 'image', + maxCount: 1, + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + component: 'FileUpload', + componentProps: { + fileType: 'file', + maxCount: 1, + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + #elseif($column.htmlType == "select")## 下拉框 + component: 'Select', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "checkbox")## 多选框 + component: 'Checkbox', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "radio")## 单选框 + component: 'RadioButtonGroup', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', + }, + #elseif($column.htmlType == "textarea")## 文本域 + component: 'InputTextArea', + #end + }, + #end +#end +#end +] \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm new file mode 100644 index 0000000..1804365 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm @@ -0,0 +1,58 @@ + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm new file mode 100644 index 0000000..9e59b12 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm @@ -0,0 +1,92 @@ + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg b/win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1447283cdf1b49b51c1204a160e01cb789e957a8 GIT binary patch literal 18385 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 pEwzL`>i*8R__Kv1*C}gmHZq>QI%40h(qzO + + + com.win + win + ${revision} + + 4.0.0 + + win-module-system-api + win-module-system-biz + + win-module-system + pom + + ${project.artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + diff --git a/win-module-system/win-module-system-api/pom.xml b/win-module-system/win-module-system-api/pom.xml new file mode 100644 index 0000000..c4a5363 --- /dev/null +++ b/win-module-system/win-module-system-api/pom.xml @@ -0,0 +1,33 @@ + + + + com.win + win-module-system + ${revision} + + 4.0.0 + win-module-system-api + jar + + ${project.artifactId} + + system 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java new file mode 100644 index 0000000..8287b80 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java @@ -0,0 +1,61 @@ +package com.win.module.system.api.dept; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.api.dept.dto.DeptRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 部门 API 接口 + * + * @author 芋道源码 + */ +public interface DeptApi { + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptRespDTO getDept(Long id); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDeptList(Collection ids); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validateDeptList(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + List list = getDeptList(ids); + return CollectionUtils.convertMap(list, DeptRespDTO::getId); + } + + /** + * 获得指定部门的所有子部门 + * + * @param id 部门编号 + * @return 子部门列表 + */ + List getChildDeptList(Long id); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java new file mode 100644 index 0000000..a2821b6 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java @@ -0,0 +1,39 @@ +package com.win.module.system.api.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.api.dept.dto.PostRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 岗位 API 接口 + * + * @author 芋道源码 + */ +public interface PostApi { + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPostList(Collection ids); + + List getPostList(Collection ids); + + default Map getPostMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return MapUtil.empty(); + } + + List list = getPostList(ids); + return CollectionUtils.convertMap(list, PostRespDTO::getId); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java new file mode 100644 index 0000000..f682b94 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.dept.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 部门 Response DTO + * + * @author 芋道源码 + */ +@Data +public class DeptRespDTO { + + /** + * 部门编号 + */ + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门编号 + */ + private Long parentId; + /** + * 负责人的用户编号 + */ + private Long leaderUserId; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/PostRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/PostRespDTO.java new file mode 100644 index 0000000..5530293 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/PostRespDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.dept.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 岗位 Response DTO + * + * @author 芋道源码 + */ +@Data +public class PostRespDTO { + + /** + * 岗位序号 + */ + private Long id; + /** + * 岗位名称 + */ + private String name; + /** + * 岗位编码 + */ + private String code; + /** + * 岗位排序 + */ + private Integer sort; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java new file mode 100644 index 0000000..df603c3 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java @@ -0,0 +1,81 @@ +package com.win.module.system.api.dict; + +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import com.win.module.system.api.dict.dto.DictDataRespDTO; + +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 字典数据 API 接口 + * + * @author 芋道源码 + */ +public interface DictDataApi { + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validateDictDataList(String dictType, Collection values); + + /** + * 获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + DictDataRespDTO getDictData(String type, String value); + + /** + * 获得指定的字典标签,从缓存中 + * + * @param type 字典类型 + * @param value 字典数据值 + * @return 字典标签 + */ + default String getDictDataLabel(String type, Integer value) { + DictDataRespDTO dictData = getDictData(type, String.valueOf(value)); + if (ObjUtil.isNull(dictData)) { + return StrUtil.EMPTY; + } + return dictData.getLabel(); + } + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @param label 字典数据标签 + * @return 字典数据 + */ + DictDataRespDTO parseDictData(String type, String label); + + /** + * 获得指定字典类型的字典数据列表 + * + * @param dictType 字典类型 + * @return 字典数据列表 + */ + List getDictDataList(String dictType); + + /** + * 获得字典数据标签列表 + * + * @param dictType 字典类型 + * @return 字典数据标签列表 + */ + default List getDictDataLabelList(String dictType) { + List list = getDictDataList(dictType); + return convertList(list, DictDataRespDTO::getLabel); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java new file mode 100644 index 0000000..2920e46 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java @@ -0,0 +1,33 @@ +package com.win.module.system.api.dict.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 字典数据 Response DTO + * + * @author 芋道源码 + */ +@Data +public class DictDataRespDTO { + + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java new file mode 100644 index 0000000..3fd8923 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java @@ -0,0 +1,21 @@ +package com.win.module.system.api.logger; + +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; + +import jakarta.validation.Valid; + +/** + * 登录日志的 API 接口 + * + * @author 芋道源码 + */ +public interface LoginLogApi { + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java new file mode 100644 index 0000000..24eed4e --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java @@ -0,0 +1,42 @@ +package com.win.module.system.api.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.api.logger.dto.OperateLogPageReqDTO; +import com.win.module.system.api.logger.dto.OperateLogRespDTO; +import jakarta.validation.Valid; +import org.springframework.scheduling.annotation.Async; + +/** + * 操作日志 API 接口 + * + * @author 芋道源码 + */ +public interface OperateLogApi { + + /** + * 创建操作日志 + * + * @param createReqDTO 请求 + */ + void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO); + + /** + * 【异步】创建操作日志 + * + * @param createReqDTO 请求 + */ + @Async + default void createOperateLogAsync(OperateLogCreateReqDTO createReqDTO) { + createOperateLog(createReqDTO); + } + + /** + * 获取指定模块的指定数据的操作日志分页 + * + * @param pageReqDTO 请求 + * @return 操作日志分页 + */ + PageResult getOperateLogPage(OperateLogPageReqDTO pageReqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java new file mode 100644 index 0000000..448050d --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java @@ -0,0 +1,62 @@ +package com.win.module.system.api.logger.dto; + +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +/** + * 登录日志创建 Request DTO + * + * @author 芋道源码 + */ +@Data +public class LoginLogCreateReqDTO { + + /** + * 日志类型 + */ + @NotNull(message = "日志类型不能为空") + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + @NotNull(message = "用户类型不能为空") + private Integer userType; + /** + * 用户账号 + * + * 不再强制校验 username 非空,因为 Member 社交登录时,此时暂时没有 username(mobile)! + */ + private String username; + + /** + * 登录结果 + */ + @NotNull(message = "登录结果不能为空") + private Integer result; + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + /** + * 浏览器 UserAgent + * + * 允许空,原因:Job 过期登出时,是无法传递 UserAgent 的 + */ + private String userAgent; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java new file mode 100644 index 0000000..213bf74 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java @@ -0,0 +1,84 @@ +package com.win.module.system.api.logger.dto; + +import com.win.framework.common.enums.UserTypeEnum; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 系统操作日志 Create Request DTO + * + * @author HUIHUI + */ +@Data +public class OperateLogCreateReqDTO { + + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + * + * 关联 {@link UserTypeEnum} + */ + @NotNull(message = "用户类型不能为空") + private Integer userType; + /** + * 操作模块类型 + */ + @NotEmpty(message = "操作模块类型不能为空") + private String type; + /** + * 操作名 + */ + @NotEmpty(message = "操作名不能为空") + private String subType; + /** + * 操作模块业务编号 + */ + @NotNull(message = "操作模块业务编号不能为空") + private Long bizId; + /** + * 操作内容,记录整个操作的明细 + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 + */ + @NotEmpty(message = "操作内容不能为空") + private String action; + /** + * 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ) + * 例如说,记录订单编号,{ orderId: "1"} + */ + private String extra; + + /** + * 请求方法名 + */ + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + /** + * 请求地址 + */ + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotEmpty(message = "浏览器 UA 不能为空") + private String userAgent; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogPageReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogPageReqDTO.java new file mode 100644 index 0000000..07cbfd0 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogPageReqDTO.java @@ -0,0 +1,28 @@ +package com.win.module.system.api.logger.dto; + +import com.win.framework.common.pojo.PageParam; +import lombok.Data; + +/** + * 操作日志分页 Request DTO + * + * @author HUIHUI + */ +@Data +public class OperateLogPageReqDTO extends PageParam { + + /** + * 模块类型 + */ + private String type; + /** + * 模块数据编号 + */ + private Long bizId; + + /** + * 用户编号 + */ + private Long userId; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogRespDTO.java new file mode 100644 index 0000000..1fd9983 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogRespDTO.java @@ -0,0 +1,83 @@ +package com.win.module.system.api.logger.dto; + +import com.fhs.core.trans.anno.Trans; +import com.fhs.core.trans.constant.TransType; +import com.fhs.core.trans.vo.VO; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 系统操作日志 Resp DTO + * + * @author HUIHUI + */ +@Data +public class OperateLogRespDTO implements VO { + + /** + * 日志编号 + */ + private Long id; + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + @Trans(type = TransType.SIMPLE, targetClassName = "com.win.module.system.dal.dataobject.user.AdminUserDO", + fields = "nickname", ref = "userName") + private Long userId; + /** + * 用户名称 + */ + private String userName; + /** + * 用户类型 + */ + private Integer userType; + /** + * 操作模块类型 + */ + private String type; + /** + * 操作名 + */ + private String subType; + /** + * 操作模块业务编号 + */ + private Long bizId; + /** + * 操作内容 + */ + private String action; + /** + * 拓展字段 + */ + private String extra; + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 请求地址 + */ + private String requestUrl; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java new file mode 100644 index 0000000..a5cf532 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.mail; + +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; + +import jakarta.validation.Valid; + +/** + * 邮箱发送 API 接口 + * + * @author 芋道源码 + */ +public interface MailSendApi { + + /** + * 发送单条邮箱给 Admin 用户 + * + * 在 mail 为空时,使用 userId 加载对应 Admin 的邮箱 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleMailToAdmin(@Valid MailSendSingleToUserReqDTO reqDTO); + + /** + * 发送单条邮箱给 Member 用户 + * + * 在 mail 为空时,使用 userId 加载对应 Member 的邮箱 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleMailToMember(@Valid MailSendSingleToUserReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java new file mode 100644 index 0000000..e31e524 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.mail.dto; + +import lombok.Data; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; +import java.util.Map; + +/** + * 邮件发送 Request DTO + * + * @author wangjingqi + */ +@Data +public class MailSendSingleToUserReqDTO { + + /** + * 用户编号 + */ + private Long userId; + /** + * 邮箱 + */ + @Email + private String mail; + + /** + * 邮件模板编号 + */ + @NotNull(message = "邮件模板编号不能为空") + private String templateCode; + /** + * 邮件模板参数 + */ + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java new file mode 100644 index 0000000..6126ada --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java @@ -0,0 +1,30 @@ +package com.win.module.system.api.notify; + +import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; + +import jakarta.validation.Valid; + +/** + * 站内信发送 API 接口 + * + * @author xrcoder + */ +public interface NotifyMessageSendApi { + + /** + * 发送单条站内信给 Admin 用户 + * + * @param reqDTO 发送请求 + * @return 发送消息 ID + */ + Long sendSingleMessageToAdmin(@Valid NotifySendSingleToUserReqDTO reqDTO); + + /** + * 发送单条站内信给 Member 用户 + * + * @param reqDTO 发送请求 + * @return 发送消息 ID + */ + Long sendSingleMessageToMember(@Valid NotifySendSingleToUserReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java new file mode 100644 index 0000000..54e0b93 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java @@ -0,0 +1,33 @@ +package com.win.module.system.api.notify.dto; + +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Map; + +/** + * 站内信发送给 Admin 或者 Member 用户 + * + * @author xrcoder + */ +@Data +public class NotifySendSingleToUserReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + + /** + * 站内信模板编号 + */ + @NotEmpty(message = "站内信模板编号不能为空") + private String templateCode; + + /** + * 站内信模板参数 + */ + private Map templateParams; +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java new file mode 100644 index 0000000..06f6f45 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.notify.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Data +public class NotifyTemplateReqDTO { + + @NotEmpty(message = "模版名称不能为空") + private String name; + + @NotNull(message = "模版编码不能为空") + private String code; + + @NotNull(message = "模版类型不能为空") + private Integer type; + + @NotEmpty(message = "发送人名称不能为空") + private String nickname; + + @NotEmpty(message = "模版内容不能为空") + private String content; + + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") + private Integer status; + + private String remark; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java new file mode 100644 index 0000000..0fac7b5 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java @@ -0,0 +1,49 @@ +package com.win.module.system.api.oauth2; + +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; + +import jakarta.validation.Valid; + +/** + * OAuth2.0 Token API 接口 + * + * @author 芋道源码 + */ +public interface OAuth2TokenApi { + + /** + * 创建访问令牌 + * + * @param reqDTO 访问令牌的创建信息 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO createAccessToken(@Valid OAuth2AccessTokenCreateReqDTO reqDTO); + + /** + * 校验访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken); + + /** + * 移除访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO removeAccessToken(String accessToken); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java new file mode 100644 index 0000000..c344585 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java @@ -0,0 +1,43 @@ +package com.win.module.system.api.oauth2.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * OAuth2.0 访问令牌的校验 Response DTO + * + * @author 芋道源码 + */ +@Data +public class OAuth2AccessTokenCheckRespDTO implements Serializable { + + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 用户信息 + */ + private Map userInfo; + /** + * 租户编号 + */ + private Long tenantId; + /** + * 授权范围的数组 + */ + private List scopes; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java new file mode 100644 index 0000000..732803a --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java @@ -0,0 +1,40 @@ +package com.win.module.system.api.oauth2.dto; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.validation.InEnum; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * OAuth2.0 访问令牌创建 Request DTO + * + * @author 芋道源码 + */ +@Data +public class OAuth2AccessTokenCreateReqDTO implements Serializable { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @NotNull(message = "用户类型不能为空") + @InEnum(value = UserTypeEnum.class, message = "用户类型必须是 {value}") + private Integer userType; + /** + * 客户端编号 + */ + @NotNull(message = "客户端编号不能为空") + private String clientId; + /** + * 授权范围 + */ + private List scopes; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java new file mode 100644 index 0000000..5d53659 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java @@ -0,0 +1,39 @@ +package com.win.module.system.api.oauth2.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * OAuth2.0 访问令牌的信息 Response DTO + * + * @author 芋道源码 + */ +@Data +@Accessors(chain = true) +public class OAuth2AccessTokenRespDTO implements Serializable { + + /** + * 访问令牌 + */ + private String accessToken; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/package-info.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/package-info.java new file mode 100644 index 0000000..0723902 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.system.api; diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java new file mode 100644 index 0000000..dfe5b11 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java @@ -0,0 +1,49 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; + +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 接口 + * + * @author 芋道源码 + */ +public interface PermissionApi { + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); + + /** + * 判断是否有权限,任一一个即可 + * + * @param userId 用户编号 + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(Long userId, String... permissions); + + /** + * 判断是否有角色,任一一个即可 + * + * @param userId 用户编号 + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(Long userId, String... roles); + + /** + * 获得登陆用户的部门数据权限 + * + * @param userId 用户编号 + * @return 部门数据权限 + */ + DeptDataPermissionRespDTO getDeptDataPermission(Long userId); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java new file mode 100644 index 0000000..f1f6fa8 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java @@ -0,0 +1,21 @@ +package com.win.module.system.api.permission; + +import java.util.Collection; + +/** + * 角色 API 接口 + * + * @author 芋道源码 + */ +public interface RoleApi { + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoleList(Collection ids); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java new file mode 100644 index 0000000..f6675d1 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java @@ -0,0 +1,35 @@ +package com.win.module.system.api.permission.dto; + +import lombok.Data; + +import java.util.HashSet; +import java.util.Set; + +/** + * 部门的数据权限 Response DTO + * + * @author 芋道源码 + */ +@Data +public class DeptDataPermissionRespDTO { + + /** + * 是否可查看全部数据 + */ + private Boolean all; + /** + * 是否可查看自己的数据 + */ + private Boolean self; + /** + * 可查看的部门编号数组 + */ + private Set deptIds; + + public DeptDataPermissionRespDTO() { + this.all = false; + this.self = false; + this.deptIds = new HashSet<>(); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java new file mode 100644 index 0000000..df64c82 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java @@ -0,0 +1,40 @@ +package com.win.module.system.api.sms; + +import com.win.framework.common.exception.ServiceException; +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; + +import jakarta.validation.Valid; + +/** + * 短信验证码 API 接口 + * + * @author 芋道源码 + */ +public interface SmsCodeApi { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java new file mode 100644 index 0000000..e4617b9 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.sms; + +import com.win.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; + +import jakarta.validation.Valid; + +/** + * 短信发送 API 接口 + * + * @author 芋道源码 + */ +public interface SmsSendApi { + + /** + * 发送单条短信给 Admin 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Admin 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(@Valid SmsSendSingleToUserReqDTO reqDTO); + + /** + * 发送单条短信给 Member 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Member 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToMember(@Valid SmsSendSingleToUserReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java new file mode 100644 index 0000000..ef83e5d --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.sms.dto.code; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * 短信验证码的发送 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SmsCodeSendReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 发送 IP + */ + @NotEmpty(message = "发送 IP 不能为空") + private String createIp; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java new file mode 100644 index 0000000..74dbb8a --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java @@ -0,0 +1,42 @@ +package com.win.module.system.api.sms.dto.code; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * 短信验证码的使用 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SmsCodeUseReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + /** + * 使用 IP + */ + @NotEmpty(message = "使用 IP 不能为空") + private String usedIp; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java new file mode 100644 index 0000000..9b0bf8f --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.sms.dto.code; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * 短信验证码的校验 Request DTO + * + * @author 芋道源码 + */ +@Data +public class SmsCodeValidateReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java new file mode 100644 index 0000000..f857c6c --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java @@ -0,0 +1,36 @@ +package com.win.module.system.api.sms.dto.send; + +import com.win.framework.common.validation.Mobile; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import java.util.Map; + +/** + * 短信发送给 Admin 或者 Member 用户 + * + * @author 芋道源码 + */ +@Data +public class SmsSendSingleToUserReqDTO { + + /** + * 用户编号 + */ + private Long userId; + /** + * 手机号 + */ + @Mobile + private String mobile; + /** + * 短信模板编号 + */ + @NotEmpty(message = "短信模板编号不能为空") + private String templateCode; + /** + * 短信模板参数 + */ + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialClientApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialClientApi.java new file mode 100644 index 0000000..c590287 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialClientApi.java @@ -0,0 +1,68 @@ +package com.win.module.system.api.social; + +import com.win.module.system.api.social.dto.*; +import com.win.module.system.enums.social.SocialTypeEnum; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * 社交应用的 API 接口 + * + * @author 芋道源码 + */ +public interface SocialClientApi { + + /** + * 获得社交平台的授权 URL + * + * @param socialType 社交平台的类型 {@link SocialTypeEnum} + * @param userType 用户类型 + * @param redirectUri 重定向 URL + * @return 社交平台的授权 URL + */ + String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri); + + /** + * 创建微信公众号 JS SDK 初始化所需的签名 + * + * @param userType 用户类型 + * @param url 访问的 URL 地址 + * @return 签名 + */ + SocialWxJsapiSignatureRespDTO createWxMpJsapiSignature(Integer userType, String url); + + //======================= 微信小程序独有 ======================= + + /** + * 获得微信小程序的手机信息 + * + * @param userType 用户类型 + * @param phoneCode 手机授权码 + * @return 手机信息 + */ + SocialWxPhoneNumberInfoRespDTO getWxMaPhoneNumberInfo(Integer userType, String phoneCode); + + /** + * 获得小程序二维码 + * + * @param reqVO 请求信息 + * @return 小程序二维码 + */ + byte[] getWxaQrcode(@Valid SocialWxQrcodeReqDTO reqVO); + + /** + * 获得微信小程订阅模板 + * + * @return 小程序订阅消息模版 + */ + List getWxaSubscribeTemplateList(Integer userType); + + /** + * 发送微信小程序订阅消息 + * + * @param reqDTO 请求 + */ + void sendWxaSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialUserApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialUserApi.java new file mode 100644 index 0000000..9e602c7 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/SocialUserApi.java @@ -0,0 +1,55 @@ +package com.win.module.system.api.social; + +import com.win.framework.common.exception.ServiceException; +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.api.social.dto.SocialUserRespDTO; +import com.win.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.win.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import jakarta.validation.Valid; + +/** + * 社交用户的 API 接口 + * + * @author 芋道源码 + */ +public interface SocialUserApi { + + /** + * 绑定社交用户 + * + * @param reqDTO 绑定信息 + * @return 社交用户 openid + */ + String bindSocialUser(@Valid SocialUserBindReqDTO reqDTO); + + /** + * 取消绑定社交用户 + * + * @param reqDTO 解绑 + */ + void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO); + + /** + * 获得社交用户,基于 userId + * + * @param userType 用户类型 + * @param userId 用户编号 + * @param socialType 社交平台的类型 + * @return 社交用户 + */ + SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType); + + /** + * 获得社交用户 + * + * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 + * + * @param userType 用户类型 + * @param socialType 社交平台的类型 + * @param code 授权码 + * @param state state + * @return 社交用户 + */ + SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserBindReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserBindReqDTO.java new file mode 100644 index 0000000..b250696 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserBindReqDTO.java @@ -0,0 +1,52 @@ +package com.win.module.system.api.social.dto; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.social.SocialTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * 取消绑定社交用户 Request DTO + * + * @author 芋道源码 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SocialUserBindReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @InEnum(UserTypeEnum.class) + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 社交平台的类型 + */ + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer socialType; + /** + * 授权码 + */ + @NotEmpty(message = "授权码不能为空") + private String code; + /** + * state + */ + @NotNull(message = "state 不能为空") + private String state; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserRespDTO.java new file mode 100644 index 0000000..10ffb18 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserRespDTO.java @@ -0,0 +1,35 @@ +package com.win.module.system.api.social.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 社交用户 Response DTO + * + * @author 芋道源码 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SocialUserRespDTO { + + /** + * 社交用户的 openid + */ + private String openid; + /** + * 社交用户的昵称 + */ + private String nickname; + /** + * 社交用户的头像 + */ + private String avatar; + + /** + * 关联的用户编号 + */ + private Long userId; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserUnbindReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserUnbindReqDTO.java new file mode 100644 index 0000000..1c46ddd --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialUserUnbindReqDTO.java @@ -0,0 +1,48 @@ +package com.win.module.system.api.social.dto; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.social.SocialTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.NoArgsConstructor; + +/** + * 社交绑定 Request DTO,使用 code 授权码 + * + * @author 芋道源码 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SocialUserUnbindReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @InEnum(UserTypeEnum.class) + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 社交平台的类型 + */ + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer socialType; + + /** + * 社交平台的 openid + */ + @NotEmpty(message = "社交平台的 openid 不能为空") + private String openid; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java new file mode 100644 index 0000000..2af5de4 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.social.dto; + +import lombok.Data; + +/** + * 微信公众号 JSAPI 签名 Response DTO + * + * @author 芋道源码 + */ +@Data +public class SocialWxJsapiSignatureRespDTO { + + /** + * 微信公众号的 appId + */ + private String appId; + /** + * 匿名串 + */ + private String nonceStr; + /** + * 时间戳 + */ + private Long timestamp; + /** + * URL + */ + private String url; + /** + * 签名 + */ + private String signature; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java new file mode 100644 index 0000000..fa34332 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java @@ -0,0 +1,27 @@ +package com.win.module.system.api.social.dto; + +import lombok.Data; + +/** + * 微信小程序的手机信息 Response DTO + * + * @author 芋道源码 + */ +@Data +public class SocialWxPhoneNumberInfoRespDTO { + + /** + * 用户绑定的手机号(国外手机号会有区号) + */ + private String phoneNumber; + + /** + * 没有区号的手机号 + */ + private String purePhoneNumber; + /** + * 区号 + */ + private String countryCode; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxQrcodeReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxQrcodeReqDTO.java new file mode 100644 index 0000000..e237853 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxQrcodeReqDTO.java @@ -0,0 +1,66 @@ +package com.win.module.system.api.social.dto; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +/** + * 获取小程序码 Request DTO + * + * @author HUIHUI + * @see 获取不限制的小程序码 + */ +@Data +public class SocialWxQrcodeReqDTO { + + /** + * 页面路径不能携带参数(参数请放在scene字段里) + */ + public static final String SCENE = ""; + /** + * 二维码宽度 + */ + public static final Integer WIDTH = 430; + /** + * 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调 + */ + public static final Boolean AUTO_COLOR = true; + /** + * 检查 page 是否存在 + */ + public static final Boolean CHECK_PATH = true; + /** + * 是否需要透明底色 + * + * hyaline 为 true 时,生成透明底色的小程序码 + */ + public static final Boolean HYALINE = true; + + /** + * 场景 + */ + @NotEmpty(message = "场景不能为空") + private String scene; + /** + * 页面路径 + */ + @NotEmpty(message = "页面路径不能为空") + private String path; + /** + * 二维码宽度 + */ + private Integer width; + + /** + * 是否需要透明底色 + */ + private Boolean autoColor; + /** + * 是否检查 page 是否存在 + */ + private Boolean checkPath; + /** + * 是否需要透明底色 + */ + private Boolean hyaline; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java new file mode 100644 index 0000000..e457906 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java @@ -0,0 +1,61 @@ +package com.win.module.system.api.social.dto; + +import com.win.framework.common.enums.UserTypeEnum; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * 微信小程序订阅消息发送 Request DTO + * + * @author HUIHUI + */ +@Data +public class SocialWxaSubscribeMessageSendReqDTO { + + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 编号 + * 关联 AdminUserDO 的 id 编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + * + * 关联 {@link UserTypeEnum} + */ + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 消息模版标题 + */ + @NotEmpty(message = "消息模版标题不能为空") + private String templateTitle; + + /** + * 点击模板卡片后的跳转页面,仅限本小程序内的页面 + * + * 支持带参数,(示例 index?foo=bar )。该字段不填则模板无跳转。 + */ + private String page; + + /** + * 模板内容的参数 + */ + private Map messages; + + public SocialWxaSubscribeMessageSendReqDTO addMessage(String key, String value) { + if (messages == null) { + messages = new HashMap<>(); + } + messages.put(key, value); + return this; + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java new file mode 100644 index 0000000..bbd26ff --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java @@ -0,0 +1,42 @@ +package com.win.module.system.api.social.dto; + +import lombok.Data; + + +/** + * 小程序订阅消息模版 Response DTO + * + * @author HUIHUI + */ +@Data +public class SocialWxaSubscribeTemplateRespDTO { + + /** + * 模版编号 + */ + private String id; + + /** + * 模版标题 + */ + private String title; + + /** + * 模版内容 + */ + private String content; + + /** + * 模板内容示例 + */ + private String example; + + /** + * 模版类型 + * + * 2:为一次性订阅 + * 3:为长期订阅 + */ + private Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java new file mode 100644 index 0000000..fded044 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java @@ -0,0 +1,26 @@ +package com.win.module.system.api.tenant; + +import java.util.List; + +/** + * 多租户的 API 接口 + * + * @author 芋道源码 + */ +public interface TenantApi { + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIdList(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validateTenant(Long id); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java new file mode 100644 index 0000000..c50ef9d --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java @@ -0,0 +1,89 @@ +package com.win.module.system.api.user; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.api.user.dto.AdminUserRespDTO; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Admin 用户 API 接口 + * + * @author 芋道源码 + */ +public interface AdminUserApi { + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserRespDTO getUser(Long id); + + /** + * 通过用户 ID 查询用户下属 + * + * @param id 用户编号 + * @return 用户下属用户列表 + */ + List getUserListBySubordinate(Long id); + + /** + * 通过用户 ID 查询用户们 + * + * @param ids 用户 ID 们 + * @return 用户对象信息 + */ + List getUserList(Collection ids); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUserListByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUserListByPostIds(Collection postIds); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + List users = getUserList(ids); + return CollectionUtils.convertMap(users, AdminUserRespDTO::getId); + } + + /** + * 校验用户是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param id 用户编号 + */ + default void validateUser(Long id) { + validateUserList(Collections.singleton(id)); + } + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validateUserList(Collection ids); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java new file mode 100644 index 0000000..df8cdf9 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java @@ -0,0 +1,48 @@ +package com.win.module.system.api.user.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +import java.util.Set; + +/** + * Admin 用户 Response DTO + * + * @author 芋道源码 + */ +@Data +public class AdminUserRespDTO { + + /** + * 用户ID + */ + private Long id; + /** + * 用户昵称 + */ + private String nickname; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + + /** + * 部门ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + private Set postIds; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户头像 + */ + private String avatar; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java new file mode 100644 index 0000000..547122c --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java @@ -0,0 +1,26 @@ +package com.win.module.system.enums; + +/** + * System 字典类型的枚举类 + * + * @author 芋道源码 + */ +public interface DictTypeConstants { + + String USER_TYPE = "user_type"; // 用户类型 + String COMMON_STATUS = "common_status"; // 系统状态 + + // ========== SYSTEM 模块 ========== + + String USER_SEX = "system_user_sex"; // 用户性别 + String DATA_SCOPE = "system_data_scope"; // 数据范围 + + String LOGIN_TYPE = "system_login_type"; // 登录日志的类型 + String LOGIN_RESULT = "system_login_result"; // 登录结果 + + String SMS_CHANNEL_CODE = "system_sms_channel_code"; // 短信渠道编码 + String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型 + String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 + String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..db46eae --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java @@ -0,0 +1,166 @@ +package com.win.module.system.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * System 错误码枚举类 + * + * system 系统,使用 1-002-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== AUTH 模块 1-002-000-000 ========== + ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1_002_000_000, "登录失败,账号密码不正确"); + ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1_002_000_001, "登录失败,账号被禁用"); + ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_004, "验证码不正确,原因:{}"); + ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); + ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); + ErrorCode AUTH_REGISTER_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_008, "验证码不正确,原因:{}"); + + // ========== 菜单模块 1-002-001-000 ========== + ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单"); + ErrorCode MENU_PARENT_NOT_EXISTS = new ErrorCode(1_002_001_001, "父菜单不存在"); + ErrorCode MENU_PARENT_ERROR = new ErrorCode(1_002_001_002, "不能设置自己为父菜单"); + ErrorCode MENU_NOT_EXISTS = new ErrorCode(1_002_001_003, "菜单不存在"); + ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1_002_001_004, "存在子菜单,无法删除"); + ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1_002_001_005, "父菜单的类型必须是目录或者菜单"); + + // ========== 角色模块 1-002-002-000 ========== + ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1_002_002_000, "角色不存在"); + ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1_002_002_001, "已经存在名为【{}】的角色"); + ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1_002_002_002, "已经存在标识为【{}】的角色"); + ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1_002_002_003, "不能操作类型为系统内置的角色"); + ErrorCode ROLE_IS_DISABLE = new ErrorCode(1_002_002_004, "名字为【{}】的角色已被禁用"); + ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "标识【{}】不能使用"); + + // ========== 用户模块 1-002-003-000 ========== + ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在"); + ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1_002_003_001, "手机号已经存在"); + ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1_002_003_002, "邮箱已经存在"); + ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_003_003, "用户不存在"); + ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_003_004, "导入用户数据不能为空!"); + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1_002_003_005, "用户密码校验失败"); + ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); + ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "创建用户失败,原因:超过租户最大租户配额({})!"); + ErrorCode USER_IMPORT_INIT_PASSWORD = new ErrorCode(1_002_003_009, "初始密码不能为空"); + + // ========== 部门模块 1-002-004-000 ========== + ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1_002_004_000, "已经存在该名字的部门"); + ErrorCode DEPT_PARENT_NOT_EXITS = new ErrorCode(1_002_004_001,"父级部门不存在"); + ErrorCode DEPT_NOT_FOUND = new ErrorCode(1_002_004_002, "当前部门不存在"); + ErrorCode DEPT_EXITS_CHILDREN = new ErrorCode(1_002_004_003, "存在子部门,无法删除"); + ErrorCode DEPT_PARENT_ERROR = new ErrorCode(1_002_004_004, "不能设置自己为父部门"); + ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1_002_004_006, "部门({})不处于开启状态,不允许选择"); + ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1_002_004_007, "不能设置自己的子部门为父部门"); + + // ========== 岗位模块 1-002-005-000 ========== + ErrorCode POST_NOT_FOUND = new ErrorCode(1_002_005_000, "当前岗位不存在"); + ErrorCode POST_NOT_ENABLE = new ErrorCode(1_002_005_001, "岗位({}) 不处于开启状态,不允许选择"); + ErrorCode POST_NAME_DUPLICATE = new ErrorCode(1_002_005_002, "已经存在该名字的岗位"); + ErrorCode POST_CODE_DUPLICATE = new ErrorCode(1_002_005_003, "已经存在该标识的岗位"); + + // ========== 字典类型 1-002-006-000 ========== + ErrorCode DICT_TYPE_NOT_EXISTS = new ErrorCode(1_002_006_001, "当前字典类型不存在"); + ErrorCode DICT_TYPE_NOT_ENABLE = new ErrorCode(1_002_006_002, "字典类型不处于开启状态,不允许选择"); + ErrorCode DICT_TYPE_NAME_DUPLICATE = new ErrorCode(1_002_006_003, "已经存在该名字的字典类型"); + ErrorCode DICT_TYPE_TYPE_DUPLICATE = new ErrorCode(1_002_006_004, "已经存在该类型的字典类型"); + ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1_002_006_005, "无法删除,该字典类型还有字典数据"); + + // ========== 字典数据 1-002-007-000 ========== + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1_002_007_001, "当前字典数据不存在"); + ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1_002_007_002, "字典数据({})不处于开启状态,不允许选择"); + ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1_002_007_003, "已经存在该值的字典数据"); + + // ========== 通知公告 1-002-008-000 ========== + ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1_002_008_001, "当前通知公告不存在"); + + // ========== 短信渠道 1-002-011-000 ========== + ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1_002_011_000, "短信渠道不存在"); + ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1_002_011_001, "短信渠道不处于开启状态,不允许选择"); + ErrorCode SMS_CHANNEL_HAS_CHILDREN = new ErrorCode(1_002_011_002, "无法删除,该短信渠道还有短信模板"); + + // ========== 短信模板 1-002-012-000 ========== + ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_012_000, "短信模板不存在"); + ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_002_012_001, "已经存在编码为【{}】的短信模板"); + ErrorCode SMS_TEMPLATE_API_ERROR = new ErrorCode(1_002_012_002, "短信 API 模板调用失败,原因是:{}"); + ErrorCode SMS_TEMPLATE_API_AUDIT_CHECKING = new ErrorCode(1_002_012_003, "短信 API 模版无法使用,原因:审批中"); + ErrorCode SMS_TEMPLATE_API_AUDIT_FAIL = new ErrorCode(1_002_012_004, "短信 API 模版无法使用,原因:审批不通过,{}"); + ErrorCode SMS_TEMPLATE_API_NOT_FOUND = new ErrorCode(1_002_012_005, "短信 API 模版无法使用,原因:模版不存在"); + + // ========== 短信发送 1-002-013-000 ========== + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1_002_013_000, "手机号不存在"); + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_013_001, "模板参数({})缺失"); + ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_013_002, "短信模板不存在"); + + // ========== 短信验证码 1-002-014-000 ========== + ErrorCode SMS_CODE_NOT_FOUND = new ErrorCode(1_002_014_000, "验证码不存在"); + ErrorCode SMS_CODE_EXPIRED = new ErrorCode(1_002_014_001, "验证码已过期"); + ErrorCode SMS_CODE_USED = new ErrorCode(1_002_014_002, "验证码已使用"); + ErrorCode SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1_002_014_004, "超过每日短信发送数量"); + ErrorCode SMS_CODE_SEND_TOO_FAST = new ErrorCode(1_002_014_005, "短信发送过于频繁"); + + // ========== 租户信息 1-002-015-000 ========== + ErrorCode TENANT_NOT_EXISTS = new ErrorCode(1_002_015_000, "租户不存在"); + ErrorCode TENANT_DISABLE = new ErrorCode(1_002_015_001, "名字为【{}】的租户已被禁用"); + ErrorCode TENANT_EXPIRE = new ErrorCode(1_002_015_002, "名字为【{}】的租户已过期"); + ErrorCode TENANT_CAN_NOT_UPDATE_SYSTEM = new ErrorCode(1_002_015_003, "系统租户不能进行修改、删除等操作!"); + ErrorCode TENANT_NAME_DUPLICATE = new ErrorCode(1_002_015_004, "名字为【{}】的租户已存在"); + ErrorCode TENANT_WEBSITE_DUPLICATE = new ErrorCode(1_002_015_005, "域名为【{}】的租户已存在"); + + // ========== 租户套餐 1-002-016-000 ========== + ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1_002_016_000, "租户套餐不存在"); + ErrorCode TENANT_PACKAGE_USED = new ErrorCode(1_002_016_001, "租户正在使用该套餐,请给租户重新设置套餐后再尝试删除"); + ErrorCode TENANT_PACKAGE_DISABLE = new ErrorCode(1_002_016_002, "名字为【{}】的租户套餐已被禁用"); + + // ========== 社交用户 1-002-018-000 ========== + ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1_002_018_000, "社交授权失败,原因是:{}"); + ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1_002_018_001, "社交授权失败,找不到对应的用户"); + + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败"); + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败"); + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败"); + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR = new ErrorCode(1_002_018_203, "发送小程序订阅消息失败"); + ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在"); + ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置"); + + + // ========== OAuth2 客户端 1-002-020-000 ========= + ErrorCode OAUTH2_CLIENT_NOT_EXISTS = new ErrorCode(1_002_020_000, "OAuth2 客户端不存在"); + ErrorCode OAUTH2_CLIENT_EXISTS = new ErrorCode(1_002_020_001, "OAuth2 客户端编号已存在"); + ErrorCode OAUTH2_CLIENT_DISABLE = new ErrorCode(1_002_020_002, "OAuth2 客户端已禁用"); + ErrorCode OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS = new ErrorCode(1_002_020_003, "不支持该授权类型"); + ErrorCode OAUTH2_CLIENT_SCOPE_OVER = new ErrorCode(1_002_020_004, "授权范围过大"); + ErrorCode OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH = new ErrorCode(1_002_020_005, "无效 redirect_uri: {}"); + ErrorCode OAUTH2_CLIENT_CLIENT_SECRET_ERROR = new ErrorCode(1_002_020_006, "无效 client_secret: {}"); + + // ========== OAuth2 授权 1-002-021-000 ========= + ErrorCode OAUTH2_GRANT_CLIENT_ID_MISMATCH = new ErrorCode(1_002_021_000, "client_id 不匹配"); + ErrorCode OAUTH2_GRANT_REDIRECT_URI_MISMATCH = new ErrorCode(1_002_021_001, "redirect_uri 不匹配"); + ErrorCode OAUTH2_GRANT_STATE_MISMATCH = new ErrorCode(1_002_021_002, "state 不匹配"); + + // ========== OAuth2 授权 1-002-022-000 ========= + ErrorCode OAUTH2_CODE_NOT_EXISTS = new ErrorCode(1_002_022_000, "code 不存在"); + ErrorCode OAUTH2_CODE_EXPIRE = new ErrorCode(1_002_022_001, "code 已过期"); + + // ========== 邮箱账号 1-002-023-000 ========== + ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1_002_023_000, "邮箱账号不存在"); + ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1_002_023_001, "无法删除,该邮箱账号还有邮件模板"); + + // ========== 邮件模版 1-002-024-000 ========== + ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_024_000, "邮件模版不存在"); + ErrorCode MAIL_TEMPLATE_CODE_EXISTS = new ErrorCode(1_002_024_001, "邮件模版 code({}) 已存在"); + + // ========== 邮件发送 1-002-025-000 ========== + ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_025_000, "模板参数({})缺失"); + ErrorCode MAIL_SEND_MAIL_NOT_EXISTS = new ErrorCode(1_002_025_001, "邮箱不存在"); + + // ========== 站内信模版 1-002-026-000 ========== + ErrorCode NOTIFY_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_026_000, "站内信模版不存在"); + ErrorCode NOTIFY_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_002_026_001, "已经存在编码为【{}】的站内信模板"); + + // ========== 站内信模版 1-002-027-000 ========== + + // ========== 站内信发送 1-002-028-000 ========== + ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失"); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/LogRecordConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/LogRecordConstants.java new file mode 100644 index 0000000..3309b2e --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/LogRecordConstants.java @@ -0,0 +1,33 @@ +package com.win.module.system.enums; + +/** + * System 操作日志枚举 + * 目的:统一管理,也减少 Service 里各种“复杂”字符串 + * + * @author 芋道源码 + */ +public interface LogRecordConstants { + + // ======================= SYSTEM_USER 用户 ======================= + + String SYSTEM_USER_TYPE = "SYSTEM 用户"; + String SYSTEM_USER_CREATE_SUB_TYPE = "创建用户"; + String SYSTEM_USER_CREATE_SUCCESS = "创建了用户【{{#user.nickname}}】"; + String SYSTEM_USER_UPDATE_SUB_TYPE = "更新用户"; + String SYSTEM_USER_UPDATE_SUCCESS = "更新了用户【{{#user.nickname}}】: {_DIFF{#updateReqVO}}"; + String SYSTEM_USER_DELETE_SUB_TYPE = "删除用户"; + String SYSTEM_USER_DELETE_SUCCESS = "删除了用户【{{#user.nickname}}】"; + String SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE = "重置用户密码"; + String SYSTEM_USER_UPDATE_PASSWORD_SUCCESS = "将用户【{{#user.nickname}}】的密码从【{{#user.password}}】重置为【{{#newPassword}}】"; + + // ======================= SYSTEM_ROLE 角色 ======================= + + String SYSTEM_ROLE_TYPE = "SYSTEM 角色"; + String SYSTEM_ROLE_CREATE_SUB_TYPE = "创建角色"; + String SYSTEM_ROLE_CREATE_SUCCESS = "创建了角色【{{#role.name}}】"; + String SYSTEM_ROLE_UPDATE_SUB_TYPE = "更新角色"; + String SYSTEM_ROLE_UPDATE_SUCCESS = "更新了角色【{{#role.name}}】: {_DIFF{#updateReqVO}}"; + String SYSTEM_ROLE_DELETE_SUB_TYPE = "删除角色"; + String SYSTEM_ROLE_DELETE_SUCCESS = "删除了角色【{{#role.name}}】"; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java new file mode 100644 index 0000000..2011776 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java @@ -0,0 +1,27 @@ +package com.win.module.system.enums.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 性别的枚举值 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SexEnum { + + /** 男 */ + MALE(1), + /** 女 */ + FEMALE(2), + /* 未知 */ + UNKNOWN(0); + + /** + * 性别 + */ + private final Integer sex; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java new file mode 100644 index 0000000..cd041ef --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java @@ -0,0 +1,27 @@ +package com.win.module.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录日志的类型枚举 + */ +@Getter +@AllArgsConstructor +public enum LoginLogTypeEnum { + + LOGIN_USERNAME(100), // 使用账号登录 + LOGIN_SOCIAL(101), // 使用社交登录 + LOGIN_MOBILE(103), // 使用手机登陆 + LOGIN_SMS(104), // 使用短信登陆 + + LOGOUT_SELF(200), // 自己主动登出 + LOGOUT_DELETE(202), // 强制退出 + ; + + /** + * 日志类型 + */ + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java new file mode 100644 index 0000000..8248e4d --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java @@ -0,0 +1,26 @@ +package com.win.module.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录结果的枚举类 + */ +@Getter +@AllArgsConstructor +public enum LoginResultEnum { + + SUCCESS(0), // 成功 + BAD_CREDENTIALS(10), // 账号或密码不正确 + USER_DISABLED(20), // 用户被禁用 + CAPTCHA_NOT_FOUND(30), // 图片验证码不存在 + CAPTCHA_CODE_ERROR(31), // 图片验证码不正确 + + ; + + /** + * 结果 + */ + private final Integer result; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java new file mode 100644 index 0000000..8dad6a4 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java @@ -0,0 +1,24 @@ +package com.win.module.system.enums.mail; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 邮件的发送状态枚举 + * + * @author wangjingyi + * @since 2022/4/10 13:39 + */ +@Getter +@AllArgsConstructor +public enum MailSendStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 发送成功 + FAILURE(20), // 发送失败 + IGNORE(30), // 忽略,即不发送 + ; + + private final int status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java new file mode 100644 index 0000000..a320e2f --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java @@ -0,0 +1,23 @@ +package com.win.module.system.enums.notice; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知类型 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum NoticeTypeEnum { + + NOTICE(1), + ANNOUNCEMENT(2); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java new file mode 100644 index 0000000..50fcb96 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java @@ -0,0 +1,26 @@ +package com.win.module.system.enums.notify; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知模板类型枚举 + * + * @author HUIHUI + */ +@Getter +@AllArgsConstructor +public enum NotifyTemplateTypeEnum { + + /** + * 系统消息 + */ + SYSTEM_MESSAGE(2), + /** + * 通知消息 + */ + NOTIFICATION_MESSAGE(1); + + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java new file mode 100644 index 0000000..64a4bc6 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java @@ -0,0 +1,12 @@ +package com.win.module.system.enums.oauth2; + +/** + * OAuth2.0 客户端的通用枚举 + * + * @author 芋道源码 + */ +public interface OAuth2ClientConstants { + + String CLIENT_ID_DEFAULT = "default"; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java new file mode 100644 index 0000000..a5fbb89 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java @@ -0,0 +1,29 @@ +package com.win.module.system.enums.oauth2; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * OAuth2 授权类型(模式)的枚举 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum OAuth2GrantTypeEnum { + + PASSWORD("password"), // 密码模式 + AUTHORIZATION_CODE("authorization_code"), // 授权码模式 + IMPLICIT("implicit"), // 简化模式 + CLIENT_CREDENTIALS("client_credentials"), // 客户端模式 + REFRESH_TOKEN("refresh_token"), // 刷新模式 + ; + + private final String grantType; + + public static OAuth2GrantTypeEnum getByGrantType(String grantType) { + return ArrayUtil.firstMatch(o -> o.getGrantType().equals(grantType), values()); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java new file mode 100644 index 0000000..cd4d1ad --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java @@ -0,0 +1,40 @@ +package com.win.module.system.enums.permission; + +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 数据范围枚举类 + * + * 用于实现数据级别的权限 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum DataScopeEnum implements IntArrayValuable { + + ALL(1), // 全部数据权限 + + DEPT_CUSTOM(2), // 指定部门数据权限 + DEPT_ONLY(3), // 部门数据权限 + DEPT_AND_CHILD(4), // 部门及以下数据权限 + + SELF(5); // 仅本人数据权限 + + /** + * 范围 + */ + private final Integer scope; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DataScopeEnum::getScope).toArray(); + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java new file mode 100644 index 0000000..e812c94 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java @@ -0,0 +1,25 @@ +package com.win.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单类型枚举类 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MenuTypeEnum { + + DIR(1), // 目录 + MENU(2), // 菜单 + BUTTON(3) // 按钮 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java new file mode 100644 index 0000000..7870cb0 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java @@ -0,0 +1,32 @@ +package com.win.module.system.enums.permission; + +import com.win.framework.common.util.object.ObjectUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 角色标识枚举 + */ +@Getter +@AllArgsConstructor +public enum RoleCodeEnum { + + SUPER_ADMIN("super_admin", "超级管理员"), + TENANT_ADMIN("tenant_admin", "租户管理员"), + CRM_ADMIN("crm_admin", "CRM 管理员"); // CRM 系统专用 + ; + + /** + * 角色编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static boolean isSuperAdmin(String code) { + return ObjectUtils.equalsAny(code, SUPER_ADMIN.getCode()); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java new file mode 100644 index 0000000..9636cf7 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java @@ -0,0 +1,21 @@ +package com.win.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RoleTypeEnum { + + /** + * 内置角色 + */ + SYSTEM(1), + /** + * 自定义角色 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java new file mode 100644 index 0000000..ab00f97 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java @@ -0,0 +1,23 @@ +package com.win.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的接收状态枚举 + * + * @author 芋道源码 + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsReceiveStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 接收成功 + FAILURE(20), // 接收失败 + ; + + private final int status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java new file mode 100644 index 0000000..d8a2e1d --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java @@ -0,0 +1,51 @@ +package com.win.module.system.enums.sms; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户短信验证码发送场景的枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SmsSceneEnum implements IntArrayValuable { + + MEMBER_LOGIN(1, "user-sms-login", "会员用户 - 手机号登陆"), + MEMBER_UPDATE_MOBILE(2, "user-update-mobile", "会员用户 - 修改手机"), + MEMBER_UPDATE_PASSWORD(3, "user-update-password", "会员用户 - 修改密码"), + MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"), + + ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray(); + + /** + * 验证场景的编号 + */ + private final Integer scene; + /** + * 模版编码 + */ + private final String templateCode; + /** + * 描述 + */ + private final String description; + + @Override + public int[] array() { + return ARRAYS; + } + + public static SmsSceneEnum getCodeByScene(Integer scene) { + return ArrayUtil.firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), + values()); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java new file mode 100644 index 0000000..d09c6c2 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java @@ -0,0 +1,24 @@ +package com.win.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的发送状态枚举 + * + * @author zzf + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsSendStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 发送成功 + FAILURE(20), // 发送失败 + IGNORE(30), // 忽略,即不发送 + ; + + private final int status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java new file mode 100644 index 0000000..c0d6554 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java @@ -0,0 +1,25 @@ +package com.win.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的模板类型枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SmsTemplateTypeEnum { + + VERIFICATION_CODE(1), // 验证码 + NOTICE(2), // 通知 + PROMOTION(3), // 营销 + ; + + /** + * 类型 + */ + private final int type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/social/SocialTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/social/SocialTypeEnum.java new file mode 100644 index 0000000..f0600a9 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/social/SocialTypeEnum.java @@ -0,0 +1,78 @@ +package com.win.module.system.enums.social; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 社交平台的类型枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SocialTypeEnum implements IntArrayValuable { + + /** + * Gitee + * + * @see 接入文档 + */ + GITEE(10, "GITEE"), + /** + * 钉钉 + * + * @see 接入文档 + */ + DINGTALK(20, "DINGTALK"), + + /** + * 企业微信 + * + * @see 接入文档 + */ + WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"), + /** + * 微信公众平台 - 移动端 H5 + * + * @see 接入文档 + */ + WECHAT_MP(31, "WECHAT_MP"), + /** + * 微信开放平台 - 网站应用 PC 端扫码授权登录 + * + * @see 接入文档 + */ + WECHAT_OPEN(32, "WECHAT_OPEN"), + /** + * 微信小程序 + * + * @see 接入文档 + */ + WECHAT_MINI_APP(34, "WECHAT_MINI_APP"), + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SocialTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + /** + * 类型的标识 + */ + private final String source; + + @Override + public int[] array() { + return ARRAYS; + } + + public static SocialTypeEnum valueOfType(Integer type) { + return ArrayUtil.firstMatch(o -> o.getType().equals(type), values()); + } + +} diff --git a/win-module-system/win-module-system-biz/pom.xml b/win-module-system/win-module-system-biz/pom.xml new file mode 100644 index 0000000..bb168a2 --- /dev/null +++ b/win-module-system/win-module-system-biz/pom.xml @@ -0,0 +1,118 @@ + + + + com.win + win-module-system + ${revision} + + 4.0.0 + win-module-system-biz + jar + + ${project.artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + + + com.win + win-module-system-api + ${revision} + + + com.win + win-module-infra-api + ${revision} + + + + + com.win + win-spring-boot-starter-biz-data-permission + + + com.win + win-spring-boot-starter-biz-tenant + + + com.win + win-spring-boot-starter-biz-ip + + + + + com.win + win-spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.win + win-spring-boot-starter-mybatis + + + + com.win + win-spring-boot-starter-redis + + + + + com.win + win-spring-boot-starter-job + + + + + com.win + win-spring-boot-starter-mq + + + + + com.win + win-spring-boot-starter-excel + + + + org.springframework.boot + spring-boot-starter-mail + + + + + com.xingyuv + spring-boot-starter-justauth + + + + com.github.binarywang + wx-java-mp-spring-boot-starter + + + com.github.binarywang + wx-java-miniapp-spring-boot-starter + + + + com.xingyuv + spring-boot-starter-captcha-plus + + + + org.dromara.hutool + hutool-extra + + + + + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java new file mode 100644 index 0000000..a8ccf53 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java @@ -0,0 +1,48 @@ +package com.win.module.system.api.dept; + +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.service.dept.DeptService; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * 部门 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class DeptApiImpl implements DeptApi { + + @Resource + private DeptService deptService; + + @Override + public DeptRespDTO getDept(Long id) { + DeptDO dept = deptService.getDept(id); + return BeanUtils.toBean(dept, DeptRespDTO.class); + } + + @Override + public List getDeptList(Collection ids) { + List depts = deptService.getDeptList(ids); + return BeanUtils.toBean(depts, DeptRespDTO.class); + } + + @Override + public void validateDeptList(Collection ids) { + deptService.validateDeptList(ids); + } + + @Override + public List getChildDeptList(Long id) { + List childDeptList = deptService.getChildDeptList(id); + return BeanUtils.toBean(childDeptList, DeptRespDTO.class); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java new file mode 100644 index 0000000..2b2974c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java @@ -0,0 +1,35 @@ +package com.win.module.system.api.dept; + +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.dept.dto.PostRespDTO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.service.dept.PostService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * 岗位 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class PostApiImpl implements PostApi { + + @Resource + private PostService postService; + + @Override + public void validPostList(Collection ids) { + postService.validatePostList(ids); + } + + @Override + public List getPostList(Collection ids) { + List list = postService.getPostList(ids); + return BeanUtils.toBean(list, PostRespDTO.class); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java new file mode 100644 index 0000000..af704da --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java @@ -0,0 +1,47 @@ +package com.win.module.system.api.dict; + +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.dict.dto.DictDataRespDTO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.service.dict.DictDataService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 字典数据 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class DictDataApiImpl implements DictDataApi { + + @Resource + private DictDataService dictDataService; + + @Override + public void validateDictDataList(String dictType, Collection values) { + dictDataService.validateDictDataList(dictType, values); + } + + @Override + public DictDataRespDTO getDictData(String dictType, String value) { + DictDataDO dictData = dictDataService.getDictData(dictType, value); + return BeanUtils.toBean(dictData, DictDataRespDTO.class); + } + + @Override + public DictDataRespDTO parseDictData(String dictType, String label) { + DictDataDO dictData = dictDataService.parseDictData(dictType, label); + return BeanUtils.toBean(dictData, DictDataRespDTO.class); + } + + @Override + public List getDictDataList(String dictType) { + List list = dictDataService.getDictDataListByDictType(dictType); + return BeanUtils.toBean(list, DictDataRespDTO.class); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java new file mode 100644 index 0000000..327b67c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java @@ -0,0 +1,27 @@ +package com.win.module.system.api.logger; + +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.service.logger.LoginLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 登录日志的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class LoginLogApiImpl implements LoginLogApi { + + @Resource + private LoginLogService loginLogService; + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + loginLogService.createLoginLog(reqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java new file mode 100644 index 0000000..5d48af8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java @@ -0,0 +1,39 @@ +package com.win.module.system.api.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.api.logger.dto.OperateLogPageReqDTO; +import com.win.module.system.api.logger.dto.OperateLogRespDTO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import com.win.module.system.service.logger.OperateLogService; +import com.fhs.core.trans.anno.TransMethodResult; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 操作日志 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class OperateLogApiImpl implements OperateLogApi { + + @Resource + private OperateLogService operateLogService; + + @Override + public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { + operateLogService.createOperateLog(createReqDTO); + } + + @Override + @TransMethodResult + public PageResult getOperateLogPage(OperateLogPageReqDTO pageReqDTO) { + PageResult operateLogPage = operateLogService.getOperateLogPage(pageReqDTO); + return BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java new file mode 100644 index 0000000..e5da761 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.mail; + +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.service.mail.MailSendService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 邮件发送 API 实现类 + * + * @author wangjingyi + */ +@Service +@Validated +public class MailSendApiImpl implements MailSendApi { + + @Resource + private MailSendService mailSendService; + + @Override + public Long sendSingleMailToAdmin(MailSendSingleToUserReqDTO reqDTO) { + return mailSendService.sendSingleMailToAdmin(reqDTO.getMail(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + + @Override + public Long sendSingleMailToMember(MailSendSingleToUserReqDTO reqDTO) { + return mailSendService.sendSingleMailToMember(reqDTO.getMail(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java new file mode 100644 index 0000000..3382ad4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java @@ -0,0 +1,32 @@ +package com.win.module.system.api.notify; + +import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; +import com.win.module.system.service.notify.NotifySendService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; + +/** + * 站内信发送 API 实现类 + * + * @author xrcoder + */ +@Service +public class NotifyMessageSendApiImpl implements NotifyMessageSendApi { + + @Resource + private NotifySendService notifySendService; + + @Override + public Long sendSingleMessageToAdmin(NotifySendSingleToUserReqDTO reqDTO) { + return notifySendService.sendSingleNotifyToAdmin(reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + + @Override + public Long sendSingleMessageToMember(NotifySendSingleToUserReqDTO reqDTO) { + return notifySendService.sendSingleNotifyToMember(reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java new file mode 100644 index 0000000..b4294ac --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java @@ -0,0 +1,49 @@ +package com.win.module.system.api.oauth2; + +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; + +/** + * OAuth2.0 Token API 实现类 + * + * @author 芋道源码 + */ +@Service +public class OAuth2TokenApiImpl implements OAuth2TokenApi { + + @Resource + private OAuth2TokenService oauth2TokenService; + + @Override + public OAuth2AccessTokenRespDTO createAccessToken(OAuth2AccessTokenCreateReqDTO reqDTO) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( + reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getScopes()); + return BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class); + } + + @Override + public OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.checkAccessToken(accessToken); + return BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenCheckRespDTO.class); + } + + @Override + public OAuth2AccessTokenRespDTO removeAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(accessToken); + return BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class); + } + + @Override + public OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); + return BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java new file mode 100644 index 0000000..c78b87f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java @@ -0,0 +1,42 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.win.module.system.service.permission.PermissionService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class PermissionApiImpl implements PermissionApi { + + @Resource + private PermissionService permissionService; + + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return permissionService.getUserRoleIdListByRoleId(roleIds); + } + + @Override + public boolean hasAnyPermissions(Long userId, String... permissions) { + return permissionService.hasAnyPermissions(userId, permissions); + } + + @Override + public boolean hasAnyRoles(Long userId, String... roles) { + return permissionService.hasAnyRoles(userId, roles); + } + + @Override + public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { + return permissionService.getDeptDataPermission(userId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java new file mode 100644 index 0000000..ff55ae2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java @@ -0,0 +1,24 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.service.permission.RoleService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.Collection; + +/** + * 角色 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class RoleApiImpl implements RoleApi { + + @Resource + private RoleService roleService; + + @Override + public void validRoleList(Collection ids) { + roleService.validateRoleList(ids); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java new file mode 100644 index 0000000..dece4a6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java @@ -0,0 +1,39 @@ +package com.win.module.system.api.sms; + +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.win.module.system.service.sms.SmsCodeService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 短信验证码 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SmsCodeApiImpl implements SmsCodeApi { + + @Resource + private SmsCodeService smsCodeService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + smsCodeService.sendSmsCode(reqDTO); + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + smsCodeService.useSmsCode(reqDTO); + } + + @Override + public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) { + smsCodeService.validateSmsCode(reqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java new file mode 100644 index 0000000..c1af38e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.sms; + +import com.win.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import com.win.module.system.service.sms.SmsSendService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 短信发送 API 接口 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SmsSendApiImpl implements SmsSendApi { + + @Resource + private SmsSendService smsSendService; + + @Override + public Long sendSingleSmsToAdmin(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToAdmin(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + + @Override + public Long sendSingleSmsToMember(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToMember(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialClientApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialClientApiImpl.java new file mode 100644 index 0000000..02698b0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialClientApiImpl.java @@ -0,0 +1,97 @@ +package com.win.module.system.api.social; + +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.social.dto.*; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.win.module.system.service.social.SocialClientService; +import com.win.module.system.service.social.SocialUserService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.hutool.core.collection.CollUtil.findOne; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 社交应用的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class SocialClientApiImpl implements SocialClientApi { + + @Resource + private SocialClientService socialClientService; + @Resource + private SocialUserService socialUserService; + + @Override + public String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) { + return socialClientService.getAuthorizeUrl(socialType, userType, redirectUri); + } + + @Override + public SocialWxJsapiSignatureRespDTO createWxMpJsapiSignature(Integer userType, String url) { + WxJsapiSignature signature = socialClientService.createWxMpJsapiSignature(userType, url); + return BeanUtils.toBean(signature, SocialWxJsapiSignatureRespDTO.class); + } + + //======================= 微信小程序独有 ======================= + + @Override + public SocialWxPhoneNumberInfoRespDTO getWxMaPhoneNumberInfo(Integer userType, String phoneCode) { + WxMaPhoneNumberInfo info = socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode); + return BeanUtils.toBean(info, SocialWxPhoneNumberInfoRespDTO.class); + } + + @Override + public byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO) { + return socialClientService.getWxaQrcode(reqVO); + } + + @Override + public List getWxaSubscribeTemplateList(Integer userType) { + List list = socialClientService.getSubscribeTemplateList(userType); + return convertList(list, item -> BeanUtils.toBean(item, SocialWxaSubscribeTemplateRespDTO.class).setId(item.getPriTmplId())); + } + + @Override + public void sendWxaSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO) { + // 1.1 获得订阅模版列表 + List templateList = socialClientService.getSubscribeTemplateList(reqDTO.getUserType()); + if (CollUtil.isEmpty(templateList)) { + log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO); + return; + } + // 1.2 获得需要使用的模版 + TemplateInfo template = findOne(templateList, item -> + ObjUtil.equal(item.getTitle(), reqDTO.getTemplateTitle())); + if (template == null) { + log.warn("[sendWxaSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO); + return; + } + + // 2. 获得社交用户 + SocialUserRespDTO socialUser = socialUserService.getSocialUserByUserId(reqDTO.getUserType(), reqDTO.getUserId(), + SocialTypeEnum.WECHAT_MINI_APP.getType()); + if (StrUtil.isBlankIfStr(socialUser.getOpenid())) { + log.warn("[sendWxaSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:会员 openid 缺失]", reqDTO); + return; + } + + // 3. 发送订阅消息 + socialClientService.sendSubscribeMessage(reqDTO, template.getPriTmplId(), socialUser.getOpenid()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialUserApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialUserApiImpl.java new file mode 100644 index 0000000..c04afa0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/social/SocialUserApiImpl.java @@ -0,0 +1,46 @@ +package com.win.module.system.api.social; + +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.api.social.dto.SocialUserRespDTO; +import com.win.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.win.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import com.win.module.system.service.social.SocialUserService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 社交用户的 API 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SocialUserApiImpl implements SocialUserApi { + + @Resource + private SocialUserService socialUserService; + + @Override + public String bindSocialUser(SocialUserBindReqDTO reqDTO) { + return socialUserService.bindSocialUser(reqDTO); + } + + @Override + public void unbindSocialUser(SocialUserUnbindReqDTO reqDTO) { + socialUserService.unbindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(), + reqDTO.getSocialType(), reqDTO.getOpenid()); + } + + @Override + public SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType) { + return socialUserService.getSocialUserByUserId(userType, userId, socialType); + } + + @Override + public SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state) { + return socialUserService.getSocialUserByCode(userType, socialType, code, state); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java new file mode 100644 index 0000000..c102880 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java @@ -0,0 +1,30 @@ +package com.win.module.system.api.tenant; + +import com.win.module.system.service.tenant.TenantService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.List; + +/** + * 多租户的 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class TenantApiImpl implements TenantApi { + + @Resource + private TenantService tenantService; + + @Override + public List getTenantIdList() { + return tenantService.getTenantIdList(); + } + + @Override + public void validateTenant(Long id) { + tenantService.validTenant(id); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java new file mode 100644 index 0000000..ee49f03 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java @@ -0,0 +1,82 @@ +package com.win.module.system.api.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.user.AdminUserService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.*; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * Admin 用户 API 实现类 + * + * @author 芋道源码 + */ +@Service +public class AdminUserApiImpl implements AdminUserApi { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + + @Override + public AdminUserRespDTO getUser(Long id) { + AdminUserDO user = userService.getUser(id); + return BeanUtils.toBean(user, AdminUserRespDTO.class); + } + + @Override + public List getUserListBySubordinate(Long id) { + // 1.1 获取用户负责的部门 + List depts = deptService.getDeptListByLeaderUserId(id); + if (CollUtil.isEmpty(depts)) { + return Collections.emptyList(); + } + // 1.2 获取所有子部门 + Set deptIds = convertSet(depts, DeptDO::getId); + List childDeptList = deptService.getChildDeptList(deptIds); + if (CollUtil.isNotEmpty(childDeptList)) { + deptIds.addAll(convertSet(childDeptList, DeptDO::getId)); + } + + // 2. 获取部门对应的用户信息 + List users = userService.getUserListByDeptIds(deptIds); + users.removeIf(item -> ObjUtil.equal(item.getId(), id)); // 排除自己 + return BeanUtils.toBean(users, AdminUserRespDTO.class); + } + + @Override + @DataPermission(enable = false) // 禁用数据权限。原因是,一般基于指定 id 的 API 查询,都是数据拼接为主 + public List getUserList(Collection ids) { + List users = userService.getUserList(ids); + return BeanUtils.toBean(users, AdminUserRespDTO.class); + } + + @Override + public List getUserListByDeptIds(Collection deptIds) { + List users = userService.getUserListByDeptIds(deptIds); + return BeanUtils.toBean(users, AdminUserRespDTO.class); + } + + @Override + public List getUserListByPostIds(Collection postIds) { + List users = userService.getUserListByPostIds(postIds); + return BeanUtils.toBean(users, AdminUserRespDTO.class); + } + + @Override + public void validateUserList(Collection ids) { + userService.validateUserList(ids); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.http new file mode 100644 index 0000000..00ae2ba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.http @@ -0,0 +1,33 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/system/auth/login +Content-Type: application/json +tenant-id: {{adminTenentId}} +tag: Yunai.local + +{ + "username": "admin", + "password": "admin123", + "uuid": "3acd87a09a4f48fb9118333780e94883", + "code": "1024" +} + +### 请求 /login 接口 => 成功(无验证码) +POST {{baseUrl}}/system/auth/login +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "username": "admin", + "password": "admin123" +} + +### 请求 /get-permission-info 接口 => 成功 +GET {{baseUrl}}/system/auth/get-permission-info +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /list-menus 接口 => 成功 +GET {{baseUrl}}/system/list-menus +Authorization: Bearer {{token}} +#Authorization: Bearer a6aa7714a2e44c95aaa8a2c5adc2a67a +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.java new file mode 100644 index 0000000..69364a2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/AuthController.java @@ -0,0 +1,164 @@ +package com.win.module.system.controller.admin.auth; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.security.config.SecurityProperties; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.controller.admin.auth.vo.*; +import com.win.module.system.convert.auth.AuthConvert; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.service.auth.AdminAuthService; +import com.win.module.system.service.permission.MenuService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.permission.RoleService; +import com.win.module.system.service.social.SocialClientService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 认证") +@RestController +@RequestMapping("/system/auth") +@Validated +@Slf4j +public class AuthController { + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + @Resource + private SocialClientService socialClientService; + + @Resource + private SecurityProperties securityProperties; + + @PostMapping("/login") + @PermitAll + @Operation(summary = "使用账号密码登录") + public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { + return success(authService.login(reqVO)); + } + + @PostMapping("/logout") + @PermitAll + @Operation(summary = "登出系统") + public CommonResult logout(HttpServletRequest request) { + String token = SecurityFrameworkUtils.obtainAuthorization(request, + securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); + if (StrUtil.isNotBlank(token)) { + authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); + } + return success(true); + } + + @PostMapping("/refresh-token") + @PermitAll + @Operation(summary = "刷新令牌") + @Parameter(name = "refreshToken", description = "刷新令牌", required = true) + public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { + return success(authService.refreshToken(refreshToken)); + } + + @GetMapping("/get-permission-info") + @Operation(summary = "获取登录用户的权限信息") + public CommonResult getPermissionInfo() { + // 1.1 获得用户信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + if (user == null) { + return success(null); + } + + // 1.2 获得角色列表 + Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); + if (CollUtil.isEmpty(roleIds)) { + return success(AuthConvert.INSTANCE.convert(user, Collections.emptyList(), Collections.emptyList())); + } + List roles = roleService.getRoleList(roleIds); + roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色 + + // 1.3 获得菜单列表 + Set menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId)); + List menuList = menuService.getMenuList(menuIds); + menuList = menuService.filterDisableMenus(menuList); + + // 2. 拼接结果返回 + return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); + } + + @PostMapping("/register") + @PermitAll + @Operation(summary = "注册用户") + public CommonResult register(@RequestBody @Valid AuthRegisterReqVO registerReqVO) { + return success(authService.register(registerReqVO)); + } + + // ========== 短信登录相关 ========== + + @PostMapping("/sms-login") + @PermitAll + @Operation(summary = "使用短信验证码登录") + public CommonResult smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) { + return success(authService.smsLogin(reqVO)); + } + + @PostMapping("/send-sms-code") + @PermitAll + @Operation(summary = "发送手机验证码") + public CommonResult sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) { + authService.sendSmsCode(reqVO); + return success(true); + } + + // ========== 社交登录相关 ========== + + @GetMapping("/social-auth-redirect") + @PermitAll + @Operation(summary = "社交授权的跳转") + @Parameters({ + @Parameter(name = "type", description = "社交类型", required = true), + @Parameter(name = "redirectUri", description = "回调路径") + }) + public CommonResult socialLogin(@RequestParam("type") Integer type, + @RequestParam("redirectUri") String redirectUri) { + return success(socialClientService.getAuthorizeUrl( + type, UserTypeEnum.ADMIN.getValue(), redirectUri)); + } + + @PostMapping("/social-login") + @PermitAll + @Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户") + public CommonResult socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) { + return success(authService.socialLogin(reqVO)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java new file mode 100644 index 0000000..defa7b9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginReqVO.java @@ -0,0 +1,69 @@ +package com.win.module.system.controller.admin.auth.vo; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.social.SocialTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; + +@Schema(description = "管理后台 - 账号密码登录 Request VO,如果登录并绑定社交用户,需要传递 social 开头的参数") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthLoginReqVO { + + @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") + @NotEmpty(message = "登录账号不能为空") + @Length(min = 4, max = 16, message = "账号长度为 4-16 位") + @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + // ========== 图片验证码相关 ========== + + @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, + example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") + @NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class) + private String captchaVerification; + + // ========== 绑定社交登录时,需要传递如下参数 ========== + + @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @InEnum(SocialTypeEnum.class) + private Integer socialType; + + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String socialCode; + + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + private String socialState; + + /** + * 开启验证码的 Group + */ + public interface CodeEnableGroup {} + + @AssertTrue(message = "授权码不能为空") + public boolean isSocialCodeValid() { + return socialType == null || StrUtil.isNotEmpty(socialCode); + } + + @AssertTrue(message = "授权 state 不能为空") + public boolean isSocialState() { + return socialType == null || StrUtil.isNotEmpty(socialState); + } + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginRespVO.java new file mode 100644 index 0000000..ef68096 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthLoginRespVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 登录 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthLoginRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long userId; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "happy") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + private String refreshToken; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthMenuRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthMenuRespVO.java new file mode 100644 index 0000000..11d35af --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthMenuRespVO.java @@ -0,0 +1,53 @@ +package com.win.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 登录用户的菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthMenuRespVO { + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private Long id; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + private String path; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + + /** + * 子路由 + */ + private List children; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java new file mode 100644 index 0000000..4c6c0c0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java @@ -0,0 +1,96 @@ +package com.win.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +@Schema(description = "管理后台 - 登录用户的权限信息 Response VO,额外包括用户信息和角色列表") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthPermissionInfoRespVO { + + @Schema(description = "用户信息", requiredMode = Schema.RequiredMode.REQUIRED) + private UserVO user; + + @Schema(description = "角色标识数组", requiredMode = Schema.RequiredMode.REQUIRED) + private Set roles; + + @Schema(description = "操作权限数组", requiredMode = Schema.RequiredMode.REQUIRED) + private Set permissions; + + @Schema(description = "菜单树", requiredMode = Schema.RequiredMode.REQUIRED) + private List menus; + + @Schema(description = "用户信息 VO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class UserVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + private String nickname; + + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.jpg") + private String avatar; + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private Long deptId; + + } + + @Schema(description = "管理后台 - 登录用户的菜单信息 Response VO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class MenuVO { + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private Long id; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + private String path; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + + /** + * 子路由 + */ + private List children; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java new file mode 100644 index 0000000..8418fef --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.admin.auth.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - Register Request VO") +@Data +public class AuthRegisterReqVO { + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "用户账号不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotBlank(message = "用户昵称不能为空") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + // ========== 图片验证码相关 ========== + + @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, + example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") + @NotEmpty(message = "验证码不能为空", groups = AuthLoginReqVO.CodeEnableGroup.class) + private String captchaVerification; + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java new file mode 100644 index 0000000..35a52a9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.admin.auth.vo; + +import com.win.framework.common.validation.Mobile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 短信验证码的登录 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSmsLoginReqVO { + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @Schema(description = "短信验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "验证码不能为空") + private String code; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java new file mode 100644 index 0000000..6b378ee --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.admin.auth.vo; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 发送手机验证码 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSmsSendReqVO { + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @Schema(description = "短信场景", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java new file mode 100644 index 0000000..81ad2f1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.admin.auth.vo; + +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.social.SocialTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 社交绑定登录 Request VO,使用 code 授权码 + 账号密码") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSocialLoginReqVO { + + @Schema(description = "社交平台的类型,参见 UserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "授权码不能为空") + private String code; + + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @NotEmpty(message = "state 不能为空") + private String state; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java new file mode 100644 index 0000000..5b459a8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/captcha/CaptchaController.java @@ -0,0 +1,53 @@ +package com.win.module.system.controller.admin.captcha; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.servlet.ServletUtils; +import com.xingyuv.captcha.model.common.ResponseModel; +import com.xingyuv.captcha.model.vo.CaptchaVO; +import com.xingyuv.captcha.service.CaptchaService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; + +@Tag(name = "管理后台 - 验证码") +@RestController("adminCaptchaController") +@RequestMapping("/system/captcha") +public class CaptchaController { + + @Resource + private CaptchaService captchaService; + + @PostMapping({"/get"}) + @Operation(summary = "获得验证码") + @PermitAll + public ResponseModel get(@RequestBody CaptchaVO data, HttpServletRequest request) { + assert request.getRemoteHost() != null; + data.setBrowserInfo(getRemoteId(request)); + return captchaService.get(data); + } + + @PostMapping("/check") + @Operation(summary = "校验验证码") + @PermitAll + public ResponseModel check(@RequestBody CaptchaVO data, HttpServletRequest request) { + data.setBrowserInfo(getRemoteId(request)); + return captchaService.check(data); + } + + public static String getRemoteId(HttpServletRequest request) { + String ip = ServletUtils.getClientIP(request); + String ua = request.getHeader("user-agent"); + if (StrUtil.isNotBlank(ip)) { + return ip + ua; + } + return request.getRemoteAddr() + ua; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/DeptController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/DeptController.java new file mode 100644 index 0000000..bd72bed --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/DeptController.java @@ -0,0 +1,84 @@ +package com.win.module.system.controller.admin.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.win.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import com.win.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; +import com.win.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.service.dept.DeptService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 部门") +@RestController +@RequestMapping("/system/dept") +@Validated +public class DeptController { + + @Resource + private DeptService deptService; + + @PostMapping("create") + @Operation(summary = "创建部门") + @PreAuthorize("@ss.hasPermission('system:dept:create')") + public CommonResult createDept(@Valid @RequestBody DeptSaveReqVO createReqVO) { + Long deptId = deptService.createDept(createReqVO); + return success(deptId); + } + + @PutMapping("update") + @Operation(summary = "更新部门") + @PreAuthorize("@ss.hasPermission('system:dept:update')") + public CommonResult updateDept(@Valid @RequestBody DeptSaveReqVO updateReqVO) { + deptService.updateDept(updateReqVO); + return success(true); + } + + @DeleteMapping("delete") + @Operation(summary = "删除部门") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dept:delete')") + public CommonResult deleteDept(@RequestParam("id") Long id) { + deptService.deleteDept(id); + return success(true); + } + + @GetMapping("/list") + @Operation(summary = "获取部门列表") + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult> getDeptList(DeptListReqVO reqVO) { + List list = deptService.getDeptList(reqVO); + return success(BeanUtils.toBean(list, DeptRespVO.class)); + } + + @GetMapping(value = {"/list-all-simple", "/simple-list"}) + @Operation(summary = "获取部门精简信息列表", description = "只包含被开启的部门,主要用于前端的下拉选项") + public CommonResult> getSimpleDeptList() { + List list = deptService.getDeptList( + new DeptListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus())); + return success(BeanUtils.toBean(list, DeptSimpleRespVO.class)); + } + + @GetMapping("/get") + @Operation(summary = "获得部门信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult getDept(@RequestParam("id") Long id) { + DeptDO dept = deptService.getDept(id); + return success(BeanUtils.toBean(dept, DeptRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/PostController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/PostController.java new file mode 100644 index 0000000..8a7ae21 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/PostController.java @@ -0,0 +1,106 @@ +package com.win.module.system.controller.admin.dept; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.win.module.system.controller.admin.dept.vo.post.PostRespVO; +import com.win.module.system.controller.admin.dept.vo.post.PostSaveReqVO; +import com.win.module.system.controller.admin.dept.vo.post.PostSimpleRespVO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.service.dept.PostService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 岗位") +@RestController +@RequestMapping("/system/post") +@Validated +public class PostController { + + @Resource + private PostService postService; + + @PostMapping("/create") + @Operation(summary = "创建岗位") + @PreAuthorize("@ss.hasPermission('system:post:create')") + public CommonResult createPost(@Valid @RequestBody PostSaveReqVO createReqVO) { + Long postId = postService.createPost(createReqVO); + return success(postId); + } + + @PutMapping("/update") + @Operation(summary = "修改岗位") + @PreAuthorize("@ss.hasPermission('system:post:update')") + public CommonResult updatePost(@Valid @RequestBody PostSaveReqVO updateReqVO) { + postService.updatePost(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除岗位") + @PreAuthorize("@ss.hasPermission('system:post:delete')") + public CommonResult deletePost(@RequestParam("id") Long id) { + postService.deletePost(id); + return success(true); + } + + @GetMapping(value = "/get") + @Operation(summary = "获得岗位信息") + @Parameter(name = "id", description = "岗位编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult getPost(@RequestParam("id") Long id) { + PostDO post = postService.getPost(id); + return success(BeanUtils.toBean(post, PostRespVO.class)); + } + + @GetMapping(value = {"/list-all-simple", "simple-list"}) + @Operation(summary = "获取岗位全列表", description = "只包含被开启的岗位,主要用于前端的下拉选项") + public CommonResult> getSimplePostList() { + // 获得岗位列表,只要开启状态的 + List list = postService.getPostList(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回给前端 + list.sort(Comparator.comparing(PostDO::getSort)); + return success(BeanUtils.toBean(list, PostSimpleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得岗位分页列表") + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult> getPostPage(@Validated PostPageReqVO pageReqVO) { + PageResult pageResult = postService.getPostPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PostRespVO.class)); + } + + @GetMapping("/export") + @Operation(summary = "岗位管理") + @PreAuthorize("@ss.hasPermission('system:post:export')") + @ApiAccessLog(operateType = EXPORT) + public void export(HttpServletResponse response, @Validated PostPageReqVO reqVO) throws IOException { + reqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = postService.getPostPage(reqVO).getList(); + // 输出 + ExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostRespVO.class, + BeanUtils.toBean(list, PostRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java new file mode 100644 index 0000000..f8dfdff --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.admin.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 部门列表 Request VO") +@Data +public class DeptListReqVO { + + @Schema(description = "部门名称,模糊匹配", example = "芋道") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptRespVO.java new file mode 100644 index 0000000..d881162 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptRespVO.java @@ -0,0 +1,39 @@ +package com.win.module.system.controller.admin.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 部门信息 Response VO") +@Data +public class DeptRespVO { + + @Schema(description = "部门编号", example = "1024") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + @Schema(description = "父部门 ID", example = "1024") + private Long parentId; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer sort; + + @Schema(description = "负责人的用户编号", example = "2048") + private Long leaderUserId; + + @Schema(description = "联系电话", example = "15601691000") + private String phone; + + @Schema(description = "邮箱", example = "win@iocoder.cn") + private String email; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java new file mode 100644 index 0000000..8410f39 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java @@ -0,0 +1,49 @@ +package com.win.module.system.controller.admin.dept.vo.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 部门创建/修改 Request VO") +@Data +public class DeptSaveReqVO { + + @Schema(description = "部门编号", example = "1024") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotBlank(message = "部门名称不能为空") + @Size(max = 30, message = "部门名称长度不能超过 30 个字符") + private String name; + + @Schema(description = "父部门 ID", example = "1024") + private Long parentId; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "负责人的用户编号", example = "2048") + private Long leaderUserId; + + @Schema(description = "联系电话", example = "15601691000") + @Size(max = 11, message = "联系电话长度不能超过11个字符") + private String phone; + + @Schema(description = "邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java new file mode 100644 index 0000000..166f10b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.admin.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 部门精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeptSimpleRespVO { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + @Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostPageReqVO.java new file mode 100644 index 0000000..d6af34e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostPageReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.admin.dept.vo.post; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 岗位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostPageReqVO extends PageParam { + + @Schema(description = "岗位编码,模糊匹配", example = "win") + private String code; + + @Schema(description = "岗位名称,模糊匹配", example = "芋道") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostRespVO.java new file mode 100644 index 0000000..29de9d4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostRespVO.java @@ -0,0 +1,45 @@ +package com.win.module.system.controller.admin.dept.vo.post; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 岗位信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class PostRespVO { + + @Schema(description = "岗位序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("岗位序号") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆") + @ExcelProperty("岗位名称") + private String name; + + @Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @ExcelProperty("岗位编码") + private String code; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("岗位排序") + private Integer sort; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "备注", example = "快乐的备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSaveReqVO.java new file mode 100644 index 0000000..5362d01 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSaveReqVO.java @@ -0,0 +1,40 @@ +package com.win.module.system.controller.admin.dept.vo.post; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 岗位创建/修改 Request VO") +@Data +public class PostSaveReqVO { + + @Schema(description = "岗位编号", example = "1024") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆") + @NotBlank(message = "岗位名称不能为空") + @Size(max = 50, message = "岗位名称长度不能超过 50 个字符") + private String name; + + @Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "岗位编码不能为空") + @Size(max = 64, message = "岗位编码长度不能超过64个字符") + private String code; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @InEnum(CommonStatusEnum.class) + private Integer status; + + @Schema(description = "备注", example = "快乐的备注") + private String remark; + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java new file mode 100644 index 0000000..254695a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.admin.dept.vo.post; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 岗位信息的精简 Response VO") +@Data +public class PostSimpleRespVO { + + @Schema(description = "岗位序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("岗位序号") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆") + @ExcelProperty("岗位名称") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.http new file mode 100644 index 0000000..f524315 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.http @@ -0,0 +1,4 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/dict-data/list-all-simple +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.java new file mode 100644 index 0000000..9c2c9bd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictDataController.java @@ -0,0 +1,104 @@ +package com.win.module.system.controller.admin.dict; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.controller.admin.dict.vo.data.DictDataRespVO; +import com.win.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO; +import com.win.module.system.controller.admin.dict.vo.data.DictDataSimpleRespVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.service.dict.DictDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 字典数据") +@RestController +@RequestMapping("/system/dict-data") +@Validated +public class DictDataController { + + @Resource + private DictDataService dictDataService; + + @PostMapping("/create") + @Operation(summary = "新增字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictData(@Valid @RequestBody DictDataSaveReqVO createReqVO) { + Long dictDataId = dictDataService.createDictData(createReqVO); + return success(dictDataId); + } + + @PutMapping("/update") + @Operation(summary = "修改字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictData(@Valid @RequestBody DictDataSaveReqVO updateReqVO) { + dictDataService.updateDictData(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除字典数据") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictData(Long id) { + dictDataService.deleteDictData(id); + return success(true); + } + + @GetMapping(value = {"/list-all-simple", "simple-list"}) + @Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> getSimpleDictDataList() { + List list = dictDataService.getDictDataList( + CommonStatusEnum.ENABLE.getStatus(), null); + return success(BeanUtils.toBean(list, DictDataSimpleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "/获得字典类型的分页列表") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> getDictTypePage(@Valid DictDataPageReqVO pageReqVO) { + PageResult pageResult = dictDataService.getDictDataPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, DictDataRespVO.class)); + } + + @GetMapping(value = "/get") + @Operation(summary = "/查询字典数据详细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictData(@RequestParam("id") Long id) { + DictDataDO dictData = dictDataService.getDictData(id); + return success(BeanUtils.toBean(dictData, DictDataRespVO.class)); + } + + @GetMapping("/export") + @Operation(summary = "导出字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:export')") + @ApiAccessLog(operateType = EXPORT) + public void export(HttpServletResponse response, @Valid DictDataPageReqVO exportReqVO) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = dictDataService.getDictDataPage(exportReqVO).getList(); + // 输出 + ExcelUtils.write(response, "字典数据.xls", "数据", DictDataRespVO.class, + BeanUtils.toBean(list, DictDataRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictTypeController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictTypeController.java new file mode 100644 index 0000000..3aaefac --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/DictTypeController.java @@ -0,0 +1,102 @@ +package com.win.module.system.controller.admin.dict; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.controller.admin.dict.vo.type.DictTypeRespVO; +import com.win.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO; +import com.win.module.system.controller.admin.dict.vo.type.DictTypeSimpleRespVO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.service.dict.DictTypeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 字典类型") +@RestController +@RequestMapping("/system/dict-type") +@Validated +public class DictTypeController { + + @Resource + private DictTypeService dictTypeService; + + @PostMapping("/create") + @Operation(summary = "创建字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictType(@Valid @RequestBody DictTypeSaveReqVO createReqVO) { + Long dictTypeId = dictTypeService.createDictType(createReqVO); + return success(dictTypeId); + } + + @PutMapping("/update") + @Operation(summary = "修改字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictType(@Valid @RequestBody DictTypeSaveReqVO updateReqVO) { + dictTypeService.updateDictType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除字典类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictType(Long id) { + dictTypeService.deleteDictType(id); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得字典类型的分页列表") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> pageDictTypes(@Valid DictTypePageReqVO pageReqVO) { + PageResult pageResult = dictTypeService.getDictTypePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, DictTypeRespVO.class)); + } + + @Operation(summary = "/查询字典类型详细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @GetMapping(value = "/get") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictType(@RequestParam("id") Long id) { + DictTypeDO dictType = dictTypeService.getDictType(id); + return success(BeanUtils.toBean(dictType, DictTypeRespVO.class)); + } + + @GetMapping(value = {"/list-all-simple", "simple-list"}) + @Operation(summary = "获得全部字典类型列表", description = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> getSimpleDictTypeList() { + List list = dictTypeService.getDictTypeList(); + return success(BeanUtils.toBean(list, DictTypeSimpleRespVO.class)); + } + + @Operation(summary = "导出数据类型") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + @ApiAccessLog(operateType = EXPORT) + public void export(HttpServletResponse response, @Valid DictTypePageReqVO exportReqVO) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = dictTypeService.getDictTypePage(exportReqVO).getList(); + // 导出 + ExcelUtils.write(response, "字典类型.xls", "数据", DictTypeRespVO.class, + BeanUtils.toBean(list, DictTypeRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java new file mode 100644 index 0000000..bd03e3e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java @@ -0,0 +1,29 @@ +package com.win.module.system.controller.admin.dict.vo.data; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataPageReqVO extends PageParam { + + @Schema(description = "字典标签", example = "芋道") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @Schema(description = "字典类型,模糊匹配", example = "sys_common_sex") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataRespVO.java new file mode 100644 index 0000000..4b6911e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataRespVO.java @@ -0,0 +1,55 @@ +package com.win.module.system.controller.admin.dict.vo.data; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 字典数据信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DictDataRespVO { + + @Schema(description = "字典数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("字典编码") + private Long id; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("字典排序") + private Integer sort; + + @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @ExcelProperty("字典标签") + private String label; + + @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") + @ExcelProperty("字典键值") + private String value; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + @ExcelProperty("字典类型") + private String dictType; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "颜色类型,default、primary、success、info、warning、danger", example = "default") + private String colorType; + + @Schema(description = "css 样式", example = "btn-visible") + private String cssClass; + + @Schema(description = "备注", example = "我是一个角色") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java new file mode 100644 index 0000000..208b0f0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSaveReqVO.java @@ -0,0 +1,52 @@ +package com.win.module.system.controller.admin.dict.vo.data; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 字典数据创建/修改 Request VO") +@Data +public class DictDataSaveReqVO { + + @Schema(description = "字典数据编号", example = "1024") + private Long id; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotBlank(message = "字典标签不能为空") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") + @NotBlank(message = "字典键值不能为空") + @Size(max = 100, message = "字典键值长度不能超过100个字符") + private String value; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + @NotBlank(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + + @Schema(description = "颜色类型,default、primary、success、info、warning、danger", example = "default") + private String colorType; + + @Schema(description = "css 样式", example = "btn-visible") + private String cssClass; + + @Schema(description = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java new file mode 100644 index 0000000..8cf5234 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.admin.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 数据字典精简 Response VO") +@Data +public class DictDataSimpleRespVO { + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "gender") + private String dictType; + + @Schema(description = "字典键值", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String value; + + @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "男") + private String label; + + @Schema(description = "颜色类型,default、primary、success、info、warning、danger", example = "default") + private String colorType; + + @Schema(description = "css 样式", example = "btn-visible") + private String cssClass; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java new file mode 100644 index 0000000..345f3df --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.admin.dict.vo.type; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import jakarta.validation.constraints.Size; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypePageReqVO extends PageParam { + + @Schema(description = "字典类型名称,模糊匹配", example = "芋道") + private String name; + + @Schema(description = "字典类型,模糊匹配", example = "sys_common_sex") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java new file mode 100644 index 0000000..45296f9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java @@ -0,0 +1,41 @@ +package com.win.module.system.controller.admin.dict.vo.type; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 字典类型信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DictTypeRespVO { + + @Schema(description = "字典类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("字典主键") + private Long id; + + @Schema(description = "字典名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "性别") + @ExcelProperty("字典名称") + private String name; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + @ExcelProperty("字典类型") + private String type; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "备注", example = "快乐的备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSaveReqVO.java new file mode 100644 index 0000000..853e593 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSaveReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.admin.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 字典类型创建/修改 Request VO") +@Data +public class DictTypeSaveReqVO { + + @Schema(description = "字典类型编号", example = "1024") + private Long id; + + @Schema(description = "字典名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "性别") + @NotBlank(message = "字典名称不能为空") + @Size(max = 100, message = "字典类型名称长度不能超过100个字符") + private String name; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + @NotNull(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型类型长度不能超过 100 个字符") + private String type; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java new file mode 100644 index 0000000..92810d0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.admin.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 字典类型精简信息 Response VO") +@Data +public class DictTypeSimpleRespVO { + + @Schema(description = "字典类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "字典类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + private String type; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.http new file mode 100644 index 0000000..f1b893d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.http @@ -0,0 +1,5 @@ +### 获得地区树 +GET {{baseUrl}}/system/area/tree +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.java new file mode 100644 index 0000000..f2e0c35 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/AreaController.java @@ -0,0 +1,50 @@ +package com.win.module.system.controller.admin.ip; + +import cn.hutool.core.lang.Assert; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.utils.AreaUtils; +import com.win.framework.ip.core.utils.IPUtils; +import com.win.module.system.controller.admin.ip.vo.AreaNodeRespVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 地区") +@RestController +@RequestMapping("/system/area") +@Validated +public class AreaController { + + @GetMapping("/tree") + @Operation(summary = "获得地区树") + public CommonResult> getAreaTree() { + Area area = AreaUtils.getArea(Area.ID_CHINA); + Assert.notNull(area, "获取不到中国"); + return success(BeanUtils.toBean(area.getChildren(), AreaNodeRespVO.class)); + } + + @GetMapping("/get-by-ip") + @Operation(summary = "获得 IP 对应的地区名") + @Parameter(name = "ip", description = "IP", required = true) + public CommonResult getAreaByIp(@RequestParam("ip") String ip) { + // 获得城市 + Area area = IPUtils.getArea(ip); + if (area == null) { + return success("未知"); + } + // 格式化返回 + return success(AreaUtils.format(area.getId())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/vo/AreaNodeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/vo/AreaNodeRespVO.java new file mode 100644 index 0000000..5836679 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/ip/vo/AreaNodeRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.admin.ip.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 地区节点 Response VO") +@Data +public class AreaNodeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") + private Integer id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京") + private String name; + + /** + * 子节点 + */ + private List children; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/LoginLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/LoginLogController.java new file mode 100644 index 0000000..de6528d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/LoginLogController.java @@ -0,0 +1,59 @@ +package com.win.module.system.controller.admin.logger; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.module.system.service.logger.LoginLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 登录日志") +@RestController +@RequestMapping("/system/login-log") +@Validated +public class LoginLogController { + + @Resource + private LoginLogService loginLogService; + + @GetMapping("/page") + @Operation(summary = "获得登录日志分页列表") + @PreAuthorize("@ss.hasPermission('system:login-log:query')") + public CommonResult> getLoginLogPage(@Valid LoginLogPageReqVO pageReqVO) { + PageResult pageResult = loginLogService.getLoginLogPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, LoginLogRespVO.class)); + } + + @GetMapping("/export") + @Operation(summary = "导出登录日志 Excel") + @PreAuthorize("@ss.hasPermission('system:login-log:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportLoginLog(HttpServletResponse response, @Valid LoginLogPageReqVO exportReqVO) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = loginLogService.getLoginLogPage(exportReqVO).getList(); + // 输出 + ExcelUtils.write(response, "登录日志.xls", "数据列表", LoginLogRespVO.class, + BeanUtils.toBean(list, LoginLogRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.http new file mode 100644 index 0000000..4853581 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.http @@ -0,0 +1,4 @@ +### 请求 /system/operate-log/page 接口 => 成功 +GET {{baseUrl}}/system/operate-log/page +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.java new file mode 100644 index 0000000..67267da --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/OperateLogController.java @@ -0,0 +1,59 @@ +package com.win.module.system.controller.admin.logger; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.translate.core.TranslateUtils; +import com.win.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import com.win.module.system.service.logger.OperateLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 操作日志") +@RestController +@RequestMapping("/system/operate-log") +@Validated +public class OperateLogController { + + @Resource + private OperateLogService operateLogService; + + @GetMapping("/page") + @Operation(summary = "查看操作日志分页列表") + @PreAuthorize("@ss.hasPermission('system:operate-log:query')") + public CommonResult> pageOperateLog(@Valid OperateLogPageReqVO pageReqVO) { + PageResult pageResult = operateLogService.getOperateLogPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, OperateLogRespVO.class)); + } + + @Operation(summary = "导出操作日志") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:operate-log:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportOperateLog(HttpServletResponse response, @Valid OperateLogPageReqVO exportReqVO) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = operateLogService.getOperateLogPage(exportReqVO).getList(); + ExcelUtils.write(response, "操作日志.xls", "数据列表", OperateLogRespVO.class, + TranslateUtils.translate(BeanUtils.toBean(list, OperateLogRespVO.class))); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java new file mode 100644 index 0000000..b5a7b0c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.admin.logger.vo.loginlog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 登录日志分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class LoginLogPageReqVO extends PageParam { + + @Schema(description = "用户 IP,模拟匹配", example = "127.0.0.1") + private String userIp; + + @Schema(description = "用户账号,模拟匹配", example = "芋道") + private String username; + + @Schema(description = "操作状态", example = "true") + private Boolean status; + + @Schema(description = "登录时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java new file mode 100644 index 0000000..24972a5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java @@ -0,0 +1,57 @@ +package com.win.module.system.controller.admin.logger.vo.loginlog; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 登录日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class LoginLogRespVO { + + @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("日志主键") + private Long id; + + @Schema(description = "日志类型,参见 LoginLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "日志类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOGIN_TYPE) + private Integer logType; + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer userType; + + @Schema(description = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab") + private String traceId; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @ExcelProperty("用户账号") + private String username; + + @Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "登录结果", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOGIN_RESULT) + private Integer result; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @ExcelProperty("登录 IP") + private String userIp; + + @Schema(description = "浏览器 UserAgent", example = "Mozilla/5.0") + @ExcelProperty("浏览器 UA") + private String userAgent; + + @Schema(description = "登录时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("登录时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java new file mode 100644 index 0000000..830e6b1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.system.controller.admin.logger.vo.operatelog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 操作日志分页列表 Request VO") +@Data +public class OperateLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "芋道") + private Long userId; + + @Schema(description = "操作模块业务编号", example = "1") + private Long bizId; + + @Schema(description = "操作模块,模拟匹配", example = "订单") + private String type; + + @Schema(description = "操作名,模拟匹配", example = "创建订单") + private String subType; + + @Schema(description = "操作明细,模拟匹配", example = "修改编号为 1 的用户信息") + private String action; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java new file mode 100644 index 0000000..8bc182e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java @@ -0,0 +1,68 @@ +package com.win.module.system.controller.admin.logger.vo.operatelog; + +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fhs.core.trans.anno.Trans; +import com.fhs.core.trans.constant.TransType; +import com.fhs.core.trans.vo.VO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 操作日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class OperateLogRespVO implements VO { + + @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("日志编号") + private Long id; + + @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "89aca178-a370-411c-ae02-3f0d672be4ab") + private String traceId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @Trans(type = TransType.SIMPLE, target = AdminUserDO.class, fields = "nickname", ref = "userName") + private Long userId; + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("操作人") + private String userName; + + @Schema(description = "操作模块类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单") + @ExcelProperty("操作模块类型") + private String type; + + @Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建订单") + @ExcelProperty("操作名") + private String subType; + + @Schema(description = "操作模块业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("操作模块业务编号") + private Long bizId; + + @Schema(description = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。") + private String action; + + @Schema(description = "拓展字段", example = "{'orderId': 1}") + private String extra; + + @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + @Schema(description = "请求地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "/xxx/yyy") + private String requestUrl; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + private String userIp; + + @Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") + private String userAgent; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailAccountController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailAccountController.java new file mode 100644 index 0000000..6b7618e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailAccountController.java @@ -0,0 +1,81 @@ +package com.win.module.system.controller.admin.mail; + + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountRespVO; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountSimpleRespVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.service.mail.MailAccountService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 邮箱账号") +@RestController +@RequestMapping("/system/mail-account") +public class MailAccountController { + + @Resource + private MailAccountService mailAccountService; + + @PostMapping("/create") + @Operation(summary = "创建邮箱账号") + @PreAuthorize("@ss.hasPermission('system:mail-account:create')") + public CommonResult createMailAccount(@Valid @RequestBody MailAccountSaveReqVO createReqVO) { + return success(mailAccountService.createMailAccount(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改邮箱账号") + @PreAuthorize("@ss.hasPermission('system:mail-account:update')") + public CommonResult updateMailAccount(@Valid @RequestBody MailAccountSaveReqVO updateReqVO) { + mailAccountService.updateMailAccount(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除邮箱账号") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:mail-account:delete')") + public CommonResult deleteMailAccount(@RequestParam Long id) { + mailAccountService.deleteMailAccount(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得邮箱账号") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-account:query')") + public CommonResult getMailAccount(@RequestParam("id") Long id) { + MailAccountDO account = mailAccountService.getMailAccount(id); + return success(BeanUtils.toBean(account, MailAccountRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得邮箱账号分页") + @PreAuthorize("@ss.hasPermission('system:mail-account:query')") + public CommonResult> getMailAccountPage(@Valid MailAccountPageReqVO pageReqVO) { + PageResult pageResult = mailAccountService.getMailAccountPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MailAccountRespVO.class)); + } + + @GetMapping({"/list-all-simple", "simple-list"}) + @Operation(summary = "获得邮箱账号精简列表") + public CommonResult> getSimpleMailAccountList() { + List list = mailAccountService.getMailAccountList(); + return success(BeanUtils.toBean(list, MailAccountSimpleRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailLogController.java new file mode 100644 index 0000000..0c05cce --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailLogController.java @@ -0,0 +1,49 @@ +package com.win.module.system.controller.admin.mail; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.controller.admin.mail.vo.log.MailLogRespVO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import com.win.module.system.service.mail.MailLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 邮件日志") +@RestController +@RequestMapping("/system/mail-log") +public class MailLogController { + + @Resource + private MailLogService mailLogService; + + @GetMapping("/page") + @Operation(summary = "获得邮箱日志分页") + @PreAuthorize("@ss.hasPermission('system:mail-log:query')") + public CommonResult> getMailLogPage(@Valid MailLogPageReqVO pageVO) { + PageResult pageResult = mailLogService.getMailLogPage(pageVO); + return success(BeanUtils.toBean(pageResult, MailLogRespVO.class)); + } + + @GetMapping("/get") + @Operation(summary = "获得邮箱日志") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-log:query')") + public CommonResult getMailTemplate(@RequestParam("id") Long id) { + MailLogDO log = mailLogService.getMailLog(id); + return success(BeanUtils.toBean(log, MailLogRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.http new file mode 100644 index 0000000..f3c47f5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.http @@ -0,0 +1,14 @@ +### 请求 /system/mail-template/send-mail 接口 => 成功 +POST {{baseUrl}}/system/mail-template/send-mail +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "templateCode": "test_01", + "mail": "7685413@qq.com", + "templateParams": { + "key01": "value01", + "key02": "value02" + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.java new file mode 100644 index 0000000..a26836b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/MailTemplateController.java @@ -0,0 +1,89 @@ +package com.win.module.system.controller.admin.mail; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.mail.vo.template.*; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.service.mail.MailSendService; +import com.win.module.system.service.mail.MailTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 邮件模版") +@RestController +@RequestMapping("/system/mail-template") +public class MailTemplateController { + + @Resource + private MailTemplateService mailTempleService; + @Resource + private MailSendService mailSendService; + + @PostMapping("/create") + @Operation(summary = "创建邮件模版") + @PreAuthorize("@ss.hasPermission('system:mail-template:create')") + public CommonResult createMailTemplate(@Valid @RequestBody MailTemplateSaveReqVO createReqVO){ + return success(mailTempleService.createMailTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改邮件模版") + @PreAuthorize("@ss.hasPermission('system:mail-template:update')") + public CommonResult updateMailTemplate(@Valid @RequestBody MailTemplateSaveReqVO updateReqVO){ + mailTempleService.updateMailTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除邮件模版") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-template:delete')") + public CommonResult deleteMailTemplate(@RequestParam("id") Long id) { + mailTempleService.deleteMailTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得邮件模版") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-template:query')") + public CommonResult getMailTemplate(@RequestParam("id") Long id) { + MailTemplateDO template = mailTempleService.getMailTemplate(id); + return success(BeanUtils.toBean(template, MailTemplateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得邮件模版分页") + @PreAuthorize("@ss.hasPermission('system:mail-template:query')") + public CommonResult> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) { + PageResult pageResult = mailTempleService.getMailTemplatePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MailTemplateRespVO.class)); + } + + @GetMapping({"/list-all-simple", "simple-list"}) + @Operation(summary = "获得邮件模版精简列表") + public CommonResult> getSimpleTemplateList() { + List list = mailTempleService.getMailTemplateList(); + return success(BeanUtils.toBean(list, MailTemplateSimpleRespVO.class)); + } + + @PostMapping("/send-mail") + @Operation(summary = "发送短信") + @PreAuthorize("@ss.hasPermission('system:mail-template:send-mail')") + public CommonResult sendMail(@Valid @RequestBody MailTemplateSendReqVO sendReqVO) { + return success(mailSendService.sendSingleMailToAdmin(sendReqVO.getMail(), getLoginUserId(), + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java new file mode 100644 index 0000000..1e7f709 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.system.controller.admin.mail.vo.account; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 邮箱账号分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailAccountPageReqVO extends PageParam { + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma@123.com") + private String mail; + + @Schema(description = "用户名" , requiredMode = Schema.RequiredMode.REQUIRED , example = "win") + private String username; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java new file mode 100644 index 0000000..4a7aa1a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java @@ -0,0 +1,39 @@ +package com.win.module.system.controller.admin.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 邮箱账号 Response VO") +@Data +public class MailAccountRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma@123.com") + private String mail; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + private String password; + + @Schema(description = "SMTP 服务器域名", requiredMode = Schema.RequiredMode.REQUIRED, example = "www.iocoder.cn") + private String host; + + @Schema(description = "SMTP 服务器端口", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") + private Integer port; + + @Schema(description = "是否开启 ssl", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean sslEnable; + + @Schema(description = "是否开启 starttls", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean starttlsEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java new file mode 100644 index 0000000..22cb49b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java @@ -0,0 +1,45 @@ +package com.win.module.system.controller.admin.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 邮箱账号创建/修改 Request VO") +@Data +public class MailAccountSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma@123.com") + @NotNull(message = "邮箱不能为空") + @Email(message = "必须是 Email 格式") + private String mail; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "用户名不能为空") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotNull(message = "密码必填") + private String password; + + @Schema(description = "SMTP 服务器域名", requiredMode = Schema.RequiredMode.REQUIRED, example = "www.iocoder.cn") + @NotNull(message = "SMTP 服务器域名不能为空") + private String host; + + @Schema(description = "SMTP 服务器端口", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") + @NotNull(message = "SMTP 服务器端口不能为空") + private Integer port; + + @Schema(description = "是否开启 ssl", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否开启 ssl 必填") + private Boolean sslEnable; + + @Schema(description = "是否开启 starttls", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否开启 starttls 必填") + private Boolean starttlsEnable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java new file mode 100644 index 0000000..2c8d9fa --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.admin.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 邮箱账号的精简 Response VO") +@Data +public class MailAccountSimpleRespVO { + + @Schema(description = "邮箱编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "768541388@qq.com") + private String mail; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java new file mode 100644 index 0000000..fe7e543 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.system.controller.admin.mail.vo.log; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邮箱日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "30883") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", example = "2") + private Integer userType; + + @Schema(description = "接收邮箱地址,模糊匹配", example = "76854@qq.com") + private String toMail; + + @Schema(description = "邮箱账号编号", example = "18107") + private Long accountId; + + @Schema(description = "模板编号", example = "5678") + private Long templateId; + + @Schema(description = "发送状态,参见 MailSendStatusEnum 枚举", example = "1") + private Integer sendStatus; + + @Schema(description = "发送时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] sendTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogRespVO.java new file mode 100644 index 0000000..73c6491 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/log/MailLogRespVO.java @@ -0,0 +1,67 @@ +package com.win.module.system.controller.admin.mail.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.Map; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邮件日志 Response VO") +@Data +public class MailLogRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31020") + private Long id; + + @Schema(description = "用户编号", example = "30883") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", example = "2") + private Byte userType; + + @Schema(description = "接收邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "76854@qq.com") + private String toMail; + + @Schema(description = "邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18107") + private Long accountId; + + @Schema(description = "发送邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "85757@qq.com") + private String fromMail; + + @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5678") + private Long templateId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + private String templateCode; + + @Schema(description = "模版发送人名称", example = "李四") + private String templateNickname; + + @Schema(description = "邮件标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试标题") + private String templateTitle; + + @Schema(description = "邮件内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试内容") + private String templateContent; + + @Schema(description = "邮件参数", requiredMode = Schema.RequiredMode.REQUIRED) + private Map templateParams; + + @Schema(description = "发送状态,参见 MailSendStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Byte sendStatus; + + @Schema(description = "发送时间") + private LocalDateTime sendTime; + + @Schema(description = "发送返回的消息 ID", example = "28568") + private String sendMessageId; + + @Schema(description = "发送异常") + private String sendException; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java new file mode 100644 index 0000000..9ba0e45 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.admin.mail.vo.template; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邮件模版分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailTemplatePageReqVO extends PageParam { + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1") + private Integer status; + + @Schema(description = "标识,模糊匹配", example = "code_1024") + private String code; + + @Schema(description = "名称,模糊匹配", example = "芋头") + private String name; + + @Schema(description = "账号编号", example = "2048") + private Long accountId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java new file mode 100644 index 0000000..36279c2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.admin.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 邮件末班 Response VO") +@Data +public class MailTemplateRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试名字") + private String name; + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") + private String code; + + @Schema(description = "发送的邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long accountId; + + @Schema(description = "发送人名称", example = "芋头") + private String nickname; + + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "注册成功") + private String title; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,注册成功啦") + private String content; + + @Schema(description = "参数数组", example = "name,code") + private List params; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "备注", example = "奥特曼") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java new file mode 100644 index 0000000..aa30fa9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.admin.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 邮件模版创建/修改 Request VO") +@Data +public class MailTemplateSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试名字") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") + @NotNull(message = "模版编号不能为空") + private String code; + + @Schema(description = "发送的邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "发送的邮箱账号编号不能为空") + private Long accountId; + + @Schema(description = "发送人名称", example = "芋头") + private String nickname; + + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "注册成功") + @NotEmpty(message = "标题不能为空") + private String title; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,注册成功啦") + @NotEmpty(message = "内容不能为空") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "奥特曼") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java new file mode 100644 index 0000000..5eff69c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.admin.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 邮件发送 Req VO") +@Data +public class MailTemplateSendReqVO { + + @Schema(description = "接收邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "7685413@qq.com") + @NotEmpty(message = "接收邮箱不能为空") + private String mail; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模板参数") + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java new file mode 100644 index 0000000..09bca31 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.admin.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 邮件模版的精简 Response VO") +@Data +public class MailTemplateSimpleRespVO { + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "模版名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "哒哒哒") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/NoticeController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/NoticeController.java new file mode 100644 index 0000000..c7a1143 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/NoticeController.java @@ -0,0 +1,92 @@ +package com.win.module.system.controller.admin.notice; + +import cn.hutool.core.lang.Assert; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.infra.api.websocket.WebSocketSenderApi; +import com.win.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.win.module.system.controller.admin.notice.vo.NoticeRespVO; +import com.win.module.system.controller.admin.notice.vo.NoticeSaveReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; +import com.win.module.system.service.notice.NoticeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 通知公告") +@RestController +@RequestMapping("/system/notice") +@Validated +public class NoticeController { + + @Resource + private NoticeService noticeService; + + @Resource + private WebSocketSenderApi webSocketSenderApi; + + @PostMapping("/create") + @Operation(summary = "创建通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:create')") + public CommonResult createNotice(@Valid @RequestBody NoticeSaveReqVO createReqVO) { + Long noticeId = noticeService.createNotice(createReqVO); + return success(noticeId); + } + + @PutMapping("/update") + @Operation(summary = "修改通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:update')") + public CommonResult updateNotice(@Valid @RequestBody NoticeSaveReqVO updateReqVO) { + noticeService.updateNotice(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除通知公告") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notice:delete')") + public CommonResult deleteNotice(@RequestParam("id") Long id) { + noticeService.deleteNotice(id); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获取通知公告列表") + @PreAuthorize("@ss.hasPermission('system:notice:query')") + public CommonResult> getNoticePage(@Validated NoticePageReqVO pageReqVO) { + PageResult pageResult = noticeService.getNoticePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, NoticeRespVO.class)); + } + + @GetMapping("/get") + @Operation(summary = "获得通知公告") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notice:query')") + public CommonResult getNotice(@RequestParam("id") Long id) { + NoticeDO notice = noticeService.getNotice(id); + return success(BeanUtils.toBean(notice, NoticeRespVO.class)); + } + + @PostMapping("/push") + @Operation(summary = "推送通知公告", description = "只发送给 websocket 连接在线的用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notice:update')") + public CommonResult push(@RequestParam("id") Long id) { + NoticeDO notice = noticeService.getNotice(id); + Assert.notNull(notice, "公告不能为空"); + // 通过 websocket 推送给在线的用户 + webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), "notice-push", notice); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticePageReqVO.java new file mode 100644 index 0000000..9ac3c4d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticePageReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.admin.notice.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 通知公告分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticePageReqVO extends PageParam { + + @Schema(description = "通知公告名称,模糊匹配", example = "芋道") + private String title; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeRespVO.java new file mode 100644 index 0000000..b444a6e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeRespVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.admin.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 通知公告信息 Response VO") +@Data +public class NoticeRespVO { + + @Schema(description = "通知公告序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "公告标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + private String title; + + @Schema(description = "公告类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + private Integer type; + + @Schema(description = "公告内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "半生编码") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeSaveReqVO.java new file mode 100644 index 0000000..80c250f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notice/vo/NoticeSaveReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.admin.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 通知公告创建/修改 Request VO") +@Data +public class NoticeSaveReqVO { + + @Schema(description = "岗位公告编号", example = "1024") + private Long id; + + @Schema(description = "公告标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + @NotBlank(message = "公告标题不能为空") + @Size(max = 50, message = "公告标题不能超过50个字符") + private String title; + + @Schema(description = "公告类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + @NotNull(message = "公告类型不能为空") + private Integer type; + + @Schema(description = "公告内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "半生编码") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyMessageController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyMessageController.java new file mode 100644 index 0000000..399bdfd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyMessageController.java @@ -0,0 +1,98 @@ +package com.win.module.system.controller.admin.notify; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessageRespVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import com.win.module.system.service.notify.NotifyMessageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 我的站内信") +@RestController +@RequestMapping("/system/notify-message") +@Validated +public class NotifyMessageController { + + @Resource + private NotifyMessageService notifyMessageService; + + // ========== 管理所有的站内信 ========== + + @GetMapping("/get") + @Operation(summary = "获得站内信") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notify-message:query')") + public CommonResult getNotifyMessage(@RequestParam("id") Long id) { + NotifyMessageDO message = notifyMessageService.getNotifyMessage(id); + return success(BeanUtils.toBean(message, NotifyMessageRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得站内信分页") + @PreAuthorize("@ss.hasPermission('system:notify-message:query')") + public CommonResult> getNotifyMessagePage(@Valid NotifyMessagePageReqVO pageVO) { + PageResult pageResult = notifyMessageService.getNotifyMessagePage(pageVO); + return success(BeanUtils.toBean(pageResult, NotifyMessageRespVO.class)); + } + + // ========== 查看自己的站内信 ========== + + @GetMapping("/my-page") + @Operation(summary = "获得我的站内信分页") + public CommonResult> getMyMyNotifyMessagePage(@Valid NotifyMessageMyPageReqVO pageVO) { + PageResult pageResult = notifyMessageService.getMyMyNotifyMessagePage(pageVO, + getLoginUserId(), UserTypeEnum.ADMIN.getValue()); + return success(BeanUtils.toBean(pageResult, NotifyMessageRespVO.class)); + } + + @PutMapping("/update-read") + @Operation(summary = "标记站内信为已读") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + public CommonResult updateNotifyMessageRead(@RequestParam("ids") List ids) { + notifyMessageService.updateNotifyMessageRead(ids, getLoginUserId(), UserTypeEnum.ADMIN.getValue()); + return success(Boolean.TRUE); + } + + @PutMapping("/update-all-read") + @Operation(summary = "标记所有站内信为已读") + public CommonResult updateAllNotifyMessageRead() { + notifyMessageService.updateAllNotifyMessageRead(getLoginUserId(), UserTypeEnum.ADMIN.getValue()); + return success(Boolean.TRUE); + } + + @GetMapping("/get-unread-list") + @Operation(summary = "获取当前用户的最新站内信列表,默认 10 条") + @Parameter(name = "size", description = "10") + public CommonResult> getUnreadNotifyMessageList( + @RequestParam(name = "size", defaultValue = "10") Integer size) { + List list = notifyMessageService.getUnreadNotifyMessageList( + getLoginUserId(), UserTypeEnum.ADMIN.getValue(), size); + return success(BeanUtils.toBean(list, NotifyMessageRespVO.class)); + } + + @GetMapping("/get-unread-count") + @Operation(summary = "获得当前用户的未读站内信数量") + @ApiAccessLog(enable = false) // 由于前端会不断轮询该接口,记录日志没有意义 + public CommonResult getUnreadNotifyMessageCount() { + return success(notifyMessageService.getUnreadNotifyMessageCount( + getLoginUserId(), UserTypeEnum.ADMIN.getValue())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyTemplateController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyTemplateController.java new file mode 100644 index 0000000..3e6abc4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/NotifyTemplateController.java @@ -0,0 +1,88 @@ +package com.win.module.system.controller.admin.notify; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.notify.vo.template.*; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.win.module.system.service.notify.NotifySendService; +import com.win.module.system.service.notify.NotifyTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 站内信模版") +@RestController +@RequestMapping("/system/notify-template") +@Validated +public class NotifyTemplateController { + + @Resource + private NotifyTemplateService notifyTemplateService; + + @Resource + private NotifySendService notifySendService; + + @PostMapping("/create") + @Operation(summary = "创建站内信模版") + @PreAuthorize("@ss.hasPermission('system:notify-template:create')") + public CommonResult createNotifyTemplate(@Valid @RequestBody NotifyTemplateSaveReqVO createReqVO) { + return success(notifyTemplateService.createNotifyTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新站内信模版") + @PreAuthorize("@ss.hasPermission('system:notify-template:update')") + public CommonResult updateNotifyTemplate(@Valid @RequestBody NotifyTemplateSaveReqVO updateReqVO) { + notifyTemplateService.updateNotifyTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除站内信模版") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:notify-template:delete')") + public CommonResult deleteNotifyTemplate(@RequestParam("id") Long id) { + notifyTemplateService.deleteNotifyTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得站内信模版") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notify-template:query')") + public CommonResult getNotifyTemplate(@RequestParam("id") Long id) { + NotifyTemplateDO template = notifyTemplateService.getNotifyTemplate(id); + return success(BeanUtils.toBean(template, NotifyTemplateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得站内信模版分页") + @PreAuthorize("@ss.hasPermission('system:notify-template:query')") + public CommonResult> getNotifyTemplatePage(@Valid NotifyTemplatePageReqVO pageVO) { + PageResult pageResult = notifyTemplateService.getNotifyTemplatePage(pageVO); + return success(BeanUtils.toBean(pageResult, NotifyTemplateRespVO.class)); + } + + @PostMapping("/send-notify") + @Operation(summary = "发送站内信") + @PreAuthorize("@ss.hasPermission('system:notify-template:send-notify')") + public CommonResult sendNotify(@Valid @RequestBody NotifyTemplateSendReqVO sendReqVO) { + if (UserTypeEnum.MEMBER.getValue().equals(sendReqVO.getUserType())) { + return success(notifySendService.sendSingleNotifyToMember(sendReqVO.getUserId(), + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } else { + return success(notifySendService.sendSingleNotifyToAdmin(sendReqVO.getUserId(), + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageMyPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageMyPageReqVO.java new file mode 100644 index 0000000..277707d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageMyPageReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.system.controller.admin.notify.vo.message; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 站内信分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyMessageMyPageReqVO extends PageParam { + + @Schema(description = "是否已读", example = "true") + private Boolean readStatus; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessagePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessagePageReqVO.java new file mode 100644 index 0000000..a7c46b5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessagePageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.admin.notify.vo.message; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 站内信分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyMessagePageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "25025") + private Long userId; + + @Schema(description = "用户类型", example = "1") + private Integer userType; + + @Schema(description = "模板编码", example = "test_01") + private String templateCode; + + @Schema(description = "模版类型", example = "2") + private Integer templateType; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageRespVO.java new file mode 100644 index 0000000..aa906d5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/message/NotifyMessageRespVO.java @@ -0,0 +1,49 @@ +package com.win.module.system.controller.admin.notify.vo.message; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Map; + +@Schema(description = "管理后台 - 站内信 Response VO") +@Data +public class NotifyMessageRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25025") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Byte userType; + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13013") + private Long templateId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + private String templateCode; + + @Schema(description = "模版发送人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String templateNickname; + + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试内容") + private String templateContent; + + @Schema(description = "模版类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer templateType; + + @Schema(description = "模版参数", requiredMode = Schema.RequiredMode.REQUIRED) + private Map templateParams; + + @Schema(description = "是否已读", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean readStatus; + + @Schema(description = "阅读时间") + private LocalDateTime readTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplatePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplatePageReqVO.java new file mode 100644 index 0000000..94ebc58 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplatePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.admin.notify.vo.template; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 站内信模版分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyTemplatePageReqVO extends PageParam { + + @Schema(description = "模版编码", example = "test_01") + private String code; + + @Schema(description = "模版名称", example = "我是名称") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateRespVO.java new file mode 100644 index 0000000..3d8632a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateRespVO.java @@ -0,0 +1,43 @@ +package com.win.module.system.controller.admin.notify.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 站内信模版 Response VO") +@Data +public class NotifyTemplateRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试模版") + private String name; + + @Schema(description = "模版编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SEND_TEST") + private String code; + + @Schema(description = "模版类型,对应 system_notify_template_type 字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + + @Schema(description = "发送人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + private String nickname; + + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是模版内容") + private String content; + + @Schema(description = "参数数组", example = "name,code") + private List params; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "备注", example = "我是备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSaveReqVO.java new file mode 100644 index 0000000..3f8abbe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSaveReqVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.admin.notify.vo.template; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 站内信模版创建/修改 Request VO") +@Data +public class NotifyTemplateSaveReqVO { + + @Schema(description = "ID", example = "1024") + private Long id; + + @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试模版") + @NotEmpty(message = "模版名称不能为空") + private String name; + + @Schema(description = "模版编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SEND_TEST") + @NotNull(message = "模版编码不能为空") + private String code; + + @Schema(description = "模版类型,对应 system_notify_template_type 字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "模版类型不能为空") + private Integer type; + + @Schema(description = "发送人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + @NotEmpty(message = "发送人名称不能为空") + private String nickname; + + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是模版内容") + @NotEmpty(message = "模版内容不能为空") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") + private Integer status; + + @Schema(description = "备注", example = "我是备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSendReqVO.java new file mode 100644 index 0000000..7d63715 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/notify/vo/template/NotifyTemplateSendReqVO.java @@ -0,0 +1,29 @@ +package com.win.module.system.controller.admin.notify.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 站内信模板的发送 Request VO") +@Data +public class NotifyTemplateSendReqVO { + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "01") + @NotNull(message = "用户id不能为空") + private Long userId; + + @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "用户类型不能为空") + private Integer userType; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "01") + @NotEmpty(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模板参数") + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.http new file mode 100644 index 0000000..dcf60a6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.http @@ -0,0 +1,23 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/system/oauth2-client/create +Content-Type: application/json +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +{ + "id": "1", + "secret": "admin123", + "name": "芋道源码", + "logo": "https://www.iocoder.cn/images/favicon.ico", + "description": "我是描述", + "status": 0, + "accessTokenValiditySeconds": 180, + "refreshTokenValiditySeconds": 8640, + "redirectUris": ["https://www.iocoder.cn"], + "autoApprove": true, + "authorizedGrantTypes": ["password"], + "scopes": ["user_info"], + "authorities": ["system:user:query"], + "resource_ids": ["1024"], + "additionalInformation": "{}" +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.java new file mode 100644 index 0000000..50349b8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2ClientController.java @@ -0,0 +1,73 @@ +package com.win.module.system.controller.admin.oauth2; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientRespVO; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientSaveReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.service.oauth2.OAuth2ClientService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - OAuth2 客户端") +@RestController +@RequestMapping("/system/oauth2-client") +@Validated +public class OAuth2ClientController { + + @Resource + private OAuth2ClientService oAuth2ClientService; + + @PostMapping("/create") + @Operation(summary = "创建 OAuth2 客户端") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:create')") + public CommonResult createOAuth2Client(@Valid @RequestBody OAuth2ClientSaveReqVO createReqVO) { + return success(oAuth2ClientService.createOAuth2Client(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新 OAuth2 客户端") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:update')") + public CommonResult updateOAuth2Client(@Valid @RequestBody OAuth2ClientSaveReqVO updateReqVO) { + oAuth2ClientService.updateOAuth2Client(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除 OAuth2 客户端") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:oauth2-client:delete')") + public CommonResult deleteOAuth2Client(@RequestParam("id") Long id) { + oAuth2ClientService.deleteOAuth2Client(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得 OAuth2 客户端") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") + public CommonResult getOAuth2Client(@RequestParam("id") Long id) { + OAuth2ClientDO client = oAuth2ClientService.getOAuth2Client(id); + return success(BeanUtils.toBean(client, OAuth2ClientRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得 OAuth2 客户端分页") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") + public CommonResult> getOAuth2ClientPage(@Valid OAuth2ClientPageReqVO pageVO) { + PageResult pageResult = oAuth2ClientService.getOAuth2ClientPage(pageVO); + return success(BeanUtils.toBean(pageResult, OAuth2ClientRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.http new file mode 100644 index 0000000..725a5d4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.http @@ -0,0 +1,54 @@ +### 请求 /system/oauth2/authorize 接口 => 成功 +GET {{baseUrl}}/system/oauth2/authorize?clientId=default +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/authorize + token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/authorize +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +response_type=token&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=true + +### 请求 /system/oauth2/authorize + code 接口 => 成功 +POST {{baseUrl}}/system/oauth2/authorize +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +response_type=code&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=false + +### 请求 /system/oauth2/token + code 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=authorization_code&redirect_uri=https://www.iocoder.cn&code=189956c07a174588a97157eabef2f93a + +### 请求 /system/oauth2/token + password 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=password&username=admin&password=admin123&scope=user.read + +### 请求 /system/oauth2/token + refresh_token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=refresh_token&refresh_token=00895465d6994f72a9d926ceeed0f588 + +### 请求 /system/oauth2/token + DELETE 接口 => 成功 +DELETE {{baseUrl}}/system/oauth2/token?token=ca8a188f464441d6949c51493a2b7596 +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/check-token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/check-token?token=620d307c5b4148df8a98dd6c6c547106 +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.java new file mode 100644 index 0000000..ca17425 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2OpenController.java @@ -0,0 +1,297 @@ +package com.win.module.system.controller.admin.oauth2; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.win.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.win.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.win.module.system.convert.oauth2.OAuth2OpenConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.win.module.system.service.oauth2.OAuth2ApproveService; +import com.win.module.system.service.oauth2.OAuth2ClientService; +import com.win.module.system.service.oauth2.OAuth2GrantService; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import com.win.module.system.util.oauth2.OAuth2Utils; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.Operation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 一般来说,管理后台的 /system-api/* 是不直接提供给外部应用使用,主要是外部应用能够访问的数据与接口是有限的,而管理后台的 RBAC 无法很好的控制。 + * 参考大量的开放平台,都是独立的一套 OpenAPI,对应到【本系统】就是在 Controller 下新建 open 包,实现 /open-api/* 接口,然后通过 scope 进行控制。 + * 另外,一个公司如果有多个管理后台,它们 client_id 产生的 access token 相互之间是无法互通的,即无法访问它们系统的 API 接口,直到两个 client_id 产生信任授权。 + * + * 考虑到【本系统】暂时不想做的过于复杂,默认只有获取到 access token 之后,可以访问【本系统】管理后台的 /system-api/* 所有接口,除非手动添加 scope 控制。 + * scope 的使用示例,可见 {@link OAuth2UserController} 类 + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - OAuth2.0 授权") +@RestController +@RequestMapping("/system/oauth2") +@Validated +@Slf4j +public class OAuth2OpenController { + + @Resource + private OAuth2GrantService oauth2GrantService; + @Resource + private OAuth2ClientService oauth2ClientService; + @Resource + private OAuth2ApproveService oauth2ApproveService; + @Resource + private OAuth2TokenService oauth2TokenService; + + /** + * 对应 Spring Security OAuth 的 TokenEndpoint 类的 postAccessToken 方法 + * + * 授权码 authorization_code 模式时:code + redirectUri + state 参数 + * 密码 password 模式时:username + password + scope 参数 + * 刷新 refresh_token 模式时:refreshToken 参数 + * 客户端 client_credentials 模式:scope 参数 + * 简化 implicit 模式时:不支持 + * + * 注意,默认需要传递 client_id + client_secret 参数 + */ + @PostMapping("/token") + @PermitAll + @Operation(summary = "获得访问令牌", description = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用") + @Parameters({ + @Parameter(name = "grant_type", required = true, description = "授权类型", example = "code"), + @Parameter(name = "code", description = "授权范围", example = "userinfo.read"), + @Parameter(name = "redirect_uri", description = "重定向 URI", example = "https://www.iocoder.cn"), + @Parameter(name = "state", description = "状态", example = "1"), + @Parameter(name = "username", example = "tudou"), + @Parameter(name = "password", example = "cai"), // 多个使用空格分隔 + @Parameter(name = "scope", example = "user_info"), + @Parameter(name = "refresh_token", example = "123424233"), + }) + public CommonResult postAccessToken(HttpServletRequest request, + @RequestParam("grant_type") String grantType, + @RequestParam(value = "code", required = false) String code, // 授权码模式 + @RequestParam(value = "redirect_uri", required = false) String redirectUri, // 授权码模式 + @RequestParam(value = "state", required = false) String state, // 授权码模式 + @RequestParam(value = "username", required = false) String username, // 密码模式 + @RequestParam(value = "password", required = false) String password, // 密码模式 + @RequestParam(value = "scope", required = false) String scope, // 密码模式 + @RequestParam(value = "refresh_token", required = false) String refreshToken) { // 刷新模式 + List scopes = OAuth2Utils.buildScopes(scope); + // 1.1 校验授权类型 + OAuth2GrantTypeEnum grantTypeEnum = OAuth2GrantTypeEnum.getByGrantType(grantType); + if (grantTypeEnum == null) { + throw exception0(BAD_REQUEST.getCode(), StrUtil.format("未知授权类型({})", grantType)); + } + if (grantTypeEnum == OAuth2GrantTypeEnum.IMPLICIT) { + throw exception0(BAD_REQUEST.getCode(), "Token 接口不支持 implicit 授权模式"); + } + + // 1.2 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + grantType, scopes, redirectUri); + + // 2. 根据授权模式,获取访问令牌 + OAuth2AccessTokenDO accessTokenDO; + switch (grantTypeEnum) { + case AUTHORIZATION_CODE: + accessTokenDO = oauth2GrantService.grantAuthorizationCodeForAccessToken(client.getClientId(), code, redirectUri, state); + break; + case PASSWORD: + accessTokenDO = oauth2GrantService.grantPassword(username, password, client.getClientId(), scopes); + break; + case CLIENT_CREDENTIALS: + accessTokenDO = oauth2GrantService.grantClientCredentials(client.getClientId(), scopes); + break; + case REFRESH_TOKEN: + accessTokenDO = oauth2GrantService.grantRefreshToken(refreshToken, client.getClientId()); + break; + default: + throw new IllegalArgumentException("未知授权类型:" + grantType); + } + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + return success(OAuth2OpenConvert.INSTANCE.convert(accessTokenDO)); + } + + @DeleteMapping("/token") + @PermitAll + @Operation(summary = "删除访问令牌") + @Parameter(name = "token", required = true, description = "访问令牌", example = "biu") + public CommonResult revokeToken(HttpServletRequest request, + @RequestParam("token") String token) { + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + null, null, null); + + // 删除访问令牌 + return success(oauth2GrantService.revokeToken(client.getClientId(), token)); + } + + /** + * 对应 Spring Security OAuth 的 CheckTokenEndpoint 类的 checkToken 方法 + */ + @PostMapping("/check-token") + @PermitAll + @Operation(summary = "校验访问令牌") + @Parameter(name = "token", required = true, description = "访问令牌", example = "biu") + public CommonResult checkToken(HttpServletRequest request, + @RequestParam("token") String token) { + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + null, null, null); + + // 校验令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.checkAccessToken(token); + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + return success(OAuth2OpenConvert.INSTANCE.convert2(accessTokenDO)); + } + + /** + * 对应 Spring Security OAuth 的 AuthorizationEndpoint 类的 authorize 方法 + */ + @GetMapping("/authorize") + @Operation(summary = "获得授权信息", description = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用") + @Parameter(name = "clientId", required = true, description = "客户端编号", example = "tudou") + public CommonResult authorize(@RequestParam("clientId") String clientId) { + // 0. 校验用户已经登录。通过 Spring Security 实现 + + // 1. 获得 Client 客户端的信息 + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientId); + // 2. 获得用户已经授权的信息 + List approves = oauth2ApproveService.getApproveList(getLoginUserId(), getUserType(), clientId); + // 拼接返回 + return success(OAuth2OpenConvert.INSTANCE.convert(client, approves)); + } + + /** + * 对应 Spring Security OAuth 的 AuthorizationEndpoint 类的 approveOrDeny 方法 + * + * 场景一:【自动授权 autoApprove = true】 + * 刚进入 sso.vue 界面,调用该接口,用户历史已经给该应用做过对应的授权,或者 OAuth2Client 支持该 scope 的自动授权 + * 场景二:【手动授权 autoApprove = false】 + * 在 sso.vue 界面,用户选择好 scope 授权范围,调用该接口,进行授权。此时,approved 为 true 或者 false + * + * 因为前后端分离,Axios 无法很好的处理 302 重定向,所以和 Spring Security OAuth 略有不同,返回结果是重定向的 URL,剩余交给前端处理 + */ + @PostMapping("/authorize") + @Operation(summary = "申请授权", description = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【提交】调用") + @Parameters({ + @Parameter(name = "response_type", required = true, description = "响应类型", example = "code"), + @Parameter(name = "client_id", required = true, description = "客户端编号", example = "tudou"), + @Parameter(name = "scope", description = "授权范围", example = "userinfo.read"), // 使用 Map 格式,Spring MVC 暂时不支持这么接收参数 + @Parameter(name = "redirect_uri", required = true, description = "重定向 URI", example = "https://www.iocoder.cn"), + @Parameter(name = "auto_approve", required = true, description = "用户是否接受", example = "true"), + @Parameter(name = "state", example = "1") + }) + public CommonResult approveOrDeny(@RequestParam("response_type") String responseType, + @RequestParam("client_id") String clientId, + @RequestParam(value = "scope", required = false) String scope, + @RequestParam("redirect_uri") String redirectUri, + @RequestParam(value = "auto_approve") Boolean autoApprove, + @RequestParam(value = "state", required = false) String state) { + @SuppressWarnings("unchecked") + Map scopes = JsonUtils.parseObject(scope, Map.class); + scopes = ObjectUtil.defaultIfNull(scopes, Collections.emptyMap()); + // 0. 校验用户已经登录。通过 Spring Security 实现 + + // 1.1 校验 responseType 是否满足 code 或者 token 值 + OAuth2GrantTypeEnum grantTypeEnum = getGrantTypeEnum(responseType); + // 1.2 校验 redirectUri 重定向域名是否合法 + 校验 scope 是否在 Client 授权范围内 + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientId, null, + grantTypeEnum.getGrantType(), scopes.keySet(), redirectUri); + + // 2.1 假设 approved 为 null,说明是场景一 + if (Boolean.TRUE.equals(autoApprove)) { + // 如果无法自动授权通过,则返回空 url,前端不进行跳转 + if (!oauth2ApproveService.checkForPreApproval(getLoginUserId(), getUserType(), clientId, scopes.keySet())) { + return success(null); + } + } else { // 2.2 假设 approved 非 null,说明是场景二 + // 如果计算后不通过,则跳转一个错误链接 + if (!oauth2ApproveService.updateAfterApproval(getLoginUserId(), getUserType(), clientId, scopes)) { + return success(OAuth2Utils.buildUnsuccessfulRedirect(redirectUri, responseType, state, + "access_denied", "User denied access")); + } + } + + // 3.1 如果是 code 授权码模式,则发放 code 授权码,并重定向 + List approveScopes = convertList(scopes.entrySet(), Map.Entry::getKey, Map.Entry::getValue); + if (grantTypeEnum == OAuth2GrantTypeEnum.AUTHORIZATION_CODE) { + return success(getAuthorizationCodeRedirect(getLoginUserId(), client, approveScopes, redirectUri, state)); + } + // 3.2 如果是 token 则是 implicit 简化模式,则发送 accessToken 访问令牌,并重定向 + return success(getImplicitGrantRedirect(getLoginUserId(), client, approveScopes, redirectUri, state)); + } + + private static OAuth2GrantTypeEnum getGrantTypeEnum(String responseType) { + if (StrUtil.equals(responseType, "code")) { + return OAuth2GrantTypeEnum.AUTHORIZATION_CODE; + } + if (StrUtil.equalsAny(responseType, "token")) { + return OAuth2GrantTypeEnum.IMPLICIT; + } + throw exception0(BAD_REQUEST.getCode(), "response_type 参数值只允许 code 和 token"); + } + + private String getImplicitGrantRedirect(Long userId, OAuth2ClientDO client, + List scopes, String redirectUri, String state) { + // 1. 创建 access token 访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2GrantService.grantImplicit(userId, getUserType(), client.getClientId(), scopes); + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + // 2. 拼接重定向的 URL + // noinspection unchecked + return OAuth2Utils.buildImplicitRedirectUri(redirectUri, accessTokenDO.getAccessToken(), state, accessTokenDO.getExpiresTime(), + scopes, JsonUtils.parseObject(client.getAdditionalInformation(), Map.class)); + } + + private String getAuthorizationCodeRedirect(Long userId, OAuth2ClientDO client, + List scopes, String redirectUri, String state) { + // 1. 创建 code 授权码 + String authorizationCode = oauth2GrantService.grantAuthorizationCodeForCode(userId, getUserType(), client.getClientId(), scopes, + redirectUri, state); + // 2. 拼接重定向的 URL + return OAuth2Utils.buildAuthorizationCodeRedirectUri(redirectUri, authorizationCode, state); + } + + private Integer getUserType() { + return UserTypeEnum.ADMIN.getValue(); + } + + private String[] obtainBasicAuthorization(HttpServletRequest request) { + String[] clientIdAndSecret = HttpUtils.obtainBasicAuthorization(request); + if (ArrayUtil.isEmpty(clientIdAndSecret) || clientIdAndSecret.length != 2) { + throw exception0(BAD_REQUEST.getCode(), "client_id 或 client_secret 未正确传递"); + } + return clientIdAndSecret; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2TokenController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2TokenController.java new file mode 100644 index 0000000..2c8e013 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2TokenController.java @@ -0,0 +1,50 @@ +package com.win.module.system.controller.admin.oauth2; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenRespVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.service.auth.AdminAuthService; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - OAuth2.0 令牌") +@RestController +@RequestMapping("/system/oauth2-token") +public class OAuth2TokenController { + + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private AdminAuthService authService; + + @GetMapping("/page") + @Operation(summary = "获得访问令牌分页", description = "只返回有效期内的") + @PreAuthorize("@ss.hasPermission('system:oauth2-token:page')") + public CommonResult> getAccessTokenPage(@Valid OAuth2AccessTokenPageReqVO reqVO) { + PageResult pageResult = oauth2TokenService.getAccessTokenPage(reqVO); + return success(BeanUtils.toBean(pageResult, OAuth2AccessTokenRespVO.class)); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除访问令牌") + @Parameter(name = "accessToken", description = "访问令牌", required = true, example = "tudou") + @PreAuthorize("@ss.hasPermission('system:oauth2-token:delete')") + public CommonResult deleteAccessToken(@RequestParam("accessToken") String accessToken) { + authService.logout(accessToken, LoginLogTypeEnum.LOGOUT_DELETE.getType()); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.http new file mode 100644 index 0000000..13c8545 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.http @@ -0,0 +1,14 @@ +### 请求 /system/oauth2/user/get 接口 => 成功 +GET {{baseUrl}}/system/oauth2/user/get +Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/user/update 接口 => 成功 +PUT {{baseUrl}}/system/oauth2/user/update +Content-Type: application/json +Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d +tenant-id: {{adminTenentId}} + +{ + "nickname": "芋道源码" +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.java new file mode 100644 index 0000000..0d49945 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/OAuth2UserController.java @@ -0,0 +1,81 @@ +package com.win.module.system.controller.admin.oauth2; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.win.module.system.controller.admin.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.dept.PostService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 1. 在 getUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.read')") 注解,声明需要满足 scope = user.read + * 2. 在 updateUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.write')") 注解,声明需要满足 scope = user.write + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - OAuth2.0 用户") +@RestController +@RequestMapping("/system/oauth2/user") +@Validated +@Slf4j +public class OAuth2UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + + @GetMapping("/get") + @Operation(summary = "获得用户基本信息") + @PreAuthorize("@ss.hasScope('user.read')") // + public CommonResult getUserInfo() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + OAuth2UserInfoRespVO resp = BeanUtils.toBean(user, OAuth2UserInfoRespVO.class); + // 获得部门信息 + if (user.getDeptId() != null) { + DeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(BeanUtils.toBean(dept, OAuth2UserInfoRespVO.Dept.class)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPostList(user.getPostIds()); + resp.setPosts(BeanUtils.toBean(posts, OAuth2UserInfoRespVO.Post.class)); + } + return success(resp); + } + + @PutMapping("/update") + @Operation(summary = "更新用户基本信息") + @PreAuthorize("@ss.hasScope('user.write')") + public CommonResult updateUserInfo(@Valid @RequestBody OAuth2UserUpdateReqVO reqVO) { + // 这里将 UserProfileUpdateReqVO =》UserProfileUpdateReqVO 对象,实现接口的复用。 + // 主要是,AdminUserService 没有自己的 BO 对象,所以复用只能这么做 + userService.updateUserProfile(getLoginUserId(), BeanUtils.toBean(reqVO, UserProfileUpdateReqVO.class)); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java new file mode 100644 index 0000000..0bf3bdf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.admin.oauth2.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import com.win.framework.common.pojo.PageParam; + +@Schema(description = "管理后台 - OAuth2 客户端分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientPageReqVO extends PageParam { + + @Schema(description = "应用名,模糊匹配", example = "土豆") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java new file mode 100644 index 0000000..3dfea77 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java @@ -0,0 +1,64 @@ +package com.win.module.system.controller.admin.oauth2.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - OAuth2 客户端 Response VO") +@Data +public class OAuth2ClientRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + private String clientId; + + @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "fan") + private String secret; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + private String name; + + @Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") + private String logo; + + @Schema(description = "应用描述", example = "我是一个应用") + private String description; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "访问令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640") + private Integer accessTokenValiditySeconds; + + @Schema(description = "刷新令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640000") + private Integer refreshTokenValiditySeconds; + + @Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") + private List redirectUris; + + @Schema(description = "授权类型,参见 OAuth2GrantTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "password") + private List authorizedGrantTypes; + + @Schema(description = "授权范围", example = "user_info") + private List scopes; + + @Schema(description = "自动通过的授权范围", example = "user_info") + private List autoApproveScopes; + + @Schema(description = "权限", example = "system:user:query") + private List authorities; + + @Schema(description = "资源", example = "1024") + private List resourceIds; + + @Schema(description = "附加信息", example = "{yunai: true}") + private String additionalInformation; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientSaveReqVO.java new file mode 100644 index 0000000..21cfeb6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/client/OAuth2ClientSaveReqVO.java @@ -0,0 +1,81 @@ +package com.win.module.system.controller.admin.oauth2.vo.client; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.json.JsonUtils; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - OAuth2 客户端创建/修改 Request VO") +@Data +public class OAuth2ClientSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + @NotNull(message = "客户端编号不能为空") + private String clientId; + + @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "fan") + @NotNull(message = "客户端密钥不能为空") + private String secret; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + @NotNull(message = "应用名不能为空") + private String name; + + @Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") + @NotNull(message = "应用图标不能为空") + @URL(message = "应用图标的地址不正确") + private String logo; + + @Schema(description = "应用描述", example = "我是一个应用") + private String description; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "访问令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640") + @NotNull(message = "访问令牌的有效期不能为空") + private Integer accessTokenValiditySeconds; + + @Schema(description = "刷新令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640000") + @NotNull(message = "刷新令牌的有效期不能为空") + private Integer refreshTokenValiditySeconds; + + @Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") + @NotNull(message = "可重定向的 URI 地址不能为空") + private List<@NotEmpty(message = "重定向的 URI 不能为空") @URL(message = "重定向的 URI 格式不正确") String> redirectUris; + + @Schema(description = "授权类型,参见 OAuth2GrantTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "password") + @NotNull(message = "授权类型不能为空") + private List authorizedGrantTypes; + + @Schema(description = "授权范围", example = "user_info") + private List scopes; + + @Schema(description = "自动通过的授权范围", example = "user_info") + private List autoApproveScopes; + + @Schema(description = "权限", example = "system:user:query") + private List authorities; + + @Schema(description = "资源", example = "1024") + private List resourceIds; + + @Schema(description = "附加信息", example = "{yunai: true}") + private String additionalInformation; + + @AssertTrue(message = "附加信息必须是 JSON 格式") + public boolean isAdditionalInformationJson() { + return StrUtil.isEmpty(additionalInformation) || JsonUtils.isJson(additionalInformation); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java new file mode 100644 index 0000000..24bd50a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.admin.oauth2.vo.open; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 【开放接口】访问令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenAccessTokenRespVO { + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + @JsonProperty("access_token") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + @JsonProperty("refresh_token") + private String refreshToken; + + @Schema(description = "令牌类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "bearer") + @JsonProperty("token_type") + private String tokenType; + + @Schema(description = "过期时间,单位:秒", requiredMode = Schema.RequiredMode.REQUIRED, example = "42430") + @JsonProperty("expires_in") + private Long expiresIn; + + @Schema(description = "授权范围,如果多个授权范围,使用空格分隔", example = "user_info") + private String scope; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java new file mode 100644 index 0000000..bdb8a45 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java @@ -0,0 +1,38 @@ +package com.win.module.system.controller.admin.oauth2.vo.open; + +import com.win.framework.common.core.KeyValue; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 授权页的信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenAuthorizeInfoRespVO { + + /** + * 客户端 + */ + private Client client; + + @Schema(description = "scope 的选中信息,使用 List 保证有序性,Key 是 scope,Value 为是否选中", requiredMode = Schema.RequiredMode.REQUIRED) + private List> scopes; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Client { + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + private String name; + + @Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") + private String logo; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java new file mode 100644 index 0000000..fb90351 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java @@ -0,0 +1,40 @@ +package com.win.module.system.controller.admin.oauth2.vo.open; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 【开放接口】校验令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenCheckTokenRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + @JsonProperty("user_id") + private Long userId; + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @JsonProperty("user_type") + private Integer userType; + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @JsonProperty("tenant_id") + private Long tenantId; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "car") + @JsonProperty("client_id") + private String clientId; + @Schema(description = "授权范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_info") + private List scopes; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + @JsonProperty("access_token") + private String accessToken; + + @Schema(description = "过期时间,时间戳 / 1000,即单位:秒", requiredMode = Schema.RequiredMode.REQUIRED, example = "1593092157") + private Long exp; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java new file mode 100644 index 0000000..f29fc99 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.admin.oauth2.vo.token; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 访问令牌分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2AccessTokenPageReqVO extends PageParam { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer userType; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private String clientId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java new file mode 100644 index 0000000..a7f74cc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java @@ -0,0 +1,40 @@ +package com.win.module.system.controller.admin.oauth2.vo.token; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 访问令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2AccessTokenRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + private String refreshToken; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private Long userId; + + @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer userType; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private String clientId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java new file mode 100644 index 0000000..c5755a7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java @@ -0,0 +1,70 @@ +package com.win.module.system.controller.admin.oauth2.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - OAuth2 获得用户基本信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2UserInfoRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + private String email; + @Schema(description = "手机号码", example = "15601691300") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + /** + * 所在部门 + */ + private Dept dept; + + /** + * 所属岗位数组 + */ + private List posts; + + @Schema(description = "部门") + @Data + public static class Dept { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String name; + + } + + @Schema(description = "岗位") + @Data + public static class Post { + + @Schema(description = "岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "开发") + private String name; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java new file mode 100644 index 0000000..a908dea --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.admin.oauth2.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - OAuth2 更新用户基本信息 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2UserUpdateReqVO { + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.http new file mode 100644 index 0000000..a90d8b8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.http @@ -0,0 +1,4 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/menu/list +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.java new file mode 100644 index 0000000..af4a4dc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/MenuController.java @@ -0,0 +1,88 @@ +package com.win.module.system.controller.admin.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.win.module.system.controller.admin.permission.vo.menu.MenuRespVO; +import com.win.module.system.controller.admin.permission.vo.menu.MenuSaveVO; +import com.win.module.system.controller.admin.permission.vo.menu.MenuSimpleRespVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.service.permission.MenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 菜单") +@RestController +@RequestMapping("/system/menu") +@Validated +public class MenuController { + + @Resource + private MenuService menuService; + + @PostMapping("/create") + @Operation(summary = "创建菜单") + @PreAuthorize("@ss.hasPermission('system:menu:create')") + public CommonResult createMenu(@Valid @RequestBody MenuSaveVO createReqVO) { + Long menuId = menuService.createMenu(createReqVO); + return success(menuId); + } + + @PutMapping("/update") + @Operation(summary = "修改菜单") + @PreAuthorize("@ss.hasPermission('system:menu:update')") + public CommonResult updateMenu(@Valid @RequestBody MenuSaveVO updateReqVO) { + menuService.updateMenu(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除菜单") + @Parameter(name = "id", description = "菜单编号", required= true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:menu:delete')") + public CommonResult deleteMenu(@RequestParam("id") Long id) { + menuService.deleteMenu(id); + return success(true); + } + + @GetMapping("/list") + @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult> getMenuList(MenuListReqVO reqVO) { + List list = menuService.getMenuList(reqVO); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(BeanUtils.toBean(list, MenuRespVO.class)); + } + + @GetMapping({"/list-all-simple", "simple-list"}) + @Operation(summary = "获取菜单精简信息列表", description = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。" + + "在多租户的场景下,会只返回租户所在套餐有的菜单") + public CommonResult> getSimpleMenuList() { + List list = menuService.getMenuListByTenant( + new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus())); + list = menuService.filterDisableMenus(list); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(BeanUtils.toBean(list, MenuSimpleRespVO.class)); + } + + @GetMapping("/get") + @Operation(summary = "获取菜单信息") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult getMenu(Long id) { + MenuDO menu = menuService.getMenu(id); + return success(BeanUtils.toBean(menu, MenuRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/PermissionController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/PermissionController.java new file mode 100644 index 0000000..3698448 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/PermissionController.java @@ -0,0 +1,82 @@ +package com.win.module.system.controller.admin.permission; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleDataScopeReqVO; +import com.win.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuReqVO; +import com.win.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.tenant.TenantService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.Set; + +import static com.win.framework.common.pojo.CommonResult.success; + +/** + * 权限 Controller,提供赋予用户、角色的权限的 API 接口 + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - 权限") +@RestController +@RequestMapping("/system/permission") +public class PermissionController { + + @Resource + private PermissionService permissionService; + @Resource + private TenantService tenantService; + + @Operation(summary = "获得角色拥有的菜单编号") + @Parameter(name = "roleId", description = "角色编号", required = true) + @GetMapping("/list-role-menus") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult> getRoleMenuList(Long roleId) { + return success(permissionService.getRoleMenuListByRoleId(roleId)); + } + + @PostMapping("/assign-role-menu") + @Operation(summary = "赋予角色菜单") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) { + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> reqVO.getMenuIds().removeIf(menuId -> !CollUtil.contains(menuIds, menuId))); + + // 执行菜单的分配 + permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); + return success(true); + } + + @PostMapping("/assign-role-data-scope") + @Operation(summary = "赋予角色数据权限") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-data-scope')") + public CommonResult assignRoleDataScope(@Valid @RequestBody PermissionAssignRoleDataScopeReqVO reqVO) { + permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); + return success(true); + } + + @Operation(summary = "获得管理员拥有的角色编号列表") + @Parameter(name = "userId", description = "用户编号", required = true) + @GetMapping("/list-user-roles") + @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public CommonResult> listAdminRoles(@RequestParam("userId") Long userId) { + return success(permissionService.getUserRoleIdListByUserId(userId)); + } + + @Operation(summary = "赋予用户角色") + @PostMapping("/assign-user-role") + @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public CommonResult assignUserRole(@Validated @RequestBody PermissionAssignUserRoleReqVO reqVO) { + permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds()); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.http new file mode 100644 index 0000000..c68b86b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.http @@ -0,0 +1,42 @@ +### /role/create 成功 +POST {{baseUrl}}/system/role/create +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "name": "测试角色", + "code": "test", + "sort": 0 +} + +### /role/update 成功 +POST {{baseUrl}}/system/role/update +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "id": 100, + "name": "测试角色", + "code": "test", + "sort": 10 +} +### /resource/delete 成功 +POST {{baseUrl}}/system/role/delete +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +roleId=14 + +### /role/get 成功 +GET {{baseUrl}}/system/role/get?id=100 +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### /role/page 成功 +GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.java new file mode 100644 index 0000000..eab4684 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/RoleController.java @@ -0,0 +1,100 @@ +package com.win.module.system.controller.admin.permission; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.permission.vo.role.*; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.service.permission.RoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; +import static java.util.Collections.singleton; + +@Tag(name = "管理后台 - 角色") +@RestController +@RequestMapping("/system/role") +@Validated +public class RoleController { + + @Resource + private RoleService roleService; + + @PostMapping("/create") + @Operation(summary = "创建角色") + @PreAuthorize("@ss.hasPermission('system:role:create')") + public CommonResult createRole(@Valid @RequestBody RoleSaveReqVO createReqVO) { + return success(roleService.createRole(createReqVO, null)); + } + + @PutMapping("/update") + @Operation(summary = "修改角色") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRole(@Valid @RequestBody RoleSaveReqVO updateReqVO) { + roleService.updateRole(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除角色") + @Parameter(name = "id", description = "角色编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:role:delete')") + public CommonResult deleteRole(@RequestParam("id") Long id) { + roleService.deleteRole(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得角色信息") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult getRole(@RequestParam("id") Long id) { + RoleDO role = roleService.getRole(id); + return success(BeanUtils.toBean(role, RoleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得角色分页") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult> getRolePage(RolePageReqVO pageReqVO) { + PageResult pageResult = roleService.getRolePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RoleRespVO.class)); + } + + @GetMapping({"/list-all-simple", "/simple-list"}) + @Operation(summary = "获取角色精简信息列表", description = "只包含被开启的角色,主要用于前端的下拉选项") + public CommonResult> getSimpleRoleList() { + List list = roleService.getRoleListByStatus(singleton(CommonStatusEnum.ENABLE.getStatus())); + list.sort(Comparator.comparing(RoleDO::getSort)); + return success(BeanUtils.toBean(list, RoleRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出角色 Excel") + @ApiAccessLog(operateType = EXPORT) + @PreAuthorize("@ss.hasPermission('system:role:export')") + public void export(HttpServletResponse response, @Validated RolePageReqVO exportReqVO) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = roleService.getRolePage(exportReqVO).getList(); + // 输出 + ExcelUtils.write(response, "角色数据.xls", "数据", RoleRespVO.class, + BeanUtils.toBean(list, RoleRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java new file mode 100644 index 0000000..db2fd59 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.admin.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 菜单列表 Request VO") +@Data +public class MenuListReqVO { + + @Schema(description = "菜单名称,模糊匹配", example = "芋道") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuRespVO.java new file mode 100644 index 0000000..9c7c7f2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuRespVO.java @@ -0,0 +1,69 @@ +package com.win.module.system.controller.admin.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 菜单信息 Response VO") +@Data +public class MenuRespVO { + + @Schema(description = "菜单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + @Schema(description = "权限标识,仅菜单类型为按钮时,才需要传递", example = "sys:menu:add") + @Size(max = 100) + private String permission; + + @Schema(description = "类型,参见 MenuTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "菜单类型不能为空") + private Integer type; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "是否可见", example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSaveVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSaveVO.java new file mode 100644 index 0000000..53fe8fe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSaveVO.java @@ -0,0 +1,65 @@ +package com.win.module.system.controller.admin.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Schema(description = "管理后台 - 菜单创建/修改 Request VO") +@Data +public class MenuSaveVO { + + @Schema(description = "菜单编号", example = "1024") + private Long id; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + @Schema(description = "权限标识,仅菜单类型为按钮时,才需要传递", example = "sys:menu:add") + @Size(max = 100) + private String permission; + + @Schema(description = "类型,参见 MenuTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "菜单类型不能为空") + private Integer type; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "是否可见", example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java new file mode 100644 index 0000000..c5ae2d2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.admin.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 菜单精简信息 Response VO") +@Data +public class MenuSimpleRespVO { + + @Schema(description = "菜单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + + @Schema(description = "类型,参见 MenuTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java new file mode 100644 index 0000000..71ab8bd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.admin.permission.vo.permission; + +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.permission.DataScopeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@Schema(description = "管理后台 - 赋予角色数据权限 Request VO") +@Data +public class PermissionAssignRoleDataScopeReqVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "数据范围不能为空") + @InEnum(value = DataScopeEnum.class, message = "数据范围必须是 {value}") + private Integer dataScope; + + @Schema(description = "部门编号列表,只有范围类型为 DEPT_CUSTOM 时,该字段才需要", example = "1,3,5") + private Set dataScopeDeptIds = Collections.emptySet(); // 兜底 + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java new file mode 100644 index 0000000..69926a2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.system.controller.admin.permission.vo.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@Schema(description = "管理后台 - 赋予角色菜单 Request VO") +@Data +public class PermissionAssignRoleMenuReqVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @Schema(description = "菜单编号列表", example = "1,3,5") + private Set menuIds = Collections.emptySet(); // 兜底 + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java new file mode 100644 index 0000000..156d838 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.system.controller.admin.permission.vo.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@Schema(description = "管理后台 - 赋予用户角色 Request VO") +@Data +public class PermissionAssignUserRoleReqVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @Schema(description = "角色编号列表", example = "1,3,5") + private Set roleIds = Collections.emptySet(); // 兜底 + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RolePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RolePageReqVO.java new file mode 100644 index 0000000..00a30d0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RolePageReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.admin.permission.vo.role; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 角色分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RolePageReqVO extends PageParam { + + @Schema(description = "角色名称,模糊匹配", example = "芋道") + private String name; + + @Schema(description = "角色标识,模糊匹配", example = "win") + private String code; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleRespVO.java new file mode 100644 index 0000000..fc45cd7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleRespVO.java @@ -0,0 +1,59 @@ +package com.win.module.system.controller.admin.permission.vo.role; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Set; + +@Schema(description = "管理后台 - 角色信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class RoleRespVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("角色序号") + private Long id; + + @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "管理员") + @ExcelProperty("角色名称") + private String name; + + @Schema(description = "角色标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin") + @NotBlank(message = "角色标志不能为空") + @ExcelProperty("角色标志") + private String code; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("角色排序") + private Integer sort; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "角色状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "角色类型,参见 RoleTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + + @Schema(description = "备注", example = "我是一个角色") + private String remark; + + @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "数据范围", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DATA_SCOPE) + private Integer dataScope; + + @Schema(description = "数据范围(指定部门数组)", example = "1") + private Set dataScopeDeptIds; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSaveReqVO.java new file mode 100644 index 0000000..342a67b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSaveReqVO.java @@ -0,0 +1,47 @@ +package com.win.module.system.controller.admin.permission.vo.role; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import com.mzt.logapi.starter.annotation.DiffLogField; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Schema(description = "管理后台 - 角色创建/更新 Request VO") +@Data +public class RoleSaveReqVO { + + @Schema(description = "角色编号", example = "1") + private Long id; + + @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "管理员") + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过 30 个字符") + @DiffLogField(name = "角色名称") + private String name; + + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过 100 个字符") + @Schema(description = "角色标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "ADMIN") + @DiffLogField(name = "角色标志") + private String code; + + @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + @DiffLogField(name = "显示顺序") + private Integer sort; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @DiffLogField(name = "状态") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") + private Integer status; + + @Schema(description = "备注", example = "我是一个角色") + @Size(max = 500, message = "备注长度不能超过 500 个字符") + @DiffLogField(name = "备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java new file mode 100644 index 0000000..1cdc08d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.admin.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 角色精简信息 Response VO") +@Data +public class RoleSimpleRespVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsCallbackController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsCallbackController.java new file mode 100644 index 0000000..9f12b50 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsCallbackController.java @@ -0,0 +1,60 @@ +package com.win.module.system.controller.admin.sms; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.module.system.framework.sms.core.enums.SmsChannelEnum; +import com.win.module.system.service.sms.SmsSendService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 短信回调") +@RestController +@RequestMapping("/system/sms/callback") +public class SmsCallbackController { + + @Resource + private SmsSendService smsSendService; + + @PostMapping("/aliyun") + @PermitAll + @Operation(summary = "阿里云短信的回调", description = "参见 https://help.aliyun.com/document_detail/120998.html 文档") + public CommonResult receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtils.getBody(request); + smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); + return success(true); + } + + @PostMapping("/tencent") + @PermitAll + @Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档") + public CommonResult receiveTencentSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtils.getBody(request); + smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text); + return success(true); + } + + + @PostMapping("/huawei") + @PermitAll + @Operation(summary = "华为云短信的回调", description = "参见 https://support.huaweicloud.com/api-msgsms/sms_05_0003.html 文档") + public CommonResult receiveHuaweiSmsStatus(@RequestBody String requestBody) throws Throwable { + smsSendService.receiveSmsStatus(SmsChannelEnum.HUAWEI.getCode(), requestBody); + return success(true); + } + + @PostMapping("/qiniu") + @PermitAll + @Operation(summary = "七牛云短信的回调", description = "参见 https://developer.qiniu.com/sms/5910/message-push 文档") + public CommonResult receiveQiniuSmsStatus(@RequestBody String requestBody) throws Throwable { + smsSendService.receiveSmsStatus(SmsChannelEnum.QINIU.getCode(), requestBody); + return success(true); + } + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsChannelController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsChannelController.java new file mode 100644 index 0000000..41363a7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsChannelController.java @@ -0,0 +1,82 @@ +package com.win.module.system.controller.admin.sms; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.service.sms.SmsChannelService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 短信渠道") +@RestController +@RequestMapping("system/sms-channel") +public class SmsChannelController { + + @Resource + private SmsChannelService smsChannelService; + + @PostMapping("/create") + @Operation(summary = "创建短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:create')") + public CommonResult createSmsChannel(@Valid @RequestBody SmsChannelSaveReqVO createReqVO) { + return success(smsChannelService.createSmsChannel(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:update')") + public CommonResult updateSmsChannel(@Valid @RequestBody SmsChannelSaveReqVO updateReqVO) { + smsChannelService.updateSmsChannel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除短信渠道") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')") + public CommonResult deleteSmsChannel(@RequestParam("id") Long id) { + smsChannelService.deleteSmsChannel(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得短信渠道") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult getSmsChannel(@RequestParam("id") Long id) { + SmsChannelDO channel = smsChannelService.getSmsChannel(id); + return success(BeanUtils.toBean(channel, SmsChannelRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得短信渠道分页") + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult> getSmsChannelPage(@Valid SmsChannelPageReqVO pageVO) { + PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); + return success(BeanUtils.toBean(pageResult, SmsChannelRespVO.class)); + } + + @GetMapping({"/list-all-simple", "/simple-list"}) + @Operation(summary = "获得短信渠道精简列表", description = "包含被禁用的短信渠道") + public CommonResult> getSimpleSmsChannelList() { + List list = smsChannelService.getSmsChannelList(); + list.sort(Comparator.comparing(SmsChannelDO::getId)); + return success(BeanUtils.toBean(list, SmsChannelSimpleRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsLogController.java new file mode 100644 index 0000000..eed083e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsLogController.java @@ -0,0 +1,60 @@ +package com.win.module.system.controller.admin.sms; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.controller.admin.sms.vo.log.SmsLogRespVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.module.system.service.sms.SmsLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 短信日志") +@RestController +@RequestMapping("/system/sms-log") +@Validated +public class SmsLogController { + + @Resource + private SmsLogService smsLogService; + + @GetMapping("/page") + @Operation(summary = "获得短信日志分页") + @PreAuthorize("@ss.hasPermission('system:sms-log:query')") + public CommonResult> getSmsLogPage(@Valid SmsLogPageReqVO pageReqVO) { + PageResult pageResult = smsLogService.getSmsLogPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, SmsLogRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出短信日志 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-log:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportSmsLogExcel(@Valid SmsLogPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = smsLogService.getSmsLogPage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "短信日志.xls", "数据", SmsLogRespVO.class, + BeanUtils.toBean(list, SmsLogRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.http new file mode 100644 index 0000000..ee24e92 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.http @@ -0,0 +1,14 @@ +### 请求 /system/sms-template/send-sms 接口 => 成功 +POST {{baseUrl}}/system/sms-template/send-sms +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "templateCode": "test_01", + "mobile": "15601691390", + "templateParams": { + "operation": "value01", + "code": "value02" + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.java new file mode 100644 index 0000000..9d7aff1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/SmsTemplateController.java @@ -0,0 +1,100 @@ +package com.win.module.system.controller.admin.sms; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.sms.vo.template.*; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.service.sms.SmsTemplateService; +import com.win.module.system.service.sms.SmsSendService; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 短信模板") +@RestController +@RequestMapping("/system/sms-template") +public class SmsTemplateController { + + @Resource + private SmsTemplateService smsTemplateService; + @Resource + private SmsSendService smsSendService; + + @PostMapping("/create") + @Operation(summary = "创建短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:create')") + public CommonResult createSmsTemplate(@Valid @RequestBody SmsTemplateSaveReqVO createReqVO) { + return success(smsTemplateService.createSmsTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:update')") + public CommonResult updateSmsTemplate(@Valid @RequestBody SmsTemplateSaveReqVO updateReqVO) { + smsTemplateService.updateSmsTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除短信模板") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sms-template:delete')") + public CommonResult deleteSmsTemplate(@RequestParam("id") Long id) { + smsTemplateService.deleteSmsTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得短信模板") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult getSmsTemplate(@RequestParam("id") Long id) { + SmsTemplateDO template = smsTemplateService.getSmsTemplate(id); + return success(BeanUtils.toBean(template, SmsTemplateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得短信模板分页") + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult> getSmsTemplatePage(@Valid SmsTemplatePageReqVO pageVO) { + PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); + return success(BeanUtils.toBean(pageResult, SmsTemplateRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出短信模板 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-template:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportSmsTemplateExcel(@Valid SmsTemplatePageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = smsTemplateService.getSmsTemplatePage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "短信模板.xls", "数据", SmsTemplateRespVO.class, + BeanUtils.toBean(list, SmsTemplateRespVO.class)); + } + + @PostMapping("/send-sms") + @Operation(summary = "发送短信") + @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") + public CommonResult sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) { + return success(smsSendService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null, + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java new file mode 100644 index 0000000..15dc756 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.admin.sms.vo.channel; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信渠道分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelPageReqVO extends PageParam { + + @Schema(description = "任务状态", example = "1") + private Integer status; + + @Schema(description = "短信签名,模糊匹配", example = "芋道源码") + private String signature; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java new file mode 100644 index 0000000..953ce03 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java @@ -0,0 +1,45 @@ +package com.win.module.system.controller.admin.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 短信渠道 Response VO") +@Data +public class SmsChannelRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + @NotNull(message = "短信签名不能为空") + private String signature; + + @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN") + private String code; + + @Schema(description = "启用状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "启用状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "好吃!") + private String remark; + + @Schema(description = "短信 API 的账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "短信 API 的账号不能为空") + private String apiKey; + + @Schema(description = "短信 API 的密钥", example = "yuanma") + private String apiSecret; + + @Schema(description = "短信发送回调 URL", example = "https://www.iocoder.cn") + @URL(message = "回调 URL 格式不正确") + private String callbackUrl; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java new file mode 100644 index 0000000..f6595c1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.system.controller.admin.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 短信渠道创建/修改 Request VO") +@Data +public class SmsChannelSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + @NotNull(message = "短信签名不能为空") + private String signature; + + @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN") + @NotNull(message = "渠道编码不能为空") + private String code; + + @Schema(description = "启用状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "启用状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "好吃!") + private String remark; + + @Schema(description = "短信 API 的账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "短信 API 的账号不能为空") + private String apiKey; + + @Schema(description = "短信 API 的密钥", example = "yuanma") + private String apiSecret; + + @Schema(description = "短信发送回调 URL", example = "http://www.iocoder.cn") + @URL(message = "回调 URL 格式不正确") + private String callbackUrl; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java new file mode 100644 index 0000000..175f26d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.admin.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 短信渠道精简 Response VO") +@Data +public class SmsChannelSimpleRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + private String signature; + + @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN") + private String code; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java new file mode 100644 index 0000000..5791d86 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.system.controller.admin.sms.vo.log; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsLogPageReqVO extends PageParam { + + @Schema(description = "短信渠道编号", example = "10") + private Long channelId; + + @Schema(description = "模板编号", example = "20") + private Long templateId; + + @Schema(description = "手机号", example = "15601691300") + private String mobile; + + @Schema(description = "发送状态,参见 SmsSendStatusEnum 枚举类", example = "1") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "发送时间") + private LocalDateTime[] sendTime; + + @Schema(description = "接收状态,参见 SmsReceiveStatusEnum 枚举类", example = "0") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "接收时间") + private LocalDateTime[] receiveTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java new file mode 100644 index 0000000..40a4084 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java @@ -0,0 +1,116 @@ +package com.win.module.system.controller.admin.sms.vo.log; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.framework.excel.core.convert.JsonConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Map; + +@Schema(description = "管理后台 - 短信日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class SmsLogRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @ExcelProperty("短信渠道编号") + private Long channelId; + + @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") + @ExcelProperty("短信渠道编码") + private String channelCode; + + @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") + @ExcelProperty("模板编号") + private Long templateId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test-01") + @ExcelProperty("模板编码") + private String templateCode; + + @Schema(description = "短信类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "短信类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer templateType; + + @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024") + @ExcelProperty("短信内容") + private String templateContent; + + @Schema(description = "短信参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "name,code") + @ExcelProperty(value = "短信参数", converter = JsonConvert.class) + private Map templateParams; + + @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SMS_207945135") + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @ExcelProperty("手机号") + private String mobile; + + @Schema(description = "用户编号", example = "10") + @ExcelProperty("用户编号") + private Long userId; + + @Schema(description = "用户类型", example = "1") + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_TYPE) + private Integer userType; + + @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "发送状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_SEND_STATUS) + private Integer sendStatus; + + @Schema(description = "发送时间") + @ExcelProperty("发送时间") + private LocalDateTime sendTime; + + @Schema(description = "短信 API 发送结果的编码", example = "SUCCESS") + @ExcelProperty("短信 API 发送结果的编码") + private String apiSendCode; + + @Schema(description = "短信 API 发送失败的提示", example = "成功") + @ExcelProperty("短信 API 发送失败的提示") + private String apiSendMsg; + + @Schema(description = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") + @ExcelProperty("短信 API 发送返回的唯一请求 ID") + private String apiRequestId; + + @Schema(description = "短信 API 发送返回的序号", example = "62923244790") + @ExcelProperty("短信 API 发送返回的序号") + private String apiSerialNo; + + @Schema(description = "接收状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty(value = "接收状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS) + private Integer receiveStatus; + + @Schema(description = "接收时间") + @ExcelProperty("接收时间") + private LocalDateTime receiveTime; + + @Schema(description = "API 接收结果的编码", example = "DELIVRD") + @ExcelProperty("API 接收结果的编码") + private String apiReceiveCode; + + @Schema(description = "API 接收结果的说明", example = "用户接收成功") + @ExcelProperty("API 接收结果的说明") + private String apiReceiveMsg; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java new file mode 100644 index 0000000..d9dd0ee --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.system.controller.admin.sms.vo.template; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信模板分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplatePageReqVO extends PageParam { + + @Schema(description = "短信签名", example = "1") + private Integer type; + + @Schema(description = "开启状态", example = "1") + private Integer status; + + @Schema(description = "模板编码,模糊匹配", example = "test_01") + private String code; + + @Schema(description = "模板内容,模糊匹配", example = "你好,{name}。你长的太{like}啦!") + private String content; + + @Schema(description = "短信 API 的模板编号,模糊匹配", example = "4383920") + private String apiTemplateId; + + @Schema(description = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java new file mode 100644 index 0000000..f98f5c5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java @@ -0,0 +1,69 @@ +package com.win.module.system.controller.admin.sms.vo.template; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 短信模板 Response VO") +@Data +@ExcelIgnoreUnannotated +public class SmsTemplateRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "短信类型,参见 SmsTemplateTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "短信签名", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer type; + + @Schema(description = "开启状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "开启状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @ExcelProperty("模板编码") + private String code; + + @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @ExcelProperty("模板名称") + private String name; + + @Schema(description = "模板内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,{name}。你长的太{like}啦!") + @ExcelProperty("模板内容") + private String content; + + @Schema(description = "参数数组", example = "name,code") + private List params; + + @Schema(description = "备注", example = "哈哈哈") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4383920") + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @ExcelProperty("短信渠道编号") + private Long channelId; + + @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") + @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_CHANNEL_CODE) + private String channelCode; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java new file mode 100644 index 0000000..cfcef7d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.admin.sms.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 短信模板创建/修改 Request VO") +@Data +public class SmsTemplateSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "短信类型,参见 SmsTemplateTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "短信类型不能为空") + private Integer type; + + @Schema(description = "开启状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "开启状态不能为空") + private Integer status; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String code; + + @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "模板名称不能为空") + private String name; + + @Schema(description = "模板内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,{name}。你长的太{like}啦!") + @NotNull(message = "模板内容不能为空") + private String content; + + @Schema(description = "备注", example = "哈哈哈") + private String remark; + + @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4383920") + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + + @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java new file mode 100644 index 0000000..fa2f6ba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.admin.sms.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 短信模板的发送 Request VO") +@Data +public class SmsTemplateSendReqVO { + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @NotNull(message = "手机号不能为空") + private String mobile; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模板参数") + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.http new file mode 100644 index 0000000..5ab6439 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.http @@ -0,0 +1,20 @@ +### 请求 /system/social-client/send-subscribe-message 接口 => 发送测试订阅消息 +POST {{baseUrl}}/system/social-client/send-subscribe-message +Authorization: Bearer {{token}} +Content-Type: application/json +#Authorization: Bearer test100 +tenant-id: {{adminTenentId}} + +{ + "userId": 247, + "userType": 1, + "socialType": 34, + "templateTitle": "充值成功通知", + "page": "", + "messages": { + "character_string1":"5616122165165", + "amount2":"1000.00", + "time3":"2024-01-01 10:10:10", + "phrase4": "充值成功" + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.java new file mode 100644 index 0000000..2ce5b5e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialClientController.java @@ -0,0 +1,83 @@ +package com.win.module.system.controller.admin.socail; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.social.SocialClientApi; +import com.win.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientRespVO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; +import com.win.module.system.dal.dataobject.social.SocialClientDO; +import com.win.module.system.service.social.SocialClientService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 社交客户端") +@RestController +@RequestMapping("/system/social-client") +@Validated +public class SocialClientController { + + @Resource + private SocialClientService socialClientService; + @Resource + private SocialClientApi socialClientApi; + + @PostMapping("/create") + @Operation(summary = "创建社交客户端") + @PreAuthorize("@ss.hasPermission('system:social-client:create')") + public CommonResult createSocialClient(@Valid @RequestBody SocialClientSaveReqVO createReqVO) { + return success(socialClientService.createSocialClient(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新社交客户端") + @PreAuthorize("@ss.hasPermission('system:social-client:update')") + public CommonResult updateSocialClient(@Valid @RequestBody SocialClientSaveReqVO updateReqVO) { + socialClientService.updateSocialClient(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除社交客户端") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:social-client:delete')") + public CommonResult deleteSocialClient(@RequestParam("id") Long id) { + socialClientService.deleteSocialClient(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得社交客户端") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:social-client:query')") + public CommonResult getSocialClient(@RequestParam("id") Long id) { + SocialClientDO client = socialClientService.getSocialClient(id); + return success(BeanUtils.toBean(client, SocialClientRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得社交客户端分页") + @PreAuthorize("@ss.hasPermission('system:social-client:query')") + public CommonResult> getSocialClientPage(@Valid SocialClientPageReqVO pageVO) { + PageResult pageResult = socialClientService.getSocialClientPage(pageVO); + return success(BeanUtils.toBean(pageResult, SocialClientRespVO.class)); + } + + @PostMapping("/send-subscribe-message") + @Operation(summary = "发送订阅消息") // 用于测试 + @PreAuthorize("@ss.hasPermission('system:social-client:query')") + public void sendSubscribeMessage(@RequestBody SocialWxaSubscribeMessageSendReqDTO reqDTO) { + socialClientApi.sendWxaSubscribeMessage(reqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialUserController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialUserController.java new file mode 100644 index 0000000..e538366 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/SocialUserController.java @@ -0,0 +1,70 @@ +package com.win.module.system.controller.admin.socail; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserBindReqVO; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserUnbindReqVO; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserRespVO; +import com.win.module.system.convert.social.SocialUserConvert; +import com.win.module.system.dal.dataobject.social.SocialUserDO; +import com.win.module.system.service.social.SocialUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 社交用户") +@RestController +@RequestMapping("/system/social-user") +@Validated +public class SocialUserController { + + @Resource + private SocialUserService socialUserService; + + @PostMapping("/bind") + @Operation(summary = "社交绑定,使用 code 授权码") + public CommonResult socialBind(@RequestBody @Valid SocialUserBindReqVO reqVO) { + socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert( + getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO)); + return CommonResult.success(true); + } + + @DeleteMapping("/unbind") + @Operation(summary = "取消社交绑定") + public CommonResult socialUnbind(@RequestBody SocialUserUnbindReqVO reqVO) { + socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getOpenid()); + return CommonResult.success(true); + } + + // ==================== 社交用户 CRUD ==================== + + @GetMapping("/get") + @Operation(summary = "获得社交用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:social-user:query')") + public CommonResult getSocialUser(@RequestParam("id") Long id) { + SocialUserDO socialUser = socialUserService.getSocialUser(id); + return success(BeanUtils.toBean(socialUser, SocialUserRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得社交用户分页") + @PreAuthorize("@ss.hasPermission('system:social-user:query')") + public CommonResult> getSocialUserPage(@Valid SocialUserPageReqVO pageVO) { + PageResult pageResult = socialUserService.getSocialUserPage(pageVO); + return success(BeanUtils.toBean(pageResult, SocialUserRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java new file mode 100644 index 0000000..927f904 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.admin.socail.vo.client; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 社交客户端分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SocialClientPageReqVO extends PageParam { + + @Schema(description = "应用名", example = "win商城") + private String name; + + @Schema(description = "社交平台的类型", example = "31") + private Integer socialType; + + @Schema(description = "用户类型", example = "2") + private Integer userType; + + @Schema(description = "客户端编号", example = "145442115") + private String clientId; + + @Schema(description = "状态", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java new file mode 100644 index 0000000..fe1dd1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java @@ -0,0 +1,39 @@ +package com.win.module.system.controller.admin.socail.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 社交客户端 Response VO") +@Data +public class SocialClientRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27162") + private Long id; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win商城") + private String name; + + @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31") + private Integer socialType; + + @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer userType; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54") + private String clientId; + + @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "peter") + private String clientSecret; + + @Schema(description = "授权方的网页应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000045") + private String agentId; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java new file mode 100644 index 0000000..21c6a78 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java @@ -0,0 +1,61 @@ +package com.win.module.system.controller.admin.socail.vo.client; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotNull; +import java.util.Objects; + +@Schema(description = "管理后台 - 社交客户端创建/修改 Request VO") +@Data +public class SocialClientSaveReqVO { + + @Schema(description = "编号", example = "27162") + private Long id; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win商城") + @NotNull(message = "应用名不能为空") + private String name; + + @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31") + @NotNull(message = "社交平台的类型不能为空") + @InEnum(SocialTypeEnum.class) + private Integer socialType; + + @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "用户类型不能为空") + @InEnum(UserTypeEnum.class) + private Integer userType; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54") + @NotNull(message = "客户端编号不能为空") + private String clientId; + + @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "peter") + @NotNull(message = "客户端密钥不能为空") + private String clientSecret; + + @Schema(description = "授权方的网页应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000045") + private String agentId; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(CommonStatusEnum.class) + private Integer status; + + @AssertTrue(message = "agentId 不能为空") + @JsonIgnore + public boolean isAgentIdValid() { + // 如果是企业微信,必须填写 agentId 属性 + return !Objects.equals(socialType, SocialTypeEnum.WECHAT_ENTERPRISE.getType()) + || !StrUtil.isEmpty(agentId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java new file mode 100644 index 0000000..db254e5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.admin.socail.vo.user; + +import com.win.module.system.enums.social.SocialTypeEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 社交绑定 Request VO,使用 code 授权码") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SocialUserBindReqVO { + + @Schema(description = "社交平台的类型,参见 UserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "授权码不能为空") + private String code; + + @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @NotEmpty(message = "state 不能为空") + private String state; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java new file mode 100644 index 0000000..54ee6e8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.admin.socail.vo.user; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 社交用户分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SocialUserPageReqVO extends PageParam { + + @Schema(description = "社交平台的类型", example = "30") + private Integer type; + + @Schema(description = "用户昵称", example = "李四") + private String nickname; + + @Schema(description = "社交 openid", example = "oz-Jdt0kd_jdhUxJHQdBJMlOFN7w") + private String openid; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java new file mode 100644 index 0000000..9a7ce23 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java @@ -0,0 +1,48 @@ +package com.win.module.system.controller.admin.socail.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 社交用户 Response VO") +@Data +public class SocialUserRespVO { + + @Schema(description = "主键(自增策略)", requiredMode = Schema.RequiredMode.REQUIRED, example = "14569") + private Long id; + + @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "30") + private Integer type; + + @Schema(description = "社交 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private String openid; + + @Schema(description = "社交 token", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private String token; + + @Schema(description = "原始 Token 数据,一般是 JSON 格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}") + private String rawTokenInfo; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + @Schema(description = "原始用户数据,一般是 JSON 格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}") + private String rawUserInfo; + + @Schema(description = "最后一次的认证 code", requiredMode = Schema.RequiredMode.REQUIRED, example = "666666") + private String code; + + @Schema(description = "最后一次的认证 state", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + private String state; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java new file mode 100644 index 0000000..b1c3986 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.admin.socail.vo.user; + +import com.win.framework.common.validation.InEnum; +import com.win.module.system.enums.social.SocialTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 取消社交绑定 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SocialUserUnbindReqVO { + + @Schema(description = "社交平台的类型,参见 UserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") + @NotEmpty(message = "社交用户的 openid 不能为空") + private String openid; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.http new file mode 100644 index 0000000..a4d5173 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.http @@ -0,0 +1,21 @@ +### 获取租户编号 /admin-api/system/get-id-by-name +GET {{baseUrl}}/system/tenant/get-id-by-name?name=芋道源码 + +### 创建租户 /admin-api/system/tenant/create +POST {{baseUrl}}/system/tenant/create +Content-Type: application/json +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +{ + "name": "芋道", + "contactName": "芋艿", + "contactMobile": "15601691300", + "status": 0, + "domain": "https://www.iocoder.cn", + "packageId": 110, + "expireTime": 1699545600000, + "accountCount": 20, + "username": "admin", + "password": "123321" +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.java new file mode 100644 index 0000000..09470e6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantController.java @@ -0,0 +1,111 @@ +package com.win.module.system.controller.admin.tenant; + +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantRespVO; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.service.tenant.TenantService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 租户") +@RestController +@RequestMapping("/system/tenant") +public class TenantController { + + @Resource + private TenantService tenantService; + + @GetMapping("/get-id-by-name") + @PermitAll + @Operation(summary = "使用租户名,获得租户编号", description = "登录界面,根据用户的租户名,获得租户编号") + @Parameter(name = "name", description = "租户名", required = true, example = "1024") + public CommonResult getTenantIdByName(@RequestParam("name") String name) { + TenantDO tenant = tenantService.getTenantByName(name); + return success(tenant != null ? tenant.getId() : null); + } + + @GetMapping("/get-by-website") + @PermitAll + @Operation(summary = "使用域名,获得租户信息", description = "登录界面,根据用户的域名,获得租户信息") + @Parameter(name = "website", description = "域名", required = true, example = "www.iocoder.cn") + public CommonResult getTenantByWebsite(@RequestParam("website") String website) { + TenantDO tenant = tenantService.getTenantByWebsite(website); + return success(BeanUtils.toBean(tenant, TenantSimpleRespVO.class)); + } + + @PostMapping("/create") + @Operation(summary = "创建租户") + @PreAuthorize("@ss.hasPermission('system:tenant:create')") + public CommonResult createTenant(@Valid @RequestBody TenantSaveReqVO createReqVO) { + return success(tenantService.createTenant(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新租户") + @PreAuthorize("@ss.hasPermission('system:tenant:update')") + public CommonResult updateTenant(@Valid @RequestBody TenantSaveReqVO updateReqVO) { + tenantService.updateTenant(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除租户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:tenant:delete')") + public CommonResult deleteTenant(@RequestParam("id") Long id) { + tenantService.deleteTenant(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得租户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:tenant:query')") + public CommonResult getTenant(@RequestParam("id") Long id) { + TenantDO tenant = tenantService.getTenant(id); + return success(BeanUtils.toBean(tenant, TenantRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得租户分页") + @PreAuthorize("@ss.hasPermission('system:tenant:query')") + public CommonResult> getTenantPage(@Valid TenantPageReqVO pageVO) { + PageResult pageResult = tenantService.getTenantPage(pageVO); + return success(BeanUtils.toBean(pageResult, TenantRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出租户 Excel") + @PreAuthorize("@ss.hasPermission('system:tenant:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportTenantExcel(@Valid TenantPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = tenantService.getTenantPage(exportReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "租户.xls", "数据", TenantRespVO.class, + BeanUtils.toBean(list, TenantRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantPackageController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantPackageController.java new file mode 100644 index 0000000..1cd49ba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/TenantPackageController.java @@ -0,0 +1,80 @@ +package com.win.module.system.controller.admin.tenant; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.tenant.vo.packages.*; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.win.module.system.service.tenant.TenantPackageService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 租户套餐") +@RestController +@RequestMapping("/system/tenant-package") +@Validated +public class TenantPackageController { + + @Resource + private TenantPackageService tenantPackageService; + + @PostMapping("/create") + @Operation(summary = "创建租户套餐") + @PreAuthorize("@ss.hasPermission('system:tenant-package:create')") + public CommonResult createTenantPackage(@Valid @RequestBody TenantPackageSaveReqVO createReqVO) { + return success(tenantPackageService.createTenantPackage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新租户套餐") + @PreAuthorize("@ss.hasPermission('system:tenant-package:update')") + public CommonResult updateTenantPackage(@Valid @RequestBody TenantPackageSaveReqVO updateReqVO) { + tenantPackageService.updateTenantPackage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除租户套餐") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:tenant-package:delete')") + public CommonResult deleteTenantPackage(@RequestParam("id") Long id) { + tenantPackageService.deleteTenantPackage(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得租户套餐") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:tenant-package:query')") + public CommonResult getTenantPackage(@RequestParam("id") Long id) { + TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(id); + return success(BeanUtils.toBean(tenantPackage, TenantPackageRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得租户套餐分页") + @PreAuthorize("@ss.hasPermission('system:tenant-package:query')") + public CommonResult> getTenantPackagePage(@Valid TenantPackagePageReqVO pageVO) { + PageResult pageResult = tenantPackageService.getTenantPackagePage(pageVO); + return success(BeanUtils.toBean(pageResult, TenantPackageRespVO.class)); + } + + @GetMapping({"/get-simple-list", "simple-list"}) + @Operation(summary = "获取租户套餐精简信息列表", description = "只包含被开启的租户套餐,主要用于前端的下拉选项") + public CommonResult> getTenantPackageList() { + List list = tenantPackageService.getTenantPackageListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(BeanUtils.toBean(list, TenantPackageSimpleRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java new file mode 100644 index 0000000..b2e7bba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.admin.tenant.vo.packages; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 租户套餐分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackagePageReqVO extends PageParam { + + @Schema(description = "套餐名", example = "VIP") + private String name; + + @Schema(description = "状态", example = "1") + private Integer status; + + @Schema(description = "备注", example = "好") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java new file mode 100644 index 0000000..ec3c39a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.admin.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Set; + +@Schema(description = "管理后台 - 租户套餐 Response VO") +@Data +public class TenantPackageRespVO { + + @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "备注", example = "好") + private String remark; + + @Schema(description = "关联的菜单编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Set menuIds; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSaveReqVO.java new file mode 100644 index 0000000..907f9e1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSaveReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.system.controller.admin.tenant.vo.packages; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Set; + +@Schema(description = "管理后台 - 租户套餐创建/修改 Request VO") +@Data +public class TenantPackageSaveReqVO { + + @Schema(description = "套餐编号", example = "1024") + private Long id; + + @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP") + @NotEmpty(message = "套餐名不能为空") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") + private Integer status; + + @Schema(description = "备注", example = "好") + private String remark; + + @Schema(description = "关联的菜单编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "关联的菜单编号不能为空") + private Set menuIds; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java new file mode 100644 index 0000000..ba7413f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.admin.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 租户套餐精简 Response VO") +@Data +public class TenantPackageSimpleRespVO { + + @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "套餐编号不能为空") + private Long id; + + @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP") + @NotNull(message = "套餐名不能为空") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java new file mode 100644 index 0000000..5eb25c5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.admin.tenant.vo.tenant; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 租户分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPageReqVO extends PageParam { + + @Schema(description = "租户名", example = "芋道") + private String name; + + @Schema(description = "联系人", example = "芋艿") + private String contactName; + + @Schema(description = "联系手机", example = "15601691300") + private String contactMobile; + + @Schema(description = "租户状态(0正常 1停用)", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java new file mode 100644 index 0000000..0f5fb0d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java @@ -0,0 +1,55 @@ +package com.win.module.system.controller.admin.tenant.vo.tenant; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 租户 Response VO") +@Data +@ExcelIgnoreUnannotated +public class TenantRespVO { + + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("租户编号") + private Long id; + + @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @ExcelProperty("租户名") + private String name; + + @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("联系人") + private String contactName; + + @Schema(description = "联系手机", example = "15601691300") + @ExcelProperty("联系手机") + private String contactMobile; + + @Schema(description = "租户状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "绑定域名", example = "https://www.iocoder.cn") + private String website; + + @Schema(description = "租户套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long packageId; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime expireTime; + + @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer accountCount; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java new file mode 100644 index 0000000..eff3845 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java @@ -0,0 +1,70 @@ +package com.win.module.system.controller.admin.tenant.vo.tenant; + +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 租户创建/修改 Request VO") +@Data +public class TenantSaveReqVO { + + @Schema(description = "租户编号", example = "1024") + private Long id; + + @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotNull(message = "租户名不能为空") + private String name; + + @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "联系人不能为空") + private String contactName; + + @Schema(description = "联系手机", example = "15601691300") + private String contactMobile; + + @Schema(description = "租户状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "租户状态") + private Integer status; + + @Schema(description = "绑定域名", example = "https://www.iocoder.cn") + private String website; + + @Schema(description = "租户套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "租户套餐编号不能为空") + private Long packageId; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "过期时间不能为空") + private LocalDateTime expireTime; + + @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "账号数量不能为空") + private Integer accountCount; + + // ========== 仅【创建】时,需要传递的字段 ========== + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + @AssertTrue(message = "用户账号、密码不能为空") + @JsonIgnore + public boolean isUsernameValid() { + return id != null // 修改时,不需要传递 + || (ObjectUtil.isAllNotEmpty(username, password)); // 新增时,必须都传递 username、password + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java new file mode 100644 index 0000000..3c0d68d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.admin.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 租户精简 Response VO") +@Data +public class TenantSimpleRespVO { + + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.http new file mode 100644 index 0000000..7d7f622 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.http @@ -0,0 +1,5 @@ +### 请求 /system/user/page 接口 => 没有权限 +GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} +#Authorization: Bearer test100 +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.java new file mode 100644 index 0000000..724529e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserController.java @@ -0,0 +1,172 @@ +package com.win.module.system.controller.admin.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.apilog.core.annotation.ApiAccessLog; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.module.system.controller.admin.user.vo.user.*; +import com.win.module.system.convert.user.UserConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.common.SexEnum; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static com.win.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - 用户") +@RestController +@RequestMapping("/system/user") +@Validated +public class UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + + @PostMapping("/create") + @Operation(summary = "新增用户") + @PreAuthorize("@ss.hasPermission('system:user:create')") + public CommonResult createUser(@Valid @RequestBody UserSaveReqVO reqVO) { + Long id = userService.createUser(reqVO); + return success(id); + } + + @PutMapping("update") + @Operation(summary = "修改用户") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUser(@Valid @RequestBody UserSaveReqVO reqVO) { + userService.updateUser(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @PutMapping("/update-password") + @Operation(summary = "重置用户密码") + @PreAuthorize("@ss.hasPermission('system:user:update-password')") + public CommonResult updateUserPassword(@Valid @RequestBody UserUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); + return success(true); + } + + @PutMapping("/update-status") + @Operation(summary = "修改用户状态") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) { + userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得用户分页列表") + @PreAuthorize("@ss.hasPermission('system:user:list')") + public CommonResult> getUserPage(@Valid UserPageReqVO pageReqVO) { + // 获得用户分页列表 + PageResult pageResult = userService.getUserPage(pageReqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + // 拼接数据 + Map deptMap = deptService.getDeptMap( + convertList(pageResult.getList(), AdminUserDO::getDeptId)); + return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap), + pageResult.getTotal())); + } + + @GetMapping({"/list-all-simple", "/simple-list"}) + @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") + public CommonResult> getSimpleUserList() { + List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); + // 拼接数据 + Map deptMap = deptService.getDeptMap( + convertList(list, AdminUserDO::getDeptId)); + return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); + } + + @GetMapping("/get") + @Operation(summary = "获得用户详情") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult getUser(@RequestParam("id") Long id) { + AdminUserDO user = userService.getUser(id); + if (user == null) { + return success(null); + } + // 拼接数据 + DeptDO dept = deptService.getDept(user.getDeptId()); + return success(UserConvert.INSTANCE.convert(user, dept)); + } + + @GetMapping("/export") + @Operation(summary = "导出用户") + @PreAuthorize("@ss.hasPermission('system:user:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUserList(@Validated UserPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = userService.getUserPage(exportReqVO).getList(); + // 输出 Excel + Map deptMap = deptService.getDeptMap( + convertList(list, AdminUserDO::getDeptId)); + ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, + UserConvert.INSTANCE.convertList(list, deptMap)); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300") + .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), + UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() + ); + // 输出 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); + } + + @PostMapping("/import") + @Operation(summary = "导入用户") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('system:user:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, UserImportExcelVO.class); + return success(userService.importUserList(list, updateSupport)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.http new file mode 100644 index 0000000..f06037b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.http @@ -0,0 +1,4 @@ +### 请求 /system/user/profile/get 接口 => 没有权限 +GET {{baseUrl}}/system/user/profile/get +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.java new file mode 100644 index 0000000..e9d9f17 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/UserProfileController.java @@ -0,0 +1,100 @@ +package com.win.module.system.controller.admin.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.convert.user.UserConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.social.SocialUserDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.dept.PostService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.permission.RoleService; +import com.win.module.system.service.social.SocialUserService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_IS_EMPTY; + +@Tag(name = "管理后台 - 用户个人中心") +@RestController +@RequestMapping("/system/user/profile") +@Validated +@Slf4j +public class UserProfileController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private RoleService roleService; + @Resource + private SocialUserService socialService; + + @GetMapping("/get") + @Operation(summary = "获得登录用户信息") + @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。 + public CommonResult getUserProfile() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + // 获得用户角色 + List userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); + // 获得部门信息 + DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null; + // 获得岗位信息 + List posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null; + // 获得社交用户信息 + List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue()); + return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts, socialUsers)); + } + + @PutMapping("/update") + @Operation(summary = "修改用户个人信息") + public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { + userService.updateUserProfile(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/update-password") + @Operation(summary = "修改用户个人密码") + public CommonResult updateUserProfilePassword(@Valid @RequestBody UserProfileUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(getLoginUserId(), reqVO); + return success(true); + } + + @RequestMapping(value = "/update-avatar", + method = {RequestMethod.POST, RequestMethod.PUT}) // 解决 uni-app 不支持 Put 上传文件的问题 + @Operation(summary = "上传用户个人头像") + public CommonResult updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws Exception { + if (file.isEmpty()) { + throw exception(FILE_IS_EMPTY); + } + String avatar = userService.updateUserAvatar(getLoginUserId(), file.getInputStream()); + return success(avatar); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java new file mode 100644 index 0000000..7c4aad0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java @@ -0,0 +1,75 @@ +package com.win.module.system.controller.admin.user.vo.profile; + +import com.win.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.win.module.system.controller.admin.dept.vo.post.PostSimpleRespVO; +import com.win.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@Schema(description = "管理后台 - 用户个人中心信息 Response VO") +public class UserProfileRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + @Schema(description = "最后登录 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "192.168.1.1") + private String loginIp; + + @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime loginDate; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + + /** + * 所属角色 + */ + private List roles; + /** + * 所在部门 + */ + private DeptSimpleRespVO dept; + /** + * 所属岗位数组 + */ + private List posts; + /** + * 社交用户数组 + */ + private List socialUsers; + + @Schema(description = "社交用户") + @Data + public static class SocialUser { + + @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + private Integer type; + + @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") + private String openid; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java new file mode 100644 index 0000000..f2eb406 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.admin.user.vo.profile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 用户个人中心更新密码 Request VO") +@Data +public class UserProfileUpdatePasswordReqVO { + + @Schema(description = "旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "旧密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String oldPassword; + + @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "654321") + @NotEmpty(message = "新密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String newPassword; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java new file mode 100644 index 0000000..40cb9c2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.admin.user.vo.profile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Size; + + +@Schema(description = "管理后台 - 用户个人信息更新 Request VO") +@Data +public class UserProfileUpdateReqVO { + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportExcelVO.java new file mode 100644 index 0000000..0844338 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportExcelVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class UserImportExcelVO { + + @ExcelProperty("登录名称") + private String username; + + @ExcelProperty("用户名称") + private String nickname; + + @ExcelProperty("部门编号") + private Long deptId; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "账号状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportRespVO.java new file mode 100644 index 0000000..4a2525f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserImportRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 用户导入 Response VO") +@Data +@Builder +public class UserImportRespVO { + + @Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createUsernames; + + @Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateUsernames; + + @Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureUsernames; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserPageReqVO.java new file mode 100644 index 0000000..2d49bef --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserPageReqVO extends PageParam { + + @Schema(description = "用户账号,模糊匹配", example = "win") + private String username; + + @Schema(description = "手机号码,模糊匹配", example = "win") + private String mobile; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "部门编号,同时筛选子部门", example = "1024") + private Long deptId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserRespVO.java new file mode 100644 index 0000000..07bf9f1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserRespVO.java @@ -0,0 +1,75 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Set; + +@Schema(description = "管理后台 - 用户信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UserRespVO{ + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("用户编号") + private Long id; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @ExcelProperty("用户名称") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("用户昵称") + private String nickname; + + @Schema(description = "备注", example = "我是一个用户") + private String remark; + + @Schema(description = "部门ID", example = "我是一个用户") + private Long deptId; + @Schema(description = "部门名称", example = "IT 部") + @ExcelProperty("部门名称") + private String deptName; + + @Schema(description = "岗位编号数组", example = "1") + private Set postIds; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @ExcelProperty("用户邮箱") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @ExcelProperty("手机号码") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + private Integer sex; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "帐号状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "最后登录 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "192.168.1.1") + @ExcelProperty("最后登录IP") + private String loginIp; + + @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + @ExcelProperty("最后登录时间") + private LocalDateTime loginDate; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSaveReqVO.java new file mode 100644 index 0000000..9af7d3a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -0,0 +1,80 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.framework.operatelog.core.DeptParseFunction; +import com.win.module.system.framework.operatelog.core.PostParseFunction; +import com.win.module.system.framework.operatelog.core.SexParseFunction; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.mzt.logapi.starter.annotation.DiffLogField; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.util.Set; + +@Schema(description = "管理后台 - 用户创建/修改 Request VO") +@Data +public class UserSaveReqVO { + + @Schema(description = "用户编号", example = "1024") + private Long id; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "用户账号不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + @DiffLogField(name = "用户账号") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + @DiffLogField(name = "用户昵称") + private String nickname; + + @Schema(description = "备注", example = "我是一个用户") + @DiffLogField(name = "备注") + private String remark; + + @Schema(description = "部门编号", example = "我是一个用户") + @DiffLogField(name = "部门", function = DeptParseFunction.NAME) + private Long deptId; + + @Schema(description = "岗位编号数组", example = "1") + @DiffLogField(name = "岗位", function = PostParseFunction.NAME) + private Set postIds; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + @DiffLogField(name = "用户邮箱") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @Mobile + @DiffLogField(name = "手机号码") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + @DiffLogField(name = "用户性别", function = SexParseFunction.NAME) + private Integer sex; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + @DiffLogField(name = "用户头像") + private String avatar; + + // ========== 仅【创建】时,需要传递的字段 ========== + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + @AssertTrue(message = "密码不能为空") + @JsonIgnore + public boolean isPasswordValid() { + return id != null // 修改时,不需要传递 + || (ObjectUtil.isAllNotEmpty(password)); // 新增时,必须都传递 password + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java new file mode 100644 index 0000000..c8d9daa --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 用户精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserSimpleRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String nickname; + + @Schema(description = "部门ID", example = "我是一个用户") + private Long deptId; + @Schema(description = "部门名称", example = "IT 部") + private String deptName; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java new file mode 100644 index 0000000..9ff0d1b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 用户更新密码 Request VO") +@Data +public class UserUpdatePasswordReqVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java new file mode 100644 index 0000000..f505291 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.admin.user.vo.user; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 用户更新状态 Request VO") +@Data +public class UserUpdateStatusReqVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/AppDictDataController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/AppDictDataController.java new file mode 100644 index 0000000..6ffeede --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/AppDictDataController.java @@ -0,0 +1,43 @@ +package com.win.module.system.controller.app.dict; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.app.dict.vo.AppDictDataRespVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.service.dict.DictDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.security.PermitAll; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 App - 字典数据") +@RestController +@RequestMapping("/system/dict-data") +@Validated +public class AppDictDataController { + + @Resource + private DictDataService dictDataService; + + @GetMapping("/type") + @Operation(summary = "根据字典类型查询字典数据信息") + @Parameter(name = "type", description = "字典类型", required = true, example = "common_status") + @PermitAll + public CommonResult> getDictDataListByType(@RequestParam("type") String type) { + List list = dictDataService.getDictDataList( + CommonStatusEnum.ENABLE.getStatus(), type); + return success(BeanUtils.toBean(list, AppDictDataRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/vo/AppDictDataRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/vo/AppDictDataRespVO.java new file mode 100644 index 0000000..2829f8e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/dict/vo/AppDictDataRespVO.java @@ -0,0 +1,26 @@ +package com.win.module.system.controller.app.dict.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "用户 App - 字典数据信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AppDictDataRespVO { + + @Schema(description = "字典数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String label; + + @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") + private String value; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + private String dictType; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/AppAreaController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/AppAreaController.java new file mode 100644 index 0000000..2cd094b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/AppAreaController.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.app.ip; + +import cn.hutool.core.lang.Assert; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.utils.AreaUtils; +import com.win.module.system.controller.app.ip.vo.AppAreaNodeRespVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.security.PermitAll; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 App - 地区") +@RestController +@RequestMapping("/system/area") +@Validated +public class AppAreaController { + + @GetMapping("/tree") + @Operation(summary = "获得地区树") + @PermitAll + public CommonResult> getAreaTree() { + Area area = AreaUtils.getArea(Area.ID_CHINA); + Assert.notNull(area, "获取不到中国"); + return success(BeanUtils.toBean(area.getChildren(), AppAreaNodeRespVO.class)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/vo/AppAreaNodeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/vo/AppAreaNodeRespVO.java new file mode 100644 index 0000000..c62f462 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/app/ip/vo/AppAreaNodeRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.app.ip.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "用户 App - 地区节点 Response VO") +@Data +public class AppAreaNodeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") + private Integer id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京") + private String name; + + /** + * 子节点 + */ + private List children; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/package-info.java new file mode 100644 index 0000000..f7da06a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 win-ui-admin 前端项目 + * 2. app 包:提供给用户 APP win-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package com.win.module.system.controller; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java new file mode 100644 index 0000000..6d52108 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java @@ -0,0 +1,88 @@ +package com.win.module.system.convert.auth; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.controller.admin.auth.vo.*; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.permission.MenuTypeEnum; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import org.slf4j.LoggerFactory; + +import java.util.*; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.common.util.collection.CollectionUtils.filterList; +import static com.win.module.system.dal.dataobject.permission.MenuDO.ID_ROOT; + +@Mapper +public interface AuthConvert { + + AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); + + AuthLoginRespVO convert(OAuth2AccessTokenDO bean); + + default AuthPermissionInfoRespVO convert(AdminUserDO user, List roleList, List menuList) { + return AuthPermissionInfoRespVO.builder() + .user(BeanUtils.toBean(user, AuthPermissionInfoRespVO.UserVO.class)) + .roles(convertSet(roleList, RoleDO::getCode)) + // 权限标识信息 + .permissions(convertSet(menuList, MenuDO::getPermission)) + // 菜单树 + .menus(buildMenuTree(menuList)) + .build(); + } + + AuthPermissionInfoRespVO.MenuVO convertTreeNode(MenuDO menu); + + /** + * 将菜单列表,构建成菜单树 + * + * @param menuList 菜单列表 + * @return 菜单树 + */ + default List buildMenuTree(List menuList) { + if (CollUtil.isEmpty(menuList)) { + return Collections.emptyList(); + } + // 移除按钮 + menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType())); + // 排序,保证菜单的有序性 + menuList.sort(Comparator.comparing(MenuDO::getSort)); + + // 构建菜单树 + // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 + Map treeNodeMap = new LinkedHashMap<>(); + menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu))); + // 处理父子关系 + treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(ID_ROOT)).forEach(childNode -> { + // 获得父节点 + AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId()); + if (parentNode == null) { + LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", + childNode.getId(), childNode.getParentId()); + return; + } + // 将自己添加到父节点中 + if (parentNode.getChildren() == null) { + parentNode.setChildren(new ArrayList<>()); + } + parentNode.getChildren().add(childNode); + }); + // 获得到所有的根节点 + return filterList(treeNodeMap.values(), node -> ID_ROOT.equals(node.getParentId())); + } + + SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO); + + SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO); + + SmsCodeUseReqDTO convert(AuthSmsLoginReqVO reqVO, Integer scene, String usedIp); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java new file mode 100644 index 0000000..b9a8954 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java @@ -0,0 +1,56 @@ +package com.win.module.system.convert.oauth2; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.win.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.win.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.util.oauth2.OAuth2Utils; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Mapper +public interface OAuth2OpenConvert { + + OAuth2OpenConvert INSTANCE = Mappers.getMapper(OAuth2OpenConvert.class); + + default OAuth2OpenAccessTokenRespVO convert(OAuth2AccessTokenDO bean) { + OAuth2OpenAccessTokenRespVO respVO = BeanUtils.toBean(bean, OAuth2OpenAccessTokenRespVO.class); + respVO.setTokenType(SecurityFrameworkUtils.AUTHORIZATION_BEARER.toLowerCase()); + respVO.setExpiresIn(OAuth2Utils.getExpiresIn(bean.getExpiresTime())); + respVO.setScope(OAuth2Utils.buildScopeStr(bean.getScopes())); + return respVO; + } + + default OAuth2OpenCheckTokenRespVO convert2(OAuth2AccessTokenDO bean) { + OAuth2OpenCheckTokenRespVO respVO = BeanUtils.toBean(bean, OAuth2OpenCheckTokenRespVO.class); + respVO.setExp(LocalDateTimeUtil.toEpochMilli(bean.getExpiresTime()) / 1000L); + respVO.setUserType(UserTypeEnum.ADMIN.getValue()); + return respVO; + } + + default OAuth2OpenAuthorizeInfoRespVO convert(OAuth2ClientDO client, List approves) { + // 构建 scopes + List> scopes = new ArrayList<>(client.getScopes().size()); + Map approveMap = CollectionUtils.convertMap(approves, OAuth2ApproveDO::getScope); + client.getScopes().forEach(scope -> { + OAuth2ApproveDO approve = approveMap.get(scope); + scopes.add(new KeyValue<>(scope, approve != null ? approve.getApproved() : false)); + }); + // 拼接返回 + return new OAuth2OpenAuthorizeInfoRespVO( + new OAuth2OpenAuthorizeInfoRespVO.Client(client.getName(), client.getLogo()), scopes); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java new file mode 100644 index 0000000..5baeb0b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.win.module.system.convert; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/social/SocialUserConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/social/SocialUserConvert.java new file mode 100644 index 0000000..f0f3183 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/social/SocialUserConvert.java @@ -0,0 +1,17 @@ +package com.win.module.system.convert.social; + +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserBindReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SocialUserConvert { + + SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class); + + @Mapping(source = "reqVO.type", target = "socialType") + SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java new file mode 100644 index 0000000..e90dde0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java @@ -0,0 +1,26 @@ +package com.win.module.system.convert.tenant; + +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.win.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 租户 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface TenantConvert { + + TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class); + + default UserSaveReqVO convert02(TenantSaveReqVO bean) { + UserSaveReqVO reqVO = new UserSaveReqVO(); + reqVO.setUsername(bean.getUsername()); + reqVO.setPassword(bean.getPassword()); + reqVO.setNickname(bean.getContactName()).setMobile(bean.getContactMobile()); + return reqVO; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java new file mode 100644 index 0000000..1607668 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java @@ -0,0 +1,58 @@ +package com.win.module.system.convert.user; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.win.module.system.controller.admin.dept.vo.post.PostSimpleRespVO; +import com.win.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import com.win.module.system.controller.admin.user.vo.user.UserRespVO; +import com.win.module.system.controller.admin.user.vo.user.UserSimpleRespVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.social.SocialUserDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface UserConvert { + + UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); + + default List convertList(List list, Map deptMap) { + return CollectionUtils.convertList(list, user -> convert(user, deptMap.get(user.getDeptId()))); + } + + default UserRespVO convert(AdminUserDO user, DeptDO dept) { + UserRespVO userVO = BeanUtils.toBean(user, UserRespVO.class); + if (dept != null) { + userVO.setDeptName(dept.getName()); + } + return userVO; + } + + default List convertSimpleList(List list, Map deptMap) { + return CollectionUtils.convertList(list, user -> { + UserSimpleRespVO userVO = BeanUtils.toBean(user, UserSimpleRespVO.class); + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> userVO.setDeptName(dept.getName())); + return userVO; + }); + } + + default UserProfileRespVO convert(AdminUserDO user, List userRoles, + DeptDO dept, List posts, List socialUsers) { + UserProfileRespVO userVO = BeanUtils.toBean(user, UserProfileRespVO.class); + userVO.setRoles(BeanUtils.toBean(userRoles, RoleSimpleRespVO.class)); + userVO.setDept(BeanUtils.toBean(dept, DeptSimpleRespVO.class)); + userVO.setPosts(BeanUtils.toBean(posts, PostSimpleRespVO.class)); + userVO.setSocialUsers(BeanUtils.toBean(socialUsers, UserProfileRespVO.SocialUser.class)); + return userVO; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..2f05ebd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java new file mode 100644 index 0000000..b1c04d4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java @@ -0,0 +1,66 @@ +package com.win.module.system.dal.dataobject.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门表 + * + * @author ruoyi + * @author 芋道源码 + */ +@TableName("system_dept") +@KeySequence("system_dept_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptDO extends TenantBaseDO { + + public static final Long PARENT_ID_ROOT = 0L; + + /** + * 部门ID + */ + @TableId + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门ID + * + * 关联 {@link #id} + */ + private Long parentId; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 负责人 + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long leaderUserId; + /** + * 联系电话 + */ + private String phone; + /** + * 邮箱 + */ + private String email; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java new file mode 100644 index 0000000..3efe1c5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java @@ -0,0 +1,50 @@ +package com.win.module.system.dal.dataobject.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 + * + * @author ruoyi + */ +@TableName("system_post") +@KeySequence("system_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class PostDO extends BaseDO { + + /** + * 岗位序号 + */ + @TableId + private Long id; + /** + * 岗位名称 + */ + private String name; + /** + * 岗位编码 + */ + private String code; + /** + * 岗位排序 + */ + private Integer sort; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java new file mode 100644 index 0000000..974c919 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java @@ -0,0 +1,40 @@ +package com.win.module.system.dal.dataobject.dept; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户和岗位关联 + * + * @author ruoyi + */ +@TableName("system_user_post") +@KeySequence("system_user_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class UserPostDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long userId; + /** + * 角色 ID + * + * 关联 {@link PostDO#getId()} + */ + private Long postId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java new file mode 100644 index 0000000..0baf05e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java @@ -0,0 +1,65 @@ +package com.win.module.system.dal.dataobject.dict; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 字典数据表 + * + * @author ruoyi + */ +@TableName("system_dict_data") +@KeySequence("system_dict_data_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataDO extends BaseDO { + + /** + * 字典数据编号 + */ + @TableId + private Long id; + /** + * 字典排序 + */ + private Integer sort; + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + * + * 冗余 {@link DictDataDO#getDictType()} + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 颜色类型 + * + * 对应到 element-ui 为 default、primary、success、info、warning、danger + */ + private String colorType; + /** + * css 样式 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String cssClass; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java new file mode 100644 index 0000000..6e343c3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java @@ -0,0 +1,57 @@ +package com.win.module.system.dal.dataobject.dict; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 字典类型表 + * + * @author ruoyi + */ +@TableName("system_dict_type") +@KeySequence("system_dict_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DictTypeDO extends BaseDO { + + /** + * 字典主键 + */ + @TableId + private Long id; + /** + * 字典名称 + */ + private String name; + /** + * 字典类型 + */ + private String type; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + + /** + * 删除时间 + */ + private LocalDateTime deletedTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java new file mode 100644 index 0000000..1a1f7d7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java @@ -0,0 +1,72 @@ +package com.win.module.system.dal.dataobject.logger; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.enums.logger.LoginResultEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 登录日志表 + * + * 注意,包括登录和登出两种行为 + * + * @author 芋道源码 + */ +@TableName("system_login_log") +@KeySequence("system_login_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LoginLogDO extends BaseDO { + + /** + * 日志主键 + */ + private Long id; + /** + * 日志类型 + * + * 枚举 {@link LoginLogTypeEnum} + */ + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 用户账号 + * + * 冗余,因为账号可以变更 + */ + private String username; + /** + * 登录结果 + * + * 枚举 {@link LoginResultEnum} + */ + private Integer result; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java new file mode 100644 index 0000000..2e15896 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java @@ -0,0 +1,85 @@ +package com.win.module.system.dal.dataobject.logger; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 操作日志表 + * + * @author 芋道源码 + */ +@TableName(value = "system_operate_log", autoResultMap = true) +@KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +public class OperateLogDO extends BaseDO { + + /** + * 日志主键 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性 + */ + private Long userId; + /** + * 用户类型 + * + * 关联 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 操作模块类型 + */ + private String type; + /** + * 操作名 + */ + private String subType; + /** + * 操作模块业务编号 + */ + private Long bizId; + /** + * 日志内容,记录整个操作的明细 + * + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 + */ + private String action; + /** + * 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ) + * + * 例如说,记录订单编号,{ orderId: "1"} + */ + private String extra; + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 请求地址 + */ + private String requestUrl; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java new file mode 100644 index 0000000..978b1d6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java @@ -0,0 +1,57 @@ +package com.win.module.system.dal.dataobject.mail; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 邮箱账号 DO + * + * 用途:配置发送邮箱的账号 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@TableName(value = "system_mail_account", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class MailAccountDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 邮箱 + */ + private String mail; + + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * SMTP 服务器域名 + */ + private String host; + /** + * SMTP 服务器端口 + */ + private Integer port; + /** + * 是否开启 SSL + */ + private Boolean sslEnable; + /** + * 是否开启 STARTTLS + */ + private Boolean starttlsEnable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java new file mode 100644 index 0000000..a6e6373 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java @@ -0,0 +1,121 @@ +package com.win.module.system.dal.dataobject.mail; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.mail.MailSendStatusEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 邮箱日志 DO + * 记录每一次邮件的发送 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@TableName(value = "system_mail_log", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MailLogDO extends BaseDO implements Serializable { + + /** + * 日志编号,自增 + */ + private Long id; + + /** + * 用户编码 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 接收邮箱地址 + */ + private String toMail; + + /** + * 邮箱账号编号 + * + * 关联 {@link MailAccountDO#getId()} + */ + private Long accountId; + /** + * 发送邮箱地址 + * + * 冗余 {@link MailAccountDO#getMail()} + */ + private String fromMail; + + // ========= 模板相关字段 ========= + /** + * 模版编号 + * + * 关联 {@link MailTemplateDO#getId()} + */ + private Long templateId; + /** + * 模版编码 + * + * 冗余 {@link MailTemplateDO#getCode()} + */ + private String templateCode; + /** + * 模版发送人名称 + * + * 冗余 {@link MailTemplateDO#getNickname()} + */ + private String templateNickname; + /** + * 模版标题 + */ + private String templateTitle; + /** + * 模版内容 + * + * 基于 {@link MailTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 模版参数 + * + * 基于 {@link MailTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + + // ========= 发送相关字段 ========= + /** + * 发送状态 + * + * 枚举 {@link MailSendStatusEnum} + */ + private Integer sendStatus; + /** + * 发送时间 + */ + private LocalDateTime sendTime; + /** + * 发送返回的消息 ID + */ + private String sendMessageId; + /** + * 发送异常 + */ + private String sendException; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java new file mode 100644 index 0000000..6da6966 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java @@ -0,0 +1,71 @@ +package com.win.module.system.dal.dataobject.mail; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 邮件模版 DO + * + * @author wangjingyi + * @since 2022-03-21 + */ +@TableName(value = "system_mail_template", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class MailTemplateDO extends BaseDO { + + /** + * 主键 + */ + private Long id; + /** + * 模版名称 + */ + private String name; + /** + * 模版编号 + */ + private String code; + /** + * 发送的邮箱账号编号 + * + * 关联 {@link MailAccountDO#getId()} + */ + private Long accountId; + + /** + * 发送人名称 + */ + private String nickname; + /** + * 标题 + */ + private String title; + /** + * 内容 + */ + private String content; + /** + * 参数数组(自动根据内容生成) + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java new file mode 100644 index 0000000..7950a0c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java @@ -0,0 +1,47 @@ +package com.win.module.system.dal.dataobject.notice; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.notice.NoticeTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 通知公告表 + * + * @author ruoyi + */ +@TableName("system_notice") +@KeySequence("system_notice_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeDO extends BaseDO { + + /** + * 公告ID + */ + private Long id; + /** + * 公告标题 + */ + private String title; + /** + * 公告类型 + * + * 枚举 {@link NoticeTypeEnum} + */ + private Integer type; + /** + * 公告内容 + */ + private String content; + /** + * 公告状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java new file mode 100644 index 0000000..355b19d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java @@ -0,0 +1,101 @@ +package com.win.module.system.dal.dataobject.notify; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Map; + +/** + * 站内信 DO + * + * @author xrcoder + */ +@TableName(value = "system_notify_message", autoResultMap = true) +@KeySequence("system_notify_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NotifyMessageDO extends BaseDO { + + /** + * 站内信编号,自增 + */ + @TableId + private Long id; + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 字段、或者 AdminUserDO 的 id 字段 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + + // ========= 模板相关字段 ========= + + /** + * 模版编号 + * + * 关联 {@link NotifyTemplateDO#getId()} + */ + private Long templateId; + /** + * 模版编码 + * + * 关联 {@link NotifyTemplateDO#getCode()} + */ + private String templateCode; + /** + * 模版类型 + * + * 冗余 {@link NotifyTemplateDO#getType()} + */ + private Integer templateType; + /** + * 模版发送人名称 + * + * 冗余 {@link NotifyTemplateDO#getNickname()} + */ + private String templateNickname; + /** + * 模版内容 + * + * 基于 {@link NotifyTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 模版参数 + * + * 基于 {@link NotifyTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + + // ========= 读取相关字段 ========= + + /** + * 是否已读 + */ + private Boolean readStatus; + /** + * 阅读时间 + */ + private LocalDateTime readTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java new file mode 100644 index 0000000..5fa6909 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java @@ -0,0 +1,72 @@ +package com.win.module.system.dal.dataobject.notify; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.List; + +/** + * 站内信模版 DO + * + * @author xrcoder + */ +@TableName(value = "system_notify_template", autoResultMap = true) +@KeySequence("system_notify_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NotifyTemplateDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 模版名称 + */ + private String name; + /** + * 模版编码 + */ + private String code; + /** + * 模版类型 + * + * 对应 system_notify_template_type 字典 + */ + private Integer type; + /** + * 发送人名称 + */ + private String nickname; + /** + * 模版内容 + */ + private String content; + /** + * 参数数组 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java new file mode 100644 index 0000000..d0b5f43 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java @@ -0,0 +1,75 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * OAuth2 访问令牌 DO + * + * 如下字段,暂时未使用,暂时不支持: + * user_name、authentication(用户信息) + * + * @author 芋道源码 + */ +@TableName(value = "system_oauth2_access_token", autoResultMap = true) +@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2AccessTokenDO extends TenantBaseDO { + + /** + * 编号,数据库递增 + */ + @TableId + private Long id; + /** + * 访问令牌 + */ + private String accessToken; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 用户信息 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map userInfo; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java new file mode 100644 index 0000000..b181d34 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java @@ -0,0 +1,63 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * OAuth2 批准 DO + * + * 用户在 sso.vue 界面时,记录接受的 scope 列表 + * + * @author 芋道源码 + */ +@TableName(value = "system_oauth2_approve", autoResultMap = true) +@KeySequence("system_oauth2_approve_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2ApproveDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + private String scope; + /** + * 是否接受 + * + * true - 接受 + * false - 拒绝 + */ + private Boolean approved; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java new file mode 100644 index 0000000..19cfe32 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java @@ -0,0 +1,107 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * OAuth2 客户端 DO + * + * @author 芋道源码 + */ +@TableName(value = "system_oauth2_client", autoResultMap = true) +@KeySequence("system_oauth2_client_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2ClientDO extends BaseDO { + + /** + * 编号,数据库自增 + * + * 由于 SQL Server 在存储 String 主键有点问题,所以暂时使用 Long 类型 + */ + @TableId + private Long id; + /** + * 客户端编号 + */ + private String clientId; + /** + * 客户端密钥 + */ + private String secret; + /** + * 应用名 + */ + private String name; + /** + * 应用图标 + */ + private String logo; + /** + * 应用描述 + */ + private String description; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 访问令牌的有效期 + */ + private Integer accessTokenValiditySeconds; + /** + * 刷新令牌的有效期 + */ + private Integer refreshTokenValiditySeconds; + /** + * 可重定向的 URI 地址 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List redirectUris; + /** + * 授权类型(模式) + * + * 枚举 {@link OAuth2GrantTypeEnum} + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List authorizedGrantTypes; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 自动授权的 Scope + * + * code 授权时,如果 scope 在这个范围内,则自动通过 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List autoApproveScopes; + /** + * 权限 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List authorities; + /** + * 资源 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List resourceIds; + /** + * 附加信息,JSON 格式 + */ + private String additionalInformation; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java new file mode 100644 index 0000000..a23ccdf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java @@ -0,0 +1,68 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * OAuth2 授权码 DO + * + * @author 芋道源码 + */ +@TableName(value = "system_oauth2_code", autoResultMap = true) +@KeySequence("system_oauth2_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2CodeDO extends BaseDO { + + /** + * 编号,数据库递增 + */ + private Long id; + /** + * 授权码 + */ + private String code; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getClientId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 重定向地址 + */ + private String redirectUri; + /** + * 状态 + */ + private String state; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java new file mode 100644 index 0000000..b601a9a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java @@ -0,0 +1,63 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * OAuth2 刷新令牌 + * + * @author 芋道源码 + */ +@TableName(value = "system_oauth2_refresh_token", autoResultMap = true) +// 由于 Oracle 的 SEQ 的名字长度有限制,所以就先用 system_oauth2_access_token_seq 吧,反正也没啥问题 +@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2RefreshTokenDO extends TenantBaseDO { + + /** + * 编号,数据库字典 + */ + private Long id; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java new file mode 100644 index 0000000..943722d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java @@ -0,0 +1,107 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.permission.MenuTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 菜单 DO + * + * @author ruoyi + */ +@TableName("system_menu") +@KeySequence("system_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuDO extends BaseDO { + + /** + * 菜单编号 - 根节点 + */ + public static final Long ID_ROOT = 0L; + + /** + * 菜单编号 + */ + @TableId + private Long id; + /** + * 菜单名称 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 菜单类型 + * + * 枚举 {@link MenuTypeEnum} + */ + private Integer type; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 父菜单ID + */ + private Long parentId; + /** + * 路由地址 + * + * 如果 path 为 http(s) 时,则它是外链 + */ + private String path; + /** + * 菜单图标 + */ + private String icon; + /** + * 组件路径 + */ + private String component; + /** + * 组件名 + */ + private String componentName; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 是否可见 + * + * 只有菜单、目录使用 + * 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等 + */ + private Boolean visible; + /** + * 是否缓存 + * + * 只有菜单、目录使用,否使用 Vue 路由的 keep-alive 特性 + * 注意:如果开启缓存,则必须填写 {@link #componentName} 属性,否则无法缓存 + */ + private Boolean keepAlive; + /** + * 是否总是显示 + * + * 如果为 false 时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单 + */ + private Boolean alwaysShow; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java new file mode 100644 index 0000000..cbba702 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java @@ -0,0 +1,78 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.enums.permission.DataScopeEnum; +import com.win.module.system.enums.permission.RoleTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * 角色 DO + * + * @author ruoyi + */ +@TableName(value = "system_role", autoResultMap = true) +@KeySequence("system_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleDO extends TenantBaseDO { + + /** + * 角色ID + */ + @TableId + private Long id; + /** + * 角色名称 + */ + private String name; + /** + * 角色标识 + * + * 枚举 + */ + private String code; + /** + * 角色排序 + */ + private Integer sort; + /** + * 角色状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 角色类型 + * + * 枚举 {@link RoleTypeEnum} + */ + private Integer type; + /** + * 备注 + */ + private String remark; + + /** + * 数据范围 + * + * 枚举 {@link DataScopeEnum} + */ + private Integer dataScope; + /** + * 数据范围(指定部门数组) + * + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Set dataScopeDeptIds; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java new file mode 100644 index 0000000..068d87c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色和菜单关联 + * + * @author ruoyi + */ +@TableName("system_role_menu") +@KeySequence("system_role_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleMenuDO extends TenantBaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 角色ID + */ + private Long roleId; + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java new file mode 100644 index 0000000..ea9a950 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户和角色关联 + * + * @author ruoyi + */ +@TableName("system_user_role") +@KeySequence("system_user_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class UserRoleDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + */ + private Long userId; + /** + * 角色 ID + */ + private Long roleId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java new file mode 100644 index 0000000..d2a5ebe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java @@ -0,0 +1,62 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.framework.sms.core.enums.SmsChannelEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 短信渠道 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_channel", autoResultMap = true) +@KeySequence("system_sms_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelDO extends BaseDO { + + /** + * 渠道编号 + */ + private Long id; + /** + * 短信签名 + */ + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + private String code; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的账号 + */ + private String apiKey; + /** + * 短信 API 的密钥 + */ + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java new file mode 100644 index 0000000..6703a42 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java @@ -0,0 +1,65 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 手机验证码 DO + * + * idx_mobile 索引:基于 {@link #mobile} 字段 + * + * @author 芋道源码 + */ +@TableName("system_sms_code") +@KeySequence("system_sms_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SmsCodeDO extends BaseDO { + + /** + * 编号 + */ + private Long id; + /** + * 手机号 + */ + private String mobile; + /** + * 验证码 + */ + private String code; + /** + * 发送场景 + * + * 枚举 {@link SmsCodeDO} + */ + private Integer scene; + /** + * 创建 IP + */ + private String createIp; + /** + * 今日发送的第几条 + */ + private Integer todayIndex; + /** + * 是否使用 + */ + private Boolean used; + /** + * 使用时间 + */ + private LocalDateTime usedTime; + /** + * 使用 IP + */ + private String usedIp; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java new file mode 100644 index 0000000..b0f1b78 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java @@ -0,0 +1,161 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.sms.SmsReceiveStatusEnum; +import com.win.module.system.enums.sms.SmsSendStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 短信日志 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_log", autoResultMap = true) +@KeySequence("system_sms_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SmsLogDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SmsChannelDO#getCode()} + */ + private String channelCode; + + // ========= 模板相关字段 ========= + + /** + * 模板编号 + * + * 关联 {@link SmsTemplateDO#getId()} + */ + private Long templateId; + /** + * 模板编码 + * + * 冗余 {@link SmsTemplateDO#getCode()} + */ + private String templateCode; + /** + * 短信类型 + * + * 冗余 {@link SmsTemplateDO#getType()} + */ + private Integer templateType; + /** + * 基于 {@link SmsTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 基于 {@link SmsTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + /** + * 短信 API 的模板编号 + * + * 冗余 {@link SmsTemplateDO#getApiTemplateId()} + */ + private String apiTemplateId; + + // ========= 手机相关字段 ========= + + /** + * 手机号 + */ + private String mobile; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + + // ========= 发送相关字段 ========= + + /** + * 发送状态 + * + * 枚举 {@link SmsSendStatusEnum} + */ + private Integer sendStatus; + /** + * 发送时间 + */ + private LocalDateTime sendTime; + /** + * 短信 API 发送结果的编码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiSendCode; + /** + * 短信 API 发送失败的提示 + */ + private String apiSendMsg; + /** + * 短信 API 发送返回的唯一请求 ID + * + * 用于和短信 API 进行定位于排错 + */ + private String apiRequestId; + /** + * 短信 API 发送返回的序号 + * + * 用于和短信 API 平台的发送记录关联 + */ + private String apiSerialNo; + + // ========= 接收相关字段 ========= + + /** + * 接收状态 + * + * 枚举 {@link SmsReceiveStatusEnum} + */ + private Integer receiveStatus; + /** + * 接收时间 + */ + private LocalDateTime receiveTime; + /** + * 短信 API 接收结果的编码 + */ + private String apiReceiveCode; + /** + * 短信 API 接收结果的提示 + */ + private String apiReceiveMsg; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java new file mode 100644 index 0000000..8cac6da --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java @@ -0,0 +1,91 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.module.system.enums.sms.SmsTemplateTypeEnum; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +/** + * 短信模板 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_template", autoResultMap = true) +@KeySequence("system_sms_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 模板相关字段 ========= + + /** + * 短信类型 + * + * 枚举 {@link SmsTemplateTypeEnum} + */ + private Integer type; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 模板编码,保证唯一 + */ + private String code; + /** + * 模板名称 + */ + private String name; + /** + * 模板内容 + * + * 内容的参数,使用 {} 包括,例如说 {name} + */ + private String content; + /** + * 参数数组(自动根据内容生成) + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的模板编号 + */ + private String apiTemplateId; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SmsChannelDO#getCode()} + */ + private String channelCode; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialClientDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialClientDO.java new file mode 100644 index 0000000..d807475 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialClientDO.java @@ -0,0 +1,76 @@ +package com.win.module.system.dal.dataobject.social; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.xingyuv.jushauth.config.AuthConfig; +import lombok.*; + +/** + * 社交客户端 DO + * + * 对应 {@link AuthConfig} 配置,满足不同租户,有自己的客户端配置,实现社交(三方)登录 + * + * @author 芋道源码 + */ +@TableName(value = "system_social_client", autoResultMap = true) +@KeySequence("system_social_client_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SocialClientDO extends TenantBaseDO { + + /** + * 编号,自增 + */ + @TableId + private Long id; + /** + * 应用名 + */ + private String name; + /** + * 社交类型 + * + * 枚举 {@link SocialTypeEnum} + */ + private Integer socialType; + /** + * 用户类型 + * + * 目的:不同用户类型,对应不同的小程序,需要自己的配置 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + + /** + * 客户端 id + */ + private String clientId; + /** + * 客户端 Secret + */ + private String clientSecret; + + /** + * 代理编号 + * + * 目前只有部分“社交类型”在使用: + * 1. 企业微信:对应授权方的网页应用 ID + */ + private String agentId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserBindDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserBindDO.java new file mode 100644 index 0000000..6c862d0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserBindDO.java @@ -0,0 +1,56 @@ +package com.win.module.system.dal.dataobject.social; + +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 社交用户的绑定 + * 即 {@link SocialUserDO} 与 UserDO 的关联表 + * + * @author 芋道源码 + */ +@TableName(value = "system_social_user_bind", autoResultMap = true) +@KeySequence("system_social_user_bind_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SocialUserBindDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 关联的用户编号 + * + * 关联 UserDO 的编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + + /** + * 社交平台的用户编号 + * + * 关联 {@link SocialUserDO#getId()} + */ + private Long socialUserId; + /** + * 社交平台的类型 + * + * 冗余 {@link SocialUserDO#getType()} + */ + private Integer socialType; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserDO.java new file mode 100644 index 0000000..24a92bd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/social/SocialUserDO.java @@ -0,0 +1,73 @@ +package com.win.module.system.dal.dataobject.social; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 社交(三方)用户 + * + * @author weir + */ +@TableName(value = "system_social_user", autoResultMap = true) +@KeySequence("system_social_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SocialUserDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 社交平台的类型 + * + * 枚举 {@link SocialTypeEnum} + */ + private Integer type; + + /** + * 社交 openid + */ + private String openid; + /** + * 社交 token + */ + private String token; + /** + * 原始 Token 数据,一般是 JSON 格式 + */ + private String rawTokenInfo; + + /** + * 用户昵称 + */ + private String nickname; + /** + * 用户头像 + */ + private String avatar; + /** + * 原始用户数据,一般是 JSON 格式 + */ + private String rawUserInfo; + + /** + * 最后一次的认证 code + */ + private String code; + /** + * 最后一次的认证 state + */ + private String state; + +} + + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java new file mode 100644 index 0000000..0b81f43 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java @@ -0,0 +1,80 @@ +package com.win.module.system.dal.dataobject.tenant; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 租户 DO + * + * @author 芋道源码 + */ +@TableName(value = "system_tenant", autoResultMap = true) +@KeySequence("system_tenant_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TenantDO extends BaseDO { + + /** + * 套餐编号 - 系统 + */ + public static final Long PACKAGE_ID_SYSTEM = 0L; + + /** + * 租户编号,自增 + */ + private Long id; + /** + * 租户名,唯一 + */ + private String name; + /** + * 联系人的用户编号 + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long contactUserId; + /** + * 联系人 + */ + private String contactName; + /** + * 联系手机 + */ + private String contactMobile; + /** + * 租户状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 绑定域名 + */ + private String website; + /** + * 租户套餐编号 + * + * 关联 {@link TenantPackageDO#getId()} + * 特殊逻辑:系统内置租户,不使用套餐,暂时使用 {@link #PACKAGE_ID_SYSTEM} 标识 + */ + private Long packageId; + /** + * 过期时间 + */ + private LocalDateTime expireTime; + /** + * 账号数量 + */ + private Integer accountCount; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java new file mode 100644 index 0000000..2a29200 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java @@ -0,0 +1,52 @@ +package com.win.module.system.dal.dataobject.tenant; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.Set; + +/** + * 租户套餐 DO + * + * @author 芋道源码 + */ +@TableName(value = "system_tenant_package", autoResultMap = true) +@KeySequence("system_tenant_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TenantPackageDO extends BaseDO { + + /** + * 套餐编号,自增 + */ + private Long id; + /** + * 套餐名,唯一 + */ + private String name; + /** + * 租户套餐状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 关联的菜单编号 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Set menuIds; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java new file mode 100644 index 0000000..2016a31 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java @@ -0,0 +1,96 @@ +package com.win.module.system.dal.dataobject.user; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.enums.common.SexEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.time.LocalDateTime; +import java.util.Set; + +/** + * 管理后台的用户 DO + * + * @author 芋道源码 + */ +@TableName(value = "system_users", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users +@KeySequence("system_users_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AdminUserDO extends TenantBaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 用户账号 + */ + private String username; + /** + * 加密后的密码 + * + * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 + */ + private String password; + /** + * 用户昵称 + */ + private String nickname; + /** + * 备注 + */ + private String remark; + /** + * 部门 ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Set postIds; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户性别 + * + * 枚举类 {@link SexEnum} + */ + private Integer sex; + /** + * 用户头像 + */ + private String avatar; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 最后登录IP + */ + private String loginIp; + /** + * 最后登录时间 + */ + private LocalDateTime loginDate; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java new file mode 100644 index 0000000..451a76a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java @@ -0,0 +1,37 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface DeptMapper extends BaseMapperX { + + default List selectList(DeptListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeptDO::getName, reqVO.getName()) + .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); + } + + default DeptDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(DeptDO::getParentId, parentId, DeptDO::getName, name); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(DeptDO::getParentId, parentId); + } + + default List selectListByParentId(Collection parentIds) { + return selectList(DeptDO::getParentId, parentIds); + } + + default List selectListByLeaderUserId(Long id) { + return selectList(DeptDO::getLeaderUserId, id); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java new file mode 100644 index 0000000..c9c8b33 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java @@ -0,0 +1,38 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface PostMapper extends BaseMapperX { + + default List selectList(Collection ids, Collection statuses) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(PostDO::getId, ids) + .inIfPresent(PostDO::getStatus, statuses)); + } + + default PageResult selectPage(PostPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(PostDO::getCode, reqVO.getCode()) + .likeIfPresent(PostDO::getName, reqVO.getName()) + .eqIfPresent(PostDO::getStatus, reqVO.getStatus()) + .orderByDesc(PostDO::getId)); + } + + default PostDO selectByName(String name) { + return selectOne(PostDO::getName, name); + } + + default PostDO selectByCode(String code) { + return selectOne(PostDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java new file mode 100644 index 0000000..bf64f77 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java @@ -0,0 +1,32 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.dal.dataobject.dept.UserPostDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface UserPostMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(UserPostDO::getUserId, userId); + } + + default void deleteByUserIdAndPostId(Long userId, Collection postIds) { + delete(new LambdaQueryWrapperX() + .eq(UserPostDO::getUserId, userId) + .in(UserPostDO::getPostId, postIds)); + } + + default List selectListByPostIds(Collection postIds) { + return selectList(UserPostDO::getPostId, postIds); + } + + default void deleteByUserId(Long userId) { + delete(Wrappers.lambdaUpdate(UserPostDO.class).eq(UserPostDO::getUserId, userId)); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java new file mode 100644 index 0000000..6a5c69b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java @@ -0,0 +1,49 @@ +package com.win.module.system.dal.mysql.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +@Mapper +public interface DictDataMapper extends BaseMapperX { + + default DictDataDO selectByDictTypeAndValue(String dictType, String value) { + return selectOne(DictDataDO::getDictType, dictType, DictDataDO::getValue, value); + } + + default DictDataDO selectByDictTypeAndLabel(String dictType, String label) { + return selectOne(DictDataDO::getDictType, dictType, DictDataDO::getLabel, label); + } + + default List selectByDictTypeAndValues(String dictType, Collection values) { + return selectList(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .in(DictDataDO::getValue, values)); + } + + default long selectCountByDictType(String dictType) { + return selectCount(DictDataDO::getDictType, dictType); + } + + default PageResult selectPage(DictDataPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .eqIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus()) + .orderByDesc(Arrays.asList(DictDataDO::getDictType, DictDataDO::getSort))); + } + + default List selectListByStatusAndDictType(Integer status, String dictType) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DictDataDO::getStatus, status) + .eqIfPresent(DictDataDO::getDictType, dictType)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java new file mode 100644 index 0000000..e252018 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java @@ -0,0 +1,37 @@ +package com.win.module.system.dal.mysql.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.time.LocalDateTime; + +@Mapper +public interface DictTypeMapper extends BaseMapperX { + + default PageResult selectPage(DictTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictTypeDO::getName, reqVO.getName()) + .likeIfPresent(DictTypeDO::getType, reqVO.getType()) + .eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DictTypeDO::getId)); + } + + default DictTypeDO selectByType(String type) { + return selectOne(DictTypeDO::getType, type); + } + + default DictTypeDO selectByName(String name) { + return selectOne(DictTypeDO::getName, name); + } + + @Update("UPDATE system_dict_type SET deleted = 1, deleted_time = #{deletedTime} WHERE id = #{id}") + void updateToDelete(@Param("id") Long id, @Param("deletedTime") LocalDateTime deletedTime); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java new file mode 100644 index 0000000..e92b908 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java @@ -0,0 +1,28 @@ +package com.win.module.system.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.module.system.enums.logger.LoginResultEnum; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface LoginLogMapper extends BaseMapperX { + + default PageResult selectPage(LoginLogPageReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(LoginLogDO::getUserIp, reqVO.getUserIp()) + .likeIfPresent(LoginLogDO::getUsername, reqVO.getUsername()) + .betweenIfPresent(LoginLogDO::getCreateTime, reqVO.getCreateTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc(LoginLogDO::getId); // 降序 + return selectPage(reqVO, query); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java new file mode 100644 index 0000000..9bb51da --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java @@ -0,0 +1,33 @@ +package com.win.module.system.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.api.logger.dto.OperateLogPageReqDTO; +import com.win.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OperateLogMapper extends BaseMapperX { + + default PageResult selectPage(OperateLogPageReqVO pageReqDTO) { + return selectPage(pageReqDTO, new LambdaQueryWrapperX() + .eqIfPresent(OperateLogDO::getUserId, pageReqDTO.getUserId()) + .eqIfPresent(OperateLogDO::getBizId, pageReqDTO.getBizId()) + .likeIfPresent(OperateLogDO::getType, pageReqDTO.getType()) + .likeIfPresent(OperateLogDO::getSubType, pageReqDTO.getSubType()) + .likeIfPresent(OperateLogDO::getAction, pageReqDTO.getAction()) + .betweenIfPresent(OperateLogDO::getCreateTime, pageReqDTO.getCreateTime()) + .orderByDesc(OperateLogDO::getId)); + } + + default PageResult selectPage(OperateLogPageReqDTO pageReqDTO) { + return selectPage(pageReqDTO, new LambdaQueryWrapperX() + .eqIfPresent(OperateLogDO::getType, pageReqDTO.getType()) + .eqIfPresent(OperateLogDO::getBizId, pageReqDTO.getBizId()) + .eqIfPresent(OperateLogDO::getUserId, pageReqDTO.getUserId()) + .orderByDesc(OperateLogDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java new file mode 100644 index 0000000..3896a46 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java @@ -0,0 +1,20 @@ +package com.win.module.system.dal.mysql.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MailAccountMapper extends BaseMapperX { + + default PageResult selectPage(MailAccountPageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .likeIfPresent(MailAccountDO::getMail, pageReqVO.getMail()) + .likeIfPresent(MailAccountDO::getUsername , pageReqVO.getUsername())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java new file mode 100644 index 0000000..df2052f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java @@ -0,0 +1,25 @@ +package com.win.module.system.dal.mysql.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MailLogMapper extends BaseMapperX { + + default PageResult selectPage(MailLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MailLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(MailLogDO::getUserType, reqVO.getUserType()) + .likeIfPresent(MailLogDO::getToMail, reqVO.getToMail()) + .eqIfPresent(MailLogDO::getAccountId, reqVO.getAccountId()) + .eqIfPresent(MailLogDO::getTemplateId, reqVO.getTemplateId()) + .eqIfPresent(MailLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(MailLogDO::getSendTime, reqVO.getSendTime()) + .orderByDesc(MailLogDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java new file mode 100644 index 0000000..b8ddbd1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.mysql.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import com.win.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; + +@Mapper +public interface MailTemplateMapper extends BaseMapperX { + + default PageResult selectPage(MailTemplatePageReqVO pageReqVO){ + return selectPage(pageReqVO , new LambdaQueryWrapperX() + .eqIfPresent(MailTemplateDO::getStatus, pageReqVO.getStatus()) + .likeIfPresent(MailTemplateDO::getCode, pageReqVO.getCode()) + .likeIfPresent(MailTemplateDO::getName, pageReqVO.getName()) + .eqIfPresent(MailTemplateDO::getAccountId, pageReqVO.getAccountId()) + .betweenIfPresent(MailTemplateDO::getCreateTime, pageReqVO.getCreateTime())); + } + + default Long selectCountByAccountId(Long accountId) { + return selectCount(MailTemplateDO::getAccountId, accountId); + } + + default MailTemplateDO selectByCode(String code) { + return selectOne(MailTemplateDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java new file mode 100644 index 0000000..7906976 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java @@ -0,0 +1,20 @@ +package com.win.module.system.dal.mysql.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NoticeMapper extends BaseMapperX { + + default PageResult selectPage(NoticePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NoticeDO::getTitle, reqVO.getTitle()) + .eqIfPresent(NoticeDO::getStatus, reqVO.getStatus()) + .orderByDesc(NoticeDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java new file mode 100644 index 0000000..fb22811 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java @@ -0,0 +1,70 @@ +package com.win.module.system.dal.mysql.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +@Mapper +public interface NotifyMessageMapper extends BaseMapperX { + + default PageResult selectPage(NotifyMessagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(NotifyMessageDO::getUserId, reqVO.getUserId()) + .eqIfPresent(NotifyMessageDO::getUserType, reqVO.getUserType()) + .likeIfPresent(NotifyMessageDO::getTemplateCode, reqVO.getTemplateCode()) + .eqIfPresent(NotifyMessageDO::getTemplateType, reqVO.getTemplateType()) + .betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NotifyMessageDO::getId)); + } + + default PageResult selectPage(NotifyMessageMyPageReqVO reqVO, Long userId, Integer userType) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(NotifyMessageDO::getReadStatus, reqVO.getReadStatus()) + .betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime()) + .eq(NotifyMessageDO::getUserId, userId) + .eq(NotifyMessageDO::getUserType, userType) + .orderByDesc(NotifyMessageDO::getId)); + } + + default int updateListRead(Collection ids, Long userId, Integer userType) { + return update(new NotifyMessageDO().setReadStatus(true).setReadTime(LocalDateTime.now()), + new LambdaQueryWrapperX() + .in(NotifyMessageDO::getId, ids) + .eq(NotifyMessageDO::getUserId, userId) + .eq(NotifyMessageDO::getUserType, userType) + .eq(NotifyMessageDO::getReadStatus, false)); + } + + default int updateListRead(Long userId, Integer userType) { + return update(new NotifyMessageDO().setReadStatus(true).setReadTime(LocalDateTime.now()), + new LambdaQueryWrapperX() + .eq(NotifyMessageDO::getUserId, userId) + .eq(NotifyMessageDO::getUserType, userType) + .eq(NotifyMessageDO::getReadStatus, false)); + } + + default List selectUnreadListByUserIdAndUserType(Long userId, Integer userType, Integer size) { + return selectList(new QueryWrapperX() // 由于要使用 limitN 语句,所以只能用 QueryWrapperX + .eq("user_id", userId) + .eq("user_type", userType) + .eq("read_status", false) + .orderByDesc("id").limitN(size)); + } + + default Long selectUnreadCountByUserIdAndUserType(Long userId, Integer userType) { + return selectCount(new LambdaQueryWrapperX() + .eq(NotifyMessageDO::getReadStatus, false) + .eq(NotifyMessageDO::getUserId, userId) + .eq(NotifyMessageDO::getUserType, userType)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java new file mode 100644 index 0000000..745e704 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java @@ -0,0 +1,26 @@ +package com.win.module.system.dal.mysql.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.notify.vo.template.NotifyTemplatePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NotifyTemplateMapper extends BaseMapperX { + + default NotifyTemplateDO selectByCode(String code) { + return selectOne(NotifyTemplateDO::getCode, code); + } + + default PageResult selectPage(NotifyTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NotifyTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(NotifyTemplateDO::getName, reqVO.getName()) + .eqIfPresent(NotifyTemplateDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(NotifyTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NotifyTemplateDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java new file mode 100644 index 0000000..967ec5e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.tenant.core.aop.TenantIgnore; +import com.win.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; +import java.util.List; + +@Mapper +public interface OAuth2AccessTokenMapper extends BaseMapperX { + + @TenantIgnore // 获取 token 的时候,需要忽略租户编号。原因是:一些场景下,可能不会传递 tenant-id 请求头,例如说文件上传、积木报表等等 + default OAuth2AccessTokenDO selectByAccessToken(String accessToken) { + return selectOne(OAuth2AccessTokenDO::getAccessToken, accessToken); + } + + default List selectListByRefreshToken(String refreshToken) { + return selectList(OAuth2AccessTokenDO::getRefreshToken, refreshToken); + } + + default PageResult selectPage(OAuth2AccessTokenPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(OAuth2AccessTokenDO::getUserId, reqVO.getUserId()) + .eqIfPresent(OAuth2AccessTokenDO::getUserType, reqVO.getUserType()) + .likeIfPresent(OAuth2AccessTokenDO::getClientId, reqVO.getClientId()) + .gt(OAuth2AccessTokenDO::getExpiresTime, LocalDateTime.now()) + .orderByDesc(OAuth2AccessTokenDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java new file mode 100644 index 0000000..12be49f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java @@ -0,0 +1,28 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface OAuth2ApproveMapper extends BaseMapperX { + + default int update(OAuth2ApproveDO updateObj) { + return update(updateObj, new LambdaQueryWrapperX() + .eq(OAuth2ApproveDO::getUserId, updateObj.getUserId()) + .eq(OAuth2ApproveDO::getUserType, updateObj.getUserType()) + .eq(OAuth2ApproveDO::getClientId, updateObj.getClientId()) + .eq(OAuth2ApproveDO::getScope, updateObj.getScope())); + } + + default List selectListByUserIdAndUserTypeAndClientId(Long userId, Integer userType, String clientId) { + return selectList(new LambdaQueryWrapperX() + .eq(OAuth2ApproveDO::getUserId, userId) + .eq(OAuth2ApproveDO::getUserType, userType) + .eq(OAuth2ApproveDO::getClientId, clientId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java new file mode 100644 index 0000000..6b8b224 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java @@ -0,0 +1,30 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + * OAuth2 客户端 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface OAuth2ClientMapper extends BaseMapperX { + + default PageResult selectPage(OAuth2ClientPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(OAuth2ClientDO::getName, reqVO.getName()) + .eqIfPresent(OAuth2ClientDO::getStatus, reqVO.getStatus()) + .orderByDesc(OAuth2ClientDO::getId)); + } + + default OAuth2ClientDO selectByClientId(String clientId) { + return selectOne(OAuth2ClientDO::getClientId, clientId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java new file mode 100644 index 0000000..3e3fa07 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java @@ -0,0 +1,14 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OAuth2CodeMapper extends BaseMapperX { + + default OAuth2CodeDO selectByCode(String code) { + return selectOne(OAuth2CodeDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java new file mode 100644 index 0000000..8b6897a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java @@ -0,0 +1,22 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.tenant.core.aop.TenantIgnore; +import com.win.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OAuth2RefreshTokenMapper extends BaseMapperX { + + default int deleteByRefreshToken(String refreshToken) { + return delete(new LambdaQueryWrapperX() + .eq(OAuth2RefreshTokenDO::getRefreshToken, refreshToken)); + } + + @TenantIgnore // 获取 token 的时候,需要忽略租户编号。原因是:一些场景下,可能不会传递 tenant-id 请求头,例如说文件上传、积木报表等等 + default OAuth2RefreshTokenDO selectByRefreshToken(String refreshToken) { + return selectOne(OAuth2RefreshTokenDO::getRefreshToken, refreshToken); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java new file mode 100644 index 0000000..e42d8a5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java @@ -0,0 +1,9 @@ +/** + * DAL = Data Access Layer 数据访问层 + * 1. data object:数据对象 + * 2. redis:Redis 的 CRUD 操作 + * 3. mysql:MySQL 的 CRUD 操作 + * + * 其中,MySQL 的表以 system_ 作为前缀 + */ +package com.win.module.system.dal.mysql; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java new file mode 100644 index 0000000..a7539d9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java @@ -0,0 +1,31 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface MenuMapper extends BaseMapperX { + + default MenuDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(MenuDO::getParentId, parentId, MenuDO::getName, name); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(MenuDO::getParentId, parentId); + } + + default List selectList(MenuListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(MenuDO::getName, reqVO.getName()) + .eqIfPresent(MenuDO::getStatus, reqVO.getStatus())); + } + + default List selectListByPermission(String permission) { + return selectList(MenuDO::getPermission, permission); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java new file mode 100644 index 0000000..64a6709 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java @@ -0,0 +1,39 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface RoleMapper extends BaseMapperX { + + default PageResult selectPage(RolePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(RoleDO::getName, reqVO.getName()) + .likeIfPresent(RoleDO::getCode, reqVO.getCode()) + .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(BaseDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(RoleDO::getSort)); + } + + default RoleDO selectByName(String name) { + return selectOne(RoleDO::getName, name); + } + + default RoleDO selectByCode(String code) { + return selectOne(RoleDO::getCode, code); + } + + default List selectListByStatus(@Nullable Collection statuses) { + return selectList(RoleDO::getStatus, statuses); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java new file mode 100644 index 0000000..b665d89 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java @@ -0,0 +1,40 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.system.dal.dataobject.permission.RoleMenuDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface RoleMenuMapper extends BaseMapperX { + + default List selectListByRoleId(Long roleId) { + return selectList(RoleMenuDO::getRoleId, roleId); + } + + default List selectListByRoleId(Collection roleIds) { + return selectList(RoleMenuDO::getRoleId, roleIds); + } + + default List selectListByMenuId(Long menuId) { + return selectList(RoleMenuDO::getMenuId, menuId); + } + + default void deleteListByRoleIdAndMenuIds(Long roleId, Collection menuIds) { + delete(new LambdaQueryWrapper() + .eq(RoleMenuDO::getRoleId, roleId) + .in(RoleMenuDO::getMenuId, menuIds)); + } + + default void deleteListByMenuId(Long menuId) { + delete(new LambdaQueryWrapper().eq(RoleMenuDO::getMenuId, menuId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new LambdaQueryWrapper().eq(RoleMenuDO::getRoleId, roleId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java new file mode 100644 index 0000000..3be1519 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java @@ -0,0 +1,36 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.system.dal.dataobject.permission.UserRoleDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface UserRoleMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(UserRoleDO::getUserId, userId); + } + + default void deleteListByUserIdAndRoleIdIds(Long userId, Collection roleIds) { + delete(new LambdaQueryWrapper() + .eq(UserRoleDO::getUserId, userId) + .in(UserRoleDO::getRoleId, roleIds)); + } + + default void deleteListByUserId(Long userId) { + delete(new LambdaQueryWrapper().eq(UserRoleDO::getUserId, userId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new LambdaQueryWrapper().eq(UserRoleDO::getRoleId, roleId)); + } + + default List selectListByRoleIds(Collection roleIds) { + return selectList(UserRoleDO::getRoleId, roleIds); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java new file mode 100644 index 0000000..6e55fcd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java @@ -0,0 +1,25 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsChannelMapper extends BaseMapperX { + + default PageResult selectPage(SmsChannelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SmsChannelDO::getSignature, reqVO.getSignature()) + .eqIfPresent(SmsChannelDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SmsChannelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsChannelDO::getId)); + } + + default SmsChannelDO selectByCode(String code) { + return selectOne(SmsChannelDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java new file mode 100644 index 0000000..8bbcd1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java @@ -0,0 +1,28 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import com.win.module.system.dal.dataobject.sms.SmsCodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsCodeMapper extends BaseMapperX { + + /** + * 获得手机号的最后一个手机验证码 + * + * @param mobile 手机号 + * @param scene 发送场景,选填 + * @param code 验证码 选填 + * @return 手机验证码 + */ + default SmsCodeDO selectLastByMobile(String mobile, String code, Integer scene) { + return selectOne(new QueryWrapperX() + .eq("mobile", mobile) + .eqIfPresent("scene", scene) + .eqIfPresent("code", code) + .orderByDesc("id") + .limitN(1)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java new file mode 100644 index 0000000..06692d0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java @@ -0,0 +1,25 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsLogMapper extends BaseMapperX { + + default PageResult selectPage(SmsLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsLogDO::getChannelId, reqVO.getChannelId()) + .eqIfPresent(SmsLogDO::getTemplateId, reqVO.getTemplateId()) + .likeIfPresent(SmsLogDO::getMobile, reqVO.getMobile()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(SmsLogDO::getSendTime, reqVO.getSendTime()) + .eqIfPresent(SmsLogDO::getReceiveStatus, reqVO.getReceiveStatus()) + .betweenIfPresent(SmsLogDO::getReceiveTime, reqVO.getReceiveTime()) + .orderByDesc(SmsLogDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java new file mode 100644 index 0000000..c8117f6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java @@ -0,0 +1,33 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsTemplateMapper extends BaseMapperX { + + default SmsTemplateDO selectByCode(String code) { + return selectOne(SmsTemplateDO::getCode, code); + } + + default PageResult selectPage(SmsTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); + } + + default Long selectCountByChannelId(Long channelId) { + return selectCount(SmsTemplateDO::getChannelId, channelId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialClientMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialClientMapper.java new file mode 100644 index 0000000..595dc80 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialClientMapper.java @@ -0,0 +1,28 @@ +package com.win.module.system.dal.mysql.social; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; +import com.win.module.system.dal.dataobject.social.SocialClientDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SocialClientMapper extends BaseMapperX { + + default SocialClientDO selectBySocialTypeAndUserType(Integer socialType, Integer userType) { + return selectOne(SocialClientDO::getSocialType, socialType, + SocialClientDO::getUserType, userType); + } + + default PageResult selectPage(SocialClientPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SocialClientDO::getName, reqVO.getName()) + .eqIfPresent(SocialClientDO::getSocialType, reqVO.getSocialType()) + .eqIfPresent(SocialClientDO::getUserType, reqVO.getUserType()) + .likeIfPresent(SocialClientDO::getClientId, reqVO.getClientId()) + .eqIfPresent(SocialClientDO::getStatus, reqVO.getStatus()) + .orderByDesc(SocialClientDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserBindMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserBindMapper.java new file mode 100644 index 0000000..554ae8e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserBindMapper.java @@ -0,0 +1,44 @@ +package com.win.module.system.dal.mysql.social; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.dal.dataobject.social.SocialUserBindDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SocialUserBindMapper extends BaseMapperX { + + default void deleteByUserTypeAndUserIdAndSocialType(Integer userType, Long userId, Integer socialType) { + delete(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserType, userType) + .eq(SocialUserBindDO::getUserId, userId) + .eq(SocialUserBindDO::getSocialType, socialType)); + } + + default void deleteByUserTypeAndSocialUserId(Integer userType, Long socialUserId) { + delete(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserType, userType) + .eq(SocialUserBindDO::getSocialUserId, socialUserId)); + } + + default SocialUserBindDO selectByUserTypeAndSocialUserId(Integer userType, Long socialUserId) { + return selectOne(SocialUserBindDO::getUserType, userType, + SocialUserBindDO::getSocialUserId, socialUserId); + } + + default List selectListByUserIdAndUserType(Long userId, Integer userType) { + return selectList(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserId, userId) + .eq(SocialUserBindDO::getUserType, userType)); + } + + default SocialUserBindDO selectByUserIdAndUserTypeAndSocialType(Long userId, Integer userType, Integer socialType) { + return selectOne(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserId, userId) + .eq(SocialUserBindDO::getUserType, userType) + .eq(SocialUserBindDO::getSocialType, socialType)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserMapper.java new file mode 100644 index 0000000..190709a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/social/SocialUserMapper.java @@ -0,0 +1,36 @@ +package com.win.module.system.dal.mysql.social; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO; +import com.win.module.system.dal.dataobject.social.SocialUserDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SocialUserMapper extends BaseMapperX { + + default SocialUserDO selectByTypeAndCodeAnState(Integer type, String code, String state) { + return selectOne(new LambdaQueryWrapper() + .eq(SocialUserDO::getType, type) + .eq(SocialUserDO::getCode, code) + .eq(SocialUserDO::getState, state)); + } + + default SocialUserDO selectByTypeAndOpenid(Integer type, String openid) { + return selectOne(new LambdaQueryWrapper() + .eq(SocialUserDO::getType, type) + .eq(SocialUserDO::getOpenid, openid)); + } + + default PageResult selectPage(SocialUserPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SocialUserDO::getType, reqVO.getType()) + .likeIfPresent(SocialUserDO::getNickname, reqVO.getNickname()) + .likeIfPresent(SocialUserDO::getOpenid, reqVO.getOpenid()) + .betweenIfPresent(SocialUserDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SocialUserDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java new file mode 100644 index 0000000..7d7325d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java @@ -0,0 +1,46 @@ +package com.win.module.system.dal.mysql.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 租户 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface TenantMapper extends BaseMapperX { + + default PageResult selectPage(TenantPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default TenantDO selectByName(String name) { + return selectOne(TenantDO::getName, name); + } + + default TenantDO selectByWebsite(String website) { + return selectOne(TenantDO::getWebsite, website); + } + + default Long selectCountByPackageId(Long packageId) { + return selectCount(TenantDO::getPackageId, packageId); + } + + default List selectListByPackageId(Long packageId) { + return selectList(TenantDO::getPackageId, packageId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java new file mode 100644 index 0000000..4e59c33 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java @@ -0,0 +1,32 @@ +package com.win.module.system.dal.mysql.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 租户套餐 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface TenantPackageMapper extends BaseMapperX { + + default PageResult selectPage(TenantPackagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantPackageDO::getName, reqVO.getName()) + .eqIfPresent(TenantPackageDO::getStatus, reqVO.getStatus()) + .likeIfPresent(TenantPackageDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TenantPackageDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantPackageDO::getId)); + } + + default List selectListByStatus(Integer status) { + return selectList(TenantPackageDO::getStatus, status); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java new file mode 100644 index 0000000..6167c99 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java @@ -0,0 +1,50 @@ +package com.win.module.system.dal.mysql.user; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.admin.user.vo.user.UserPageReqVO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface AdminUserMapper extends BaseMapperX { + + default AdminUserDO selectByUsername(String username) { + return selectOne(AdminUserDO::getUsername, username); + } + + default AdminUserDO selectByEmail(String email) { + return selectOne(AdminUserDO::getEmail, email); + } + + default AdminUserDO selectByMobile(String mobile) { + return selectOne(AdminUserDO::getMobile, mobile); + } + + default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds) + .orderByDesc(AdminUserDO::getId)); + } + + default List selectListByNickname(String nickname) { + return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getNickname, nickname)); + } + + default List selectListByStatus(Integer status) { + return selectList(AdminUserDO::getStatus, status); + } + + default List selectListByDeptIds(Collection deptIds) { + return selectList(AdminUserDO::getDeptId, deptIds); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000..0b27174 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java @@ -0,0 +1,110 @@ +package com.win.module.system.dal.redis; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +/** + * System Redis Key 枚举类 + * + * @author 芋道源码 + */ +public interface RedisKeyConstants { + + /** + * 指定部门的所有子部门编号数组的缓存 + *

+ * KEY 格式:dept_children_ids:{id} + * VALUE 数据类型:String 子部门编号集合 + */ + String DEPT_CHILDREN_ID_LIST = "dept_children_ids"; + + /** + * 角色的缓存 + *

+ * KEY 格式:role:{id} + * VALUE 数据类型:String 角色信息 + */ + String ROLE = "role"; + + /** + * 用户拥有的角色编号的缓存 + *

+ * KEY 格式:user_role_ids:{userId} + * VALUE 数据类型:String 角色编号集合 + */ + String USER_ROLE_ID_LIST = "user_role_ids"; + + /** + * 拥有指定菜单的角色编号的缓存 + *

+ * KEY 格式:user_role_ids:{menuId} + * VALUE 数据类型:String 角色编号集合 + */ + String MENU_ROLE_ID_LIST = "menu_role_ids"; + + /** + * 拥有权限对应的菜单编号数组的缓存 + *

+ * KEY 格式:permission_menu_ids:{permission} + * VALUE 数据类型:String 菜单编号数组 + */ + String PERMISSION_MENU_ID_LIST = "permission_menu_ids"; + + /** + * OAuth2 客户端的缓存 + *

+ * KEY 格式:oauth_client:{id} + * VALUE 数据类型:String 客户端信息 + */ + String OAUTH_CLIENT = "oauth_client"; + + /** + * 访问令牌的缓存 + *

+ * KEY 格式:oauth2_access_token:{token} + * VALUE 数据类型:String 访问令牌信息 {@link OAuth2AccessTokenDO} + *

+ * 由于动态过期时间,使用 RedisTemplate 操作 + */ + String OAUTH2_ACCESS_TOKEN = "oauth2_access_token:%s"; + + /** + * 站内信模版的缓存 + *

+ * KEY 格式:notify_template:{code} + * VALUE 数据格式:String 模版信息 + */ + String NOTIFY_TEMPLATE = "notify_template"; + + /** + * 邮件账号的缓存 + *

+ * KEY 格式:mail_account:{id} + * VALUE 数据格式:String 账号信息 + */ + String MAIL_ACCOUNT = "mail_account"; + + /** + * 邮件模版的缓存 + *

+ * KEY 格式:mail_template:{code} + * VALUE 数据格式:String 模版信息 + */ + String MAIL_TEMPLATE = "mail_template"; + + /** + * 短信模版的缓存 + *

+ * KEY 格式:sms_template:{id} + * VALUE 数据格式:String 模版信息 + */ + String SMS_TEMPLATE = "sms_template"; + + /** + * 小程序订阅模版的缓存 + * + * KEY 格式:wxa_subscribe_template:{userType} + * VALUE 数据格式 String, 模版信息 + */ + String WXA_SUBSCRIBE_TEMPLATE = "wxa_subscribe_template"; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java new file mode 100644 index 0000000..816c532 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java @@ -0,0 +1,59 @@ +package com.win.module.system.dal.redis.oauth2; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.win.module.system.dal.redis.RedisKeyConstants.OAUTH2_ACCESS_TOKEN; + +/** + * {@link OAuth2AccessTokenDO} 的 RedisDAO + * + * @author 芋道源码 + */ +@Repository +public class OAuth2AccessTokenRedisDAO { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + public OAuth2AccessTokenDO get(String accessToken) { + String redisKey = formatKey(accessToken); + return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), OAuth2AccessTokenDO.class); + } + + public void set(OAuth2AccessTokenDO accessTokenDO) { + String redisKey = formatKey(accessTokenDO.getAccessToken()); + // 清理多余字段,避免缓存 + accessTokenDO.setUpdater(null).setUpdateTime(null).setCreateTime(null).setCreator(null).setDeleted(null); + long time = LocalDateTimeUtil.between(LocalDateTime.now(), accessTokenDO.getExpiresTime(), ChronoUnit.SECONDS); + if (time > 0) { + stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(accessTokenDO), time, TimeUnit.SECONDS); + } + } + + public void delete(String accessToken) { + String redisKey = formatKey(accessToken); + stringRedisTemplate.delete(redisKey); + } + + public void deleteList(Collection accessTokens) { + List redisKeys = CollectionUtils.convertList(accessTokens, OAuth2AccessTokenRedisDAO::formatKey); + stringRedisTemplate.delete(redisKeys); + } + + private static String formatKey(String accessToken) { + return String.format(OAUTH2_ACCESS_TOKEN, accessToken); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/config/WinCaptchaConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/config/WinCaptchaConfiguration.java new file mode 100644 index 0000000..69f20f8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/config/WinCaptchaConfiguration.java @@ -0,0 +1,29 @@ +package com.win.module.system.framework.captcha.config; + +import com.win.module.system.framework.captcha.core.RedisCaptchaServiceImpl; +import com.xingyuv.captcha.properties.AjCaptchaProperties; +import com.xingyuv.captcha.service.CaptchaCacheService; +import com.xingyuv.captcha.service.impl.CaptchaServiceFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; + +/** + * 验证码的配置类 + * + * @author 芋道源码 + */ +@Configuration(proxyBeanMethods = false) +public class WinCaptchaConfiguration { + + @Bean + public CaptchaCacheService captchaCacheService(AjCaptchaProperties config, + StringRedisTemplate stringRedisTemplate) { + CaptchaCacheService captchaCacheService = CaptchaServiceFactory.getCache(config.getCacheType().name()); + if (captchaCacheService instanceof RedisCaptchaServiceImpl) { + ((RedisCaptchaServiceImpl) captchaCacheService).setStringRedisTemplate(stringRedisTemplate); + } + return captchaCacheService; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/core/RedisCaptchaServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/core/RedisCaptchaServiceImpl.java new file mode 100644 index 0000000..cb04659 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/core/RedisCaptchaServiceImpl.java @@ -0,0 +1,49 @@ +package com.win.module.system.framework.captcha.core; + +import com.xingyuv.captcha.service.CaptchaCacheService; +import lombok.Setter; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * 基于 Redis 实现验证码的存储 + * + * @author 星语 + */ +@Setter +public class RedisCaptchaServiceImpl implements CaptchaCacheService { + + private StringRedisTemplate stringRedisTemplate; + + @Override + public String type() { + return "redis"; + } + + @Override + public void set(String key, String value, long expiresInSeconds) { + stringRedisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS); + } + + @Override + public boolean exists(String key) { + return Boolean.TRUE.equals(stringRedisTemplate.hasKey(key)); + } + + @Override + public void delete(String key) { + stringRedisTemplate.delete(key); + } + + @Override + public String get(String key) { + return stringRedisTemplate.opsForValue().get(key); + } + + @Override + public Long increment(String key, long val) { + return stringRedisTemplate.opsForValue().increment(key,val); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/package-info.java new file mode 100644 index 0000000..e7d6c61 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/captcha/package-info.java @@ -0,0 +1,8 @@ +/** + * 验证码拓展 + * + * 基于 aj-captcha 实现滑块验证码,文档:https://ajcaptcha.beliefteam.cn/captcha-doc/ + * + * @author 星语 + */ +package com.win.module.system.framework.captcha; \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java new file mode 100644 index 0000000..bdec87b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -0,0 +1,28 @@ +package com.win.module.system.framework.datapermission.config; + +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * system 模块的数据权限 Configuration + * + * @author 芋道源码 + */ +@Configuration(proxyBeanMethods = false) +public class DataPermissionConfiguration { + + @Bean + public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { + return rule -> { + // dept + rule.addDeptColumn(AdminUserDO.class); + rule.addDeptColumn(DeptDO.class, "id"); + // user + rule.addUserColumn(AdminUserDO.class, "id"); + }; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java new file mode 100644 index 0000000..a3670cd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的数据权限配置 + */ +package com.win.module.system.framework.datapermission; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AdminUserParseFunction.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AdminUserParseFunction.java new file mode 100644 index 0000000..11d3c25 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AdminUserParseFunction.java @@ -0,0 +1,51 @@ +package com.win.module.system.framework.operatelog.core; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.user.AdminUserService; +import com.mzt.logapi.service.IParseFunction; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 管理员名字的 {@link IParseFunction} 实现类 + * + * @author HUIHUI + */ +@Slf4j +@Component +public class AdminUserParseFunction implements IParseFunction { + + public static final String NAME = "getAdminUserById"; + + @Resource + private AdminUserService adminUserService; + + @Override + public String functionName() { + return NAME; + } + + @Override + public String apply(Object value) { + if (StrUtil.isEmptyIfStr(value)) { + return ""; + } + + // 获取用户信息 + AdminUserDO user = adminUserService.getUser(Convert.toLong(value)); + if (user == null) { + log.warn("[apply][获取用户{{}}为空", value); + return ""; + } + // 返回格式 芋道源码(13888888888) + String nickname = user.getNickname(); + if (StrUtil.isEmpty(user.getMobile())) { + return nickname; + } + return StrUtil.format("{}({})", nickname, user.getMobile()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AreaParseFunction.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AreaParseFunction.java new file mode 100644 index 0000000..ebbb768 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/AreaParseFunction.java @@ -0,0 +1,39 @@ +package com.win.module.system.framework.operatelog.core; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.ip.core.utils.AreaUtils; +import com.mzt.logapi.service.IParseFunction; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 地名的 {@link IParseFunction} 实现类 + * + * @author HUIHUI + */ +@Slf4j +@Component +public class AreaParseFunction implements IParseFunction { + + public static final String NAME = "getArea"; + + @Override + public boolean executeBefore() { + return true; // 先转换值后对比 + } + + @Override + public String functionName() { + return NAME; + } + + @Override + public String apply(Object value) { + if (StrUtil.isEmptyIfStr(value)) { + return ""; + } + return AreaUtils.format(Convert.toInt(value)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/BooleanParseFunction.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/BooleanParseFunction.java new file mode 100644 index 0000000..30b5fcb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/BooleanParseFunction.java @@ -0,0 +1,39 @@ +package com.win.module.system.framework.operatelog.core; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.dict.core.DictFrameworkUtils; +import com.win.module.infra.enums.DictTypeConstants; +import com.mzt.logapi.service.IParseFunction; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 是否类型的 {@link IParseFunction} 实现类 + * + * @author HUIHUI + */ +@Component +@Slf4j +public class BooleanParseFunction implements IParseFunction { + + public static final String NAME = "getBoolean"; + + @Override + public boolean executeBefore() { + return true; // 先转换值后对比 + } + + @Override + public String functionName() { + return NAME; + } + + @Override + public String apply(Object value) { + if (StrUtil.isEmptyIfStr(value)) { + return ""; + } + return DictFrameworkUtils.getDictDataLabel(DictTypeConstants.BOOLEAN_STRING, value.toString()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/DeptParseFunction.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/DeptParseFunction.java new file mode 100644 index 0000000..9d58845 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/DeptParseFunction.java @@ -0,0 +1,46 @@ +package com.win.module.system.framework.operatelog.core; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.service.dept.DeptService; +import com.mzt.logapi.service.IParseFunction; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 部门名字的 {@link IParseFunction} 实现类 + * + * @author HUIHUI + */ +@Slf4j +@Component +public class DeptParseFunction implements IParseFunction { + + public static final String NAME = "getDeptById"; + + @Resource + private DeptService deptService; + + @Override + public String functionName() { + return NAME; + } + + @Override + public String apply(Object value) { + if (StrUtil.isEmptyIfStr(value)) { + return ""; + } + + // 获取部门信息 + DeptDO dept = deptService.getDept(Convert.toLong(value)); + if (dept == null) { + log.warn("[apply][获取部门{{}}为空", value); + return ""; + } + return dept.getName(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/PostParseFunction.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/PostParseFunction.java new file mode 100644 index 0000000..284fa74 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/PostParseFunction.java @@ -0,0 +1,46 @@ +package com.win.module.system.framework.operatelog.core; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.service.dept.PostService; +import com.mzt.logapi.service.IParseFunction; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 岗位名字的 {@link IParseFunction} 实现类 + * + * @author HUIHUI + */ +@Slf4j +@Component +public class PostParseFunction implements IParseFunction { + + public static final String NAME = "getPostById"; + + @Resource + private PostService postService; + + @Override + public String functionName() { + return NAME; + } + + @Override + public String apply(Object value) { + if (StrUtil.isEmptyIfStr(value)) { + return ""; + } + + // 获取岗位信息 + PostDO post = postService.getPost(Convert.toLong(value)); + if (post == null) { + log.warn("[apply][获取岗位{{}}为空", value); + return ""; + } + return post.getName(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/SexParseFunction.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/SexParseFunction.java new file mode 100644 index 0000000..00babc3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/core/SexParseFunction.java @@ -0,0 +1,39 @@ +package com.win.module.system.framework.operatelog.core; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.dict.core.DictFrameworkUtils; +import com.win.module.system.enums.DictTypeConstants; +import com.mzt.logapi.service.IParseFunction; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 行业的 {@link IParseFunction} 实现类 + * + * @author HUIHUI + */ +@Component +@Slf4j +public class SexParseFunction implements IParseFunction { + + public static final String NAME = "getSex"; + + @Override + public boolean executeBefore() { + return true; // 先转换值后对比 + } + + @Override + public String functionName() { + return NAME; + } + + @Override + public String apply(Object value) { + if (StrUtil.isEmptyIfStr(value)) { + return ""; + } + return DictFrameworkUtils.getDictDataLabel(DictTypeConstants.USER_SEX, value.toString()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/package-info.java new file mode 100644 index 0000000..5c78144 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/operatelog/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位文件,避免文件夹缩进 + */ +package com.win.module.system.framework.operatelog; \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java new file mode 100644 index 0000000..e12eb51 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 system 模块的 framework 封装 + * + * @author 芋道源码 + */ +package com.win.module.system.framework; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsCodeProperties.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsCodeProperties.java new file mode 100644 index 0000000..ea1950f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsCodeProperties.java @@ -0,0 +1,41 @@ +package com.win.module.system.framework.sms.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.constraints.NotNull; +import java.time.Duration; + +@ConfigurationProperties(prefix = "win.sms-code") +@Validated +@Data +public class SmsCodeProperties { + + /** + * 过期时间 + */ + @NotNull(message = "过期时间不能为空") + private Duration expireTimes; + /** + * 短信发送频率 + */ + @NotNull(message = "短信发送频率不能为空") + private Duration sendFrequency; + /** + * 每日发送最大数量 + */ + @NotNull(message = "每日发送最大数量不能为空") + private Integer sendMaximumQuantityPerDay; + /** + * 验证码最小值 + */ + @NotNull(message = "验证码最小值不能为空") + private Integer beginCode; + /** + * 验证码最大值 + */ + @NotNull(message = "验证码最大值不能为空") + private Integer endCode; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsConfiguration.java new file mode 100644 index 0000000..951eb14 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/config/SmsConfiguration.java @@ -0,0 +1,23 @@ +package com.win.module.system.framework.sms.config; + +import com.win.module.system.framework.sms.core.client.SmsClientFactory; +import com.win.module.system.framework.sms.core.client.impl.SmsClientFactoryImpl; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 短信配置类,包括短信客户端、短信验证码两部分 + * + * @author 芋道源码 + */ +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(SmsCodeProperties.class) +public class SmsConfiguration { + + @Bean + public SmsClientFactory smsClientFactory() { + return new SmsClientFactoryImpl(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClient.java new file mode 100644 index 0000000..1c03a12 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClient.java @@ -0,0 +1,56 @@ +package com.win.module.system.framework.sms.core.client; + +import com.win.framework.common.core.KeyValue; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; + +import java.util.List; + +/** + * 短信客户端,用于对接各短信平台的 SDK,实现短信发送等功能 + * + * @author zzf + * @since 2021/1/25 14:14 + */ +public interface SmsClient { + + /** + * 获得渠道编号 + * + * @return 渠道编号 + */ + Long getId(); + + /** + * 发送消息 + * + * @param logId 日志编号 + * @param mobile 手机号 + * @param apiTemplateId 短信 API 的模板编号 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序 + * @return 短信发送结果 + */ + SmsSendRespDTO sendSms(Long logId, String mobile, String apiTemplateId, + List> templateParams) throws Throwable; + + /** + * 解析接收短信的接收结果 + * + * @param text 结果 + * @return 结果内容 + * @throws Throwable 当解析 text 发生异常时,则会抛出异常 + */ + List parseSmsReceiveStatus(String text) throws Throwable; + + /** + * 查询指定的短信模板 + * + * 如果查询失败,则返回 null 空 + * + * @param apiTemplateId 短信 API 的模板编号 + * @return 短信模板 + */ + SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClientFactory.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClientFactory.java new file mode 100644 index 0000000..69a33cb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/SmsClientFactory.java @@ -0,0 +1,37 @@ +package com.win.module.system.framework.sms.core.client; + +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; + +/** + * 短信客户端的工厂接口 + * + * @author zzf + * @since 2021/1/28 14:01 + */ +public interface SmsClientFactory { + + /** + * 获得短信 Client + * + * @param channelId 渠道编号 + * @return 短信 Client + */ + SmsClient getSmsClient(Long channelId); + + /** + * 获得短信 Client + * + * @param channelCode 渠道编码 + * @return 短信 Client + */ + SmsClient getSmsClient(String channelCode); + + /** + * 创建短信 Client + * + * @param properties 配置对象 + * @return 短信 Client + */ + SmsClient createOrUpdateSmsClient(SmsChannelProperties properties); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java new file mode 100644 index 0000000..fe5b3fb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java @@ -0,0 +1,48 @@ +package com.win.module.system.framework.sms.core.client.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 消息接收 Response DTO + * + * @author 芋道源码 + */ +@Data +public class SmsReceiveRespDTO { + + /** + * 是否接收成功 + */ + private Boolean success; + /** + * API 接收结果的编码 + */ + private String errorCode; + /** + * API 接收结果的说明 + */ + private String errorMsg; + + /** + * 手机号 + */ + private String mobile; + /** + * 用户接收时间 + */ + private LocalDateTime receiveTime; + + /** + * 短信 API 发送返回的序号 + */ + private String serialNo; + /** + * 短信日志编号 + * + * 对应 SysSmsLogDO 的编号 + */ + private Long logId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java new file mode 100644 index 0000000..91ead91 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java @@ -0,0 +1,43 @@ +package com.win.module.system.framework.sms.core.client.dto; + +import lombok.Data; + +/** + * 短信发送 Response DTO + * + * @author 芋道源码 + */ +@Data +public class SmsSendRespDTO { + + /** + * 是否成功 + */ + private Boolean success; + + /** + * API 请求编号 + */ + private String apiRequestId; + + // ==================== 成功时字段 ==================== + + /** + * 短信 API 发送返回的序号 + */ + private String serialNo; + + // ==================== 失败时字段 ==================== + + /** + * API 返回错误码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiCode; + /** + * API 返回提示 + */ + private String apiMsg; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java new file mode 100644 index 0000000..b9cd961 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java @@ -0,0 +1,33 @@ +package com.win.module.system.framework.sms.core.client.dto; + +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import lombok.Data; + +/** + * 短信模板 Response DTO + * + * @author 芋道源码 + */ +@Data +public class SmsTemplateRespDTO { + + /** + * 模板编号 + */ + private String id; + /** + * 短信内容 + */ + private String content; + /** + * 审核状态 + * + * 枚举 {@link SmsTemplateAuditStatusEnum} + */ + private Integer auditStatus; + /** + * 审核未通过的理由 + */ + private String auditReason; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AbstractSmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AbstractSmsClient.java new file mode 100644 index 0000000..442f470 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AbstractSmsClient.java @@ -0,0 +1,48 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import com.win.module.system.framework.sms.core.client.SmsClient; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; + +/** + * 短信客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author zzf + * @since 2021/2/1 9:28 + */ +@Slf4j +public abstract class AbstractSmsClient implements SmsClient { + + /** + * 短信渠道配置 + */ + protected volatile SmsChannelProperties properties; + + public AbstractSmsClient(SmsChannelProperties properties) { + this.properties = properties; + } + + /** + * 初始化 + */ + public final void init() { + log.debug("[init][配置({}) 初始化完成]", properties); + } + + public final void refresh(SmsChannelProperties properties) { + // 判断是否更新 + if (properties.equals(this.properties)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", properties); + this.properties = properties; + // 初始化 + this.init(); + } + + @Override + public Long getId() { + return properties.getId(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AliyunSmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AliyunSmsClient.java new file mode 100644 index 0000000..63126ce --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/AliyunSmsClient.java @@ -0,0 +1,193 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import cn.hutool.core.date.format.FastDateFormat; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import com.google.common.annotations.VisibleForTesting; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.stream.Collectors; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 阿里短信客户端的实现类 + * + * @author zzf + * @since 2021/1/25 14:17 + */ +@Slf4j +public class AliyunSmsClient extends AbstractSmsClient { + + private static final String URL = "https://dysmsapi.aliyuncs.com"; + private static final String HOST = "dysmsapi.aliyuncs.com"; + private static final String VERSION = "2017-05-25"; + + private static final String RESPONSE_CODE_SUCCESS = "OK"; + + public AliyunSmsClient(SmsChannelProperties properties) { + super(properties); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + public SmsSendRespDTO sendSms(Long sendLogId, String mobile, String apiTemplateId, + List> templateParams) throws Throwable { + Assert.notBlank(properties.getSignature(), "短信签名不能为空"); + // 1. 执行请求 + // 参考链接 https://api.aliyun.com/document/Dysmsapi/2017-05-25/SendSms + TreeMap queryParam = new TreeMap<>(); + queryParam.put("PhoneNumbers", mobile); + queryParam.put("SignName", properties.getSignature()); + queryParam.put("TemplateCode", apiTemplateId); + queryParam.put("TemplateParam", JsonUtils.toJsonString(MapUtils.convertMap(templateParams))); + queryParam.put("OutId", sendLogId); + JSONObject response = request("SendSms", queryParam); + + // 2. 解析请求 + return new SmsSendRespDTO() + .setSuccess(Objects.equals(response.getStr("Code"), RESPONSE_CODE_SUCCESS)) + .setSerialNo(response.getStr("BizId")) + .setApiRequestId(response.getStr("RequestId")) + .setApiCode(response.getStr("Code")) + .setApiMsg(response.getStr("Message")); + } + + @Override + public List parseSmsReceiveStatus(String text) { + JSONArray statuses = JSONUtil.parseArray(text); + // 字段参考 https://help.aliyun.com/zh/sms/developer-reference/smsreport-2 + return convertList(statuses, status -> { + JSONObject statusObj = (JSONObject) status; + return new SmsReceiveRespDTO() + .setSuccess(statusObj.getBool("success")) // 是否接收成功 + .setErrorCode(statusObj.getStr("err_code")) // 状态报告编码 + .setErrorMsg(statusObj.getStr("err_msg")) // 状态报告说明 + .setMobile(statusObj.getStr("phone_number")) // 手机号 + .setReceiveTime(statusObj.getLocalDateTime("report_time", null)) // 状态报告时间 + .setSerialNo(statusObj.getStr("biz_id")) // 发送序列号 + .setLogId(statusObj.getLong("out_id")); // 用户序列号 + }); + } + + @Override + public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable { + // 1. 执行请求 + // 参考链接 https://api.aliyun.com/document/Dysmsapi/2017-05-25/QuerySmsTemplate + TreeMap queryParam = new TreeMap<>(); + queryParam.put("TemplateCode", apiTemplateId); + JSONObject response = request("QuerySmsTemplate", queryParam); + + // 2.1 请求失败 + String code = response.getStr("Code"); + if (ObjectUtil.notEqual(code, RESPONSE_CODE_SUCCESS)) { + log.error("[getSmsTemplate][模版编号({}) 响应不正确({})]", apiTemplateId, response); + return null; + } + // 2.2 请求成功 + return new SmsTemplateRespDTO() + .setId(response.getStr("TemplateCode")) + .setContent(response.getStr("TemplateContent")) + .setAuditStatus(convertSmsTemplateAuditStatus(response.getInt("TemplateStatus"))) + .setAuditReason(response.getStr("Reason")); + } + + @VisibleForTesting + Integer convertSmsTemplateAuditStatus(Integer templateStatus) { + switch (templateStatus) { + case 0: return SmsTemplateAuditStatusEnum.CHECKING.getStatus(); + case 1: return SmsTemplateAuditStatusEnum.SUCCESS.getStatus(); + case 2: return SmsTemplateAuditStatusEnum.FAIL.getStatus(); + default: throw new IllegalArgumentException(String.format("未知审核状态(%d)", templateStatus)); + } + } + + /** + * 请求阿里云短信 + * + * @see V3 版本请求体&签名机制 + * @param apiName 请求的 API 名称 + * @param queryParams 请求参数 + * @return 请求结果 + */ + private JSONObject request(String apiName, TreeMap queryParams) { + // 1. 请求参数 + String queryString = queryParams.entrySet().stream() + .map(entry -> percentCode(entry.getKey()) + "=" + percentCode(String.valueOf(entry.getValue()))) + .collect(Collectors.joining("&")); + + // 2.1 请求 Header + TreeMap headers = new TreeMap<>(); + headers.put("host", HOST); + headers.put("x-acs-version", VERSION); + headers.put("x-acs-action", apiName); + headers.put("x-acs-date", FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("GMT")).format(new Date())); + headers.put("x-acs-signature-nonce", IdUtil.randomUUID()); + + // 2.2 构建签名 Header + StringBuilder canonicalHeaders = new StringBuilder(); // 构造请求头,多个规范化消息头,按照消息头名称(小写)的字符代码顺序以升序排列后拼接在一起 + StringBuilder signedHeadersBuilder = new StringBuilder(); // 已签名消息头列表,多个请求头名称(小写)按首字母升序排列并以英文分号(;)分隔 + headers.entrySet().stream().filter(entry -> entry.getKey().toLowerCase().startsWith("x-acs-") + || entry.getKey().equalsIgnoreCase("host") + || entry.getKey().equalsIgnoreCase("content-type")) + .sorted(Map.Entry.comparingByKey()).forEach(entry -> { + String lowerKey = entry.getKey().toLowerCase(); + canonicalHeaders.append(lowerKey).append(":").append(String.valueOf(entry.getValue()).trim()).append("\n"); + signedHeadersBuilder.append(lowerKey).append(";"); + }); + String signedHeaders = signedHeadersBuilder.substring(0, signedHeadersBuilder.length() - 1); + + // 3. 请求 Body + String requestBody = ""; // 短信 API 为 RPC 接口,query parameters 在 uri 中拼接,因此 request body 如果没有特殊要求,设置为空。 + String hashedRequestBody = DigestUtil.sha256Hex(requestBody); + + // 4. 构建 Authorization 签名 + String canonicalRequest = "POST" + "\n" + "/" + "\n" + queryString + "\n" + + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestBody; + String hashedCanonicalRequest = DigestUtil.sha256Hex(canonicalRequest); + String stringToSign = "ACS3-HMAC-SHA256" + "\n" + hashedCanonicalRequest; + String signature = SecureUtil.hmacSha256(properties.getApiSecret()).digestHex(stringToSign); // 计算签名 + headers.put("Authorization", "ACS3-HMAC-SHA256" + " " + "Credential=" + properties.getApiKey() + + ", " + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature); + + // 5. 发起请求 + String responseBody = HttpUtils.post(URL + "?" + queryString, headers, requestBody); + return JSONUtil.parseObj(responseBody); + } + + /** + * 对指定的字符串进行 URL 编码,并对特定的字符进行替换,以符合URL编码规范 + * + * @param str 需要进行 URL 编码的字符串 + * @return 编码后的字符串 + */ + @SneakyThrows + private static String percentCode(String str) { + Assert.notNull(str, "str 不能为空"); + return URLEncoder.encode(str, StandardCharsets.UTF_8.name()) + .replace("+", "%20") // 加号 "+" 被替换为 "%20" + .replace("*", "%2A") // 星号 "*" 被替换为 "%2A" + .replace("%7E", "~"); // 波浪号 "%7E" 被替换为 "~" + } + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java new file mode 100644 index 0000000..551d83d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java @@ -0,0 +1,91 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.crypto.digest.HmacAlgorithm; +import cn.hutool.http.HttpUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 基于钉钉 WebHook 实现的调试的短信客户端实现类 + * + * 考虑到省钱,我们使用钉钉 WebHook 模拟发送短信,方便调试。 + * + * @author 芋道源码 + */ +public class DebugDingTalkSmsClient extends AbstractSmsClient { + + public DebugDingTalkSmsClient(SmsChannelProperties properties) { + super(properties); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + public SmsSendRespDTO sendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) throws Throwable { + // 构建请求 + String url = buildUrl("robot/send"); + Map params = new HashMap<>(); + params.put("msgtype", "text"); + String content = String.format("【模拟短信】\n手机号:%s\n短信日志编号:%d\n模板参数:%s", + mobile, sendLogId, MapUtils.convertMap(templateParams)); + params.put("text", MapUtil.builder().put("content", content).build()); + // 执行请求 + String responseText = HttpUtil.post(url, JsonUtils.toJsonString(params)); + // 解析结果 + Map responseObj = JsonUtils.parseObject(responseText, Map.class); + String errorCode = MapUtil.getStr(responseObj, "errcode"); + return new SmsSendRespDTO().setSuccess(Objects.equals(errorCode, "0")).setSerialNo(StrUtil.uuid()) + .setApiCode(errorCode).setApiMsg(MapUtil.getStr(responseObj, "errorMsg")); + } + + /** + * 构建请求地址 + * + * 参见 文档 + * + * @param path 请求路径 + * @return 请求地址 + */ + @SuppressWarnings("SameParameterValue") + private String buildUrl(String path) { + // 生成 timestamp + long timestamp = System.currentTimeMillis(); + // 生成 sign + String secret = properties.getApiSecret(); + String stringToSign = timestamp + "\n" + secret; + byte[] signData = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, StrUtil.bytes(secret)).digest(stringToSign); + String sign = Base64.encode(signData); + // 构建最终 URL + return String.format("https://oapi.dingtalk.com/%s?access_token=%s×tamp=%d&sign=%s", + path, properties.getApiKey(), timestamp, sign); + } + + @Override + public List parseSmsReceiveStatus(String text) { + throw new UnsupportedOperationException("模拟短信客户端,暂时无需解析回调"); + } + + @Override + public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) { + return new SmsTemplateRespDTO().setId(apiTemplateId).setContent("") + .setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(""); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/HuaweiSmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/HuaweiSmsClient.java new file mode 100644 index 0000000..aafbd87 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/HuaweiSmsClient.java @@ -0,0 +1,166 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.format.FastDateFormat; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + +import static cn.hutool.crypto.digest.DigestUtil.sha256Hex; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 华为短信客户端的实现类 + * + * @author scholar + * @since 2024/6/02 11:55 + */ +@Slf4j +public class HuaweiSmsClient extends AbstractSmsClient { + + private static final String URL = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1";//APP接入地址+接口访问URI + private static final String HOST = "smsapi.cn-north-4.myhuaweicloud.com:443"; + private static final String SIGNEDHEADERS = "content-type;host;x-sdk-date"; + + private static final String RESPONSE_CODE_SUCCESS = "000000"; + + public HuaweiSmsClient(SmsChannelProperties properties) { + super(properties); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + validateSender(properties); + } + + /** + * 参数校验华为云的 sender 通道号 + * + * 原因是:验华为云发放短信的时候,需要额外的参数 sender + * + * 解决方案:考虑到不破坏原有的 apiKey + apiSecret 的结构,所以将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。 + * + * @param properties 配置 + */ + private static void validateSender(SmsChannelProperties properties) { + String combineKey = properties.getApiKey(); + Assert.notEmpty(combineKey, "apiKey 不能为空"); + String[] keys = combineKey.trim().split(" "); + Assert.isTrue(keys.length == 2, "华为云短信 apiKey 配置格式错误,请配置 为[accessKeyId sender]"); + } + + private String getAccessKey() { + return StrUtil.subBefore(properties.getApiKey(), " ", true); + } + + private String getSender() { + return StrUtil.subAfter(properties.getApiKey(), " ", true); + } + + @Override + public SmsSendRespDTO sendSms(Long sendLogId, String mobile, String apiTemplateId, + List> templateParams) throws Throwable { + StringBuilder requestBody = new StringBuilder(); + appendToBody(requestBody, "from=", getSender()); + appendToBody(requestBody, "&to=", mobile); + appendToBody(requestBody, "&templateId=", apiTemplateId); + appendToBody(requestBody, "&templateParas=", JsonUtils.toJsonString( + convertList(templateParams, kv -> String.valueOf(kv.getValue())))); + appendToBody(requestBody, "&statusCallback=", properties.getCallbackUrl()); + appendToBody(requestBody, "&extend=", String.valueOf(sendLogId)); + JSONObject response = request("/sms/batchSendSms/v1/", "POST", requestBody.toString()); + + // 2. 解析请求 + if (!response.containsKey("result")) { // 例如说:密钥不正确 + return new SmsSendRespDTO().setSuccess(false) + .setApiCode(response.getStr("code")) + .setApiMsg(response.getStr("description")); + } + JSONObject sendResult = response.getJSONArray("result").getJSONObject(0); + return new SmsSendRespDTO().setSuccess(RESPONSE_CODE_SUCCESS.equals(response.getStr("code"))) + .setSerialNo(sendResult.getStr("smsMsgId")).setApiCode(sendResult.getStr("status")); + } + + /** + * 请求华为云短信 + * + * @see https://support.huaweicloud.com/api-msgsms/sms_05_0046.html + * @param uri 请求 URI + * @param method 请求 Method + * @param requestBody 请求 Body + * @return 请求结果 + */ + private JSONObject request(String uri, String method, String requestBody) { + // 1.1 请求 Header + TreeMap headers = new TreeMap<>(); + headers.put("Content-Type", "application/x-www-form-urlencoded"); + String sdkDate = FastDateFormat.getInstance("yyyyMMdd'T'HHmmss'Z'", TimeZone.getTimeZone("UTC")).format(new Date()); + headers.put("X-Sdk-Date", sdkDate); + headers.put("host", HOST); + + // 1.2 构建签名 Header + String canonicalQueryString = ""; // 查询参数为空 + String canonicalHeaders = "content-type:application/x-www-form-urlencoded\n" + + "host:"+ HOST +"\n" + "x-sdk-date:" + sdkDate + "\n"; + String canonicalRequest = method + "\n" + uri + "\n" + canonicalQueryString + "\n" + + canonicalHeaders + "\n" + SIGNEDHEADERS + "\n" + sha256Hex(requestBody); + String stringToSign = "SDK-HMAC-SHA256" + "\n" + sdkDate + "\n" + sha256Hex(canonicalRequest); + String signature = SecureUtil.hmacSha256(properties.getApiSecret()).digestHex(stringToSign); // 计算签名 + headers.put("Authorization", "SDK-HMAC-SHA256" + " " + "Access=" + getAccessKey() + + ", " + "SignedHeaders=" + SIGNEDHEADERS + ", " + "Signature=" + signature); + + // 2. 发起请求 + String responseBody = HttpUtils.post(URL, headers, requestBody); + return JSONUtil.parseObj(responseBody); + } + + @Override + public List parseSmsReceiveStatus(String requestBody) { + Map params = HttpUtil.decodeParamMap(requestBody, StandardCharsets.UTF_8); + // 字段参考 https://support.huaweicloud.com/api-msgsms/sms_05_0003.html + return ListUtil.of(new SmsReceiveRespDTO() + .setSuccess("DELIVRD".equals(params.get("status"))) // 是否接收成功 + .setErrorCode(params.get("status")) // 状态报告编码 + .setErrorMsg(params.get("statusDesc")) + .setMobile(params.get("to")) // 手机号 + .setReceiveTime(LocalDateTime.ofInstant(Instant.parse(params.get("updateTime")), ZoneId.of("UTC"))) // 状态报告时间 + .setSerialNo(params.get("smsMsgId")) // 发送序列号 + .setLogId(Long.valueOf(params.get("extend")))); // 用户序列号 + } + + @Override + public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable { + // 华为短信模板查询和发送短信,是不同的两套 key 和 secret,与阿里、腾讯的区别较大,这里模板查询校验暂不实现 + String[] strs = apiTemplateId.split(" "); + Assert.isTrue(strs.length == 2, "格式不正确,需要满足:apiTemplateId sender"); + return new SmsTemplateRespDTO().setId(apiTemplateId).setContent(null) + .setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(null); + } + + @SuppressWarnings("CharsetObjectCanBeUsed") + private static void appendToBody(StringBuilder body, String key, String value) throws UnsupportedEncodingException { + if (StrUtil.isNotEmpty(value)) { + body.append(key).append(URLEncoder.encode(value, CharsetUtil.CHARSET_UTF_8.name())); + } + } + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/QiniuSmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/QiniuSmsClient.java new file mode 100644 index 0000000..29cf8ba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/QiniuSmsClient.java @@ -0,0 +1,155 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.digest.HmacAlgorithm; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.http.HttpUtils; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; +import java.util.function.Function; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 七牛云短信客户端的实现类 + * + * @author scholar + * @since 2024/08/26 15:35 + */ +@Slf4j +public class QiniuSmsClient extends AbstractSmsClient { + + private static final String HOST = "sms.qiniuapi.com"; + + public QiniuSmsClient(SmsChannelProperties properties) { + super(properties); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + public SmsSendRespDTO sendSms(Long sendLogId, String mobile, String apiTemplateId, + List> templateParams) throws Throwable { + // 1. 执行请求 + // 参考链接 https://developer.qiniu.com/sms/5824/through-the-api-send-text-messages + LinkedHashMap body = new LinkedHashMap<>(); + body.put("template_id", apiTemplateId); + body.put("mobile", mobile); + body.put("parameters", CollStreamUtil.toMap(templateParams, KeyValue::getKey, KeyValue::getValue)); + body.put("seq", Long.toString(sendLogId)); + JSONObject response = request("POST", body, "/v1/message/single"); + + // 2. 解析请求 + if (ObjectUtil.isNotEmpty(response.getStr("error"))) { + // 短信请求失败 + return new SmsSendRespDTO().setSuccess(false) + .setApiCode(response.getStr("error")) + .setApiRequestId(response.getStr("request_id")) + .setApiMsg(response.getStr("message")); + } + return new SmsSendRespDTO().setSuccess(response.containsKey("message_id")) + .setSerialNo(response.getStr("message_id")); + } + + /** + * 请求七牛云短信 + * + * @see + * @param httpMethod http请求方法 + * @param body http请求消息体 + * @param path URL path + * @return 请求结果 + */ + private JSONObject request(String httpMethod, LinkedHashMap body, String path) { + String signDate = DateUtil.date().setTimeZone(TimeZone.getTimeZone("UTC")).toString("yyyyMMdd'T'HHmmss'Z'"); + // 1. 请求头 + Map header = new HashMap<>(4); + header.put("HOST", HOST); + header.put("Authorization", getSignature(httpMethod, path, body != null ? JSONUtil.toJsonStr(body) : "", signDate)); + header.put("Content-Type", "application/json"); + header.put("X-Qiniu-Date", signDate); + + // 2. 发起请求 + String responseBody; + if (Objects.equals(httpMethod, "POST")){ + responseBody = HttpUtils.post("https://" + HOST + path, header, JSONUtil.toJsonStr(body)); + } else { + responseBody = HttpUtils.get("https://" + HOST + path, header); + } + return JSONUtil.parseObj(responseBody); + } + + private String getSignature(String method, String path, String body, String signDate) { + StringBuilder dataToSign = new StringBuilder(); + dataToSign.append(method.toUpperCase()).append(" ").append(path) + .append("\nHost: ").append(HOST) + .append("\n").append("Content-Type").append(": ").append("application/json") + .append("\n").append("X-Qiniu-Date").append(": ").append(signDate) + .append("\n\n"); + if (ObjectUtil.isNotEmpty(body)) { + dataToSign.append(body); + } + String signature = SecureUtil.hmac(HmacAlgorithm.HmacSHA1, properties.getApiSecret()) + .digestBase64(dataToSign.toString(), true); + return "Qiniu " + properties.getApiKey() + ":" + signature; + } + + @Override + public List parseSmsReceiveStatus(String text) { + JSONObject status = JSONUtil.parseObj(text); + // 字段参考 https://developer.qiniu.com/sms/5910/message-push + return convertList(status.getJSONArray("items"), new Function() { + + @Override + public SmsReceiveRespDTO apply(Object item) { + JSONObject statusObj = (JSONObject) item; + return new SmsReceiveRespDTO() + .setSuccess("DELIVRD".equals(statusObj.getStr("status"))) // 是否接收成功 + .setErrorMsg(statusObj.getStr("status")) // 状态报告编码 + .setMobile(statusObj.getStr("mobile")) // 手机号 + .setReceiveTime(LocalDateTimeUtil.of(statusObj.getLong("delivrd_at") * 1000L)) // 状态报告时间 + .setSerialNo(statusObj.getStr("message_id")) // 发送序列号 + .setLogId(statusObj.getLong("seq")); // 用户序列号 + } + + }); + } + + @Override + public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable { + // 1. 执行请求 + // 参考链接 https://developer.qiniu.com/sms/5969/query-a-single-template + JSONObject response = request("GET", null, "/v1/template/" + apiTemplateId); + + // 2.2 解析请求 + return new SmsTemplateRespDTO() + .setId(response.getStr("id")) + .setContent(response.getStr("template")) + .setAuditStatus(convertSmsTemplateAuditStatus(response.getStr("audit_status"))) + .setAuditReason(response.getStr("reject_reason")); + } + + @VisibleForTesting + Integer convertSmsTemplateAuditStatus(String templateStatus) { + switch (templateStatus) { + case "passed": return SmsTemplateAuditStatusEnum.SUCCESS.getStatus(); + case "reviewing": return SmsTemplateAuditStatusEnum.CHECKING.getStatus(); + case "rejected": return SmsTemplateAuditStatusEnum.FAIL.getStatus(); + default: + throw new IllegalArgumentException(String.format("未知审核状态(%str)", templateStatus)); + } + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java new file mode 100644 index 0000000..e79dc10 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java @@ -0,0 +1,90 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import com.win.module.system.framework.sms.core.client.SmsClient; +import com.win.module.system.framework.sms.core.client.SmsClientFactory; +import com.win.module.system.framework.sms.core.enums.SmsChannelEnum; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; + +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 短信客户端工厂接口 + * + * @author zzf + */ +@Validated +@Slf4j +public class SmsClientFactoryImpl implements SmsClientFactory { + + /** + * 短信客户端 Map + * key:渠道编号,使用 {@link SmsChannelProperties#getId()} + */ + private final ConcurrentMap channelIdClients = new ConcurrentHashMap<>(); + + /** + * 短信客户端 Map + * key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()} + * + * 注意,一些场景下,需要获得某个渠道类型的客户端,所以需要使用它。 + * 例如说,解析短信接收结果,是相对通用的,不需要使用某个渠道编号的 {@link #channelIdClients} + */ + private final ConcurrentMap channelCodeClients = new ConcurrentHashMap<>(); + + public SmsClientFactoryImpl() { + // 初始化 channelCodeClients 集合 + Arrays.stream(SmsChannelEnum.values()).forEach(channel -> { + // 创建一个空的 SmsChannelProperties 对象 + SmsChannelProperties properties = new SmsChannelProperties().setCode(channel.getCode()) + .setApiKey("default default").setApiSecret("default"); + // 创建 Sms 客户端 + AbstractSmsClient smsClient = createSmsClient(properties); + channelCodeClients.put(channel.getCode(), smsClient); + }); + } + + @Override + public SmsClient getSmsClient(Long channelId) { + return channelIdClients.get(channelId); + } + + @Override + public SmsClient getSmsClient(String channelCode) { + return channelCodeClients.get(channelCode); + } + + @Override + public SmsClient createOrUpdateSmsClient(SmsChannelProperties properties) { + AbstractSmsClient client = channelIdClients.get(properties.getId()); + if (client == null) { + client = this.createSmsClient(properties); + client.init(); + channelIdClients.put(client.getId(), client); + } else { + client.refresh(properties); + } + return client; + } + + private AbstractSmsClient createSmsClient(SmsChannelProperties properties) { + SmsChannelEnum channelEnum = SmsChannelEnum.getByCode(properties.getCode()); + Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channelEnum)); + // 创建客户端 + switch (channelEnum) { + case ALIYUN: return new AliyunSmsClient(properties); + case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties); + case TENCENT: return new TencentSmsClient(properties); + case HUAWEI: return new HuaweiSmsClient(properties); + case QINIU: return new QiniuSmsClient(properties); + } + // 创建失败,错误日志 + 抛出异常 + log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties); + throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/TencentSmsClient.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/TencentSmsClient.java new file mode 100644 index 0000000..3654e8c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/client/impl/TencentSmsClient.java @@ -0,0 +1,201 @@ +package com.win.module.system.framework.sms.core.client.impl; + +import cn.hutool.core.date.format.FastDateFormat; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.HexUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.crypto.digest.HmacAlgorithm; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.collection.ArrayUtils; +import com.win.framework.common.util.http.HttpUtils; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import com.google.common.annotations.VisibleForTesting; + +import java.nio.charset.StandardCharsets; +import java.util.*; + +import static cn.hutool.crypto.digest.DigestUtil.sha256Hex; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 腾讯云短信功能实现 + * + * 参见 文档 + * + * @author shiwp + */ +public class TencentSmsClient extends AbstractSmsClient { + + private static final String HOST = "sms.tencentcloudapi.com"; + private static final String VERSION = "2021-01-11"; + private static final String REGION = "ap-guangzhou"; + + /** + * 调用成功 code + */ + public static final String API_CODE_SUCCESS = "Ok"; + + /** + * 是否国际/港澳台短信: + * + * 0:表示国内短信。 + * 1:表示国际/港澳台短信。 + */ + private static final long INTERNATIONAL_CHINA = 0L; + + public TencentSmsClient(SmsChannelProperties properties) { + super(properties); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + validateSdkAppId(properties); + } + + /** + * 参数校验腾讯云的 SDK AppId + * + * 原因是:腾讯云发放短信的时候,需要额外的参数 sdkAppId + * + * 解决方案:考虑到不破坏原有的 apiKey + apiSecret 的结构,所以将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。 + * + * @param properties 配置 + */ + private static void validateSdkAppId(SmsChannelProperties properties) { + String combineKey = properties.getApiKey(); + Assert.notEmpty(combineKey, "apiKey 不能为空"); + String[] keys = combineKey.trim().split(" "); + Assert.isTrue(keys.length == 2, "腾讯云短信 apiKey 配置格式错误,请配置 为[secretId sdkAppId]"); + } + + private String getSdkAppId() { + return StrUtil.subAfter(properties.getApiKey(), " ", true); + } + + private String getApiKey() { + return StrUtil.subBefore(properties.getApiKey(), " ", true); + } + + @Override + public SmsSendRespDTO sendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) throws Throwable { + // 1. 执行请求 + // 参考链接 https://cloud.tencent.com/document/product/382/55981 + TreeMap body = new TreeMap<>(); + body.put("PhoneNumberSet", new String[]{mobile}); + body.put("SmsSdkAppId", getSdkAppId()); + body.put("SignName", properties.getSignature()); + body.put("TemplateId", apiTemplateId); + body.put("TemplateParamSet", ArrayUtils.toArray(templateParams, param -> String.valueOf(param.getValue()))); + JSONObject response = request("SendSms", body); + + // 2. 解析请求 + JSONObject responseResult = response.getJSONObject("Response"); + JSONObject error = responseResult.getJSONObject("Error"); + if (error != null) { + return new SmsSendRespDTO().setSuccess(false) + .setApiRequestId(responseResult.getStr("RequestId")) + .setApiCode(error.getStr("Code")) + .setApiMsg(error.getStr("Message")); + } + JSONObject sendResult = responseResult.getJSONArray("SendStatusSet").getJSONObject(0); + return new SmsSendRespDTO().setSuccess(Objects.equals(API_CODE_SUCCESS, sendResult.getStr("Code"))) + .setApiRequestId(responseResult.getStr("RequestId")) + .setSerialNo(sendResult.getStr("SerialNo")) + .setApiMsg(sendResult.getStr("Message")); + } + + @Override + public List parseSmsReceiveStatus(String text) { + JSONArray statuses = JSONUtil.parseArray(text); + // 字段参考 + return convertList(statuses, status -> { + JSONObject statusObj = (JSONObject) status; + return new SmsReceiveRespDTO() + .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功 + .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码 + .setMobile(statusObj.getStr("mobile")) // 手机号 + .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间 + .setSerialNo(statusObj.getStr("sid")); // 发送序列号 + }); + } + + @Override + public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable { + // 1. 构建请求 + // 参考链接 https://cloud.tencent.com/document/product/382/52067 + TreeMap body = new TreeMap<>(); + body.put("International", INTERNATIONAL_CHINA); + body.put("TemplateIdSet", new Integer[]{Integer.valueOf(apiTemplateId)}); + JSONObject response = request("DescribeSmsTemplateList", body); + + // 2. 解析请求 + JSONObject statusResult = response.getJSONObject("Response") + .getJSONArray("DescribeTemplateStatusSet").getJSONObject(0); + return new SmsTemplateRespDTO().setId(apiTemplateId) + .setContent(statusResult.get("TemplateContent").toString()) + .setAuditStatus(convertSmsTemplateAuditStatus(statusResult.getInt("StatusCode"))) + .setAuditReason(statusResult.get("ReviewReply").toString()); + } + + @VisibleForTesting + Integer convertSmsTemplateAuditStatus(int templateStatus) { + switch (templateStatus) { + case 1: return SmsTemplateAuditStatusEnum.CHECKING.getStatus(); + case 0: return SmsTemplateAuditStatusEnum.SUCCESS.getStatus(); + case -1: return SmsTemplateAuditStatusEnum.FAIL.getStatus(); + default: throw new IllegalArgumentException(String.format("未知审核状态(%d)", templateStatus)); + } + } + + /** + * 请求腾讯云短信 + * + * @see 签名方法 v3 + * + * @param action 请求的 API 名称 + * @param body 请求参数 + * @return 请求结果 + */ + private JSONObject request(String action, TreeMap body) { + // 1.1 请求 Header + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json; charset=utf-8"); + headers.put("Host", HOST); + headers.put("X-TC-Action", action); + Date now = new Date(); + String nowStr = FastDateFormat.getInstance("yyyy-MM-dd", TimeZone.getTimeZone("UTC")).format(now); + headers.put("X-TC-Timestamp", String.valueOf(now.getTime() / 1000)); + headers.put("X-TC-Version", VERSION); + headers.put("X-TC-Region", REGION); + + // 1.2 构建签名 Header + String canonicalQueryString = ""; + String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + + "host:" + HOST + "\n" + "x-tc-action:" + action.toLowerCase() + "\n"; + String signedHeaders = "content-type;host;x-tc-action"; + String canonicalRequest = "POST" + "\n" + "/" + "\n" + canonicalQueryString + "\n" + canonicalHeaders + "\n" + + signedHeaders + "\n" + sha256Hex(JSONUtil.toJsonStr(body)); + String credentialScope = nowStr + "/" + "sms" + "/" + "tc3_request"; + String stringToSign = "TC3-HMAC-SHA256" + "\n" + now.getTime() / 1000 + "\n" + credentialScope + "\n" + + sha256Hex(canonicalRequest); + byte[] secretService = hmac256(hmac256(("TC3" + properties.getApiSecret()).getBytes(StandardCharsets.UTF_8), nowStr), "sms"); + String signature = HexUtil.encodeHexStr(hmac256(hmac256(secretService, "tc3_request"), stringToSign)); + headers.put("Authorization", "TC3-HMAC-SHA256" + " " + "Credential=" + getApiKey() + "/" + credentialScope + ", " + + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature); + + // 2. 发起请求 + String responseBody = HttpUtils.post("https://" + HOST, headers, JSONUtil.toJsonStr(body)); + return JSONUtil.parseObj(responseBody); + } + + private static byte[] hmac256(byte[] key, String msg) { + return DigestUtil.hmac(HmacAlgorithm.HmacSHA256, key).digest(msg); + } + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsChannelEnum.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsChannelEnum.java new file mode 100644 index 0000000..d56ec37 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsChannelEnum.java @@ -0,0 +1,38 @@ +package com.win.module.system.framework.sms.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信渠道枚举 + * + * @author zzf + * @since 2021/1/25 10:56 + */ +@Getter +@AllArgsConstructor +public enum SmsChannelEnum { + + DEBUG_DING_TALK("DEBUG_DING_TALK", "调试(钉钉)"), + ALIYUN("ALIYUN", "阿里云"), + TENCENT("TENCENT", "腾讯云"), + HUAWEI("HUAWEI", "华为云"), + QINIU("QINIU", "七牛云"), + ; + + /** + * 编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static SmsChannelEnum getByCode(String code) { + return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values()); + } + +} + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java new file mode 100644 index 0000000..a3493a0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java @@ -0,0 +1,21 @@ +package com.win.module.system.framework.sms.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信模板的审核状态枚举 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum SmsTemplateAuditStatusEnum { + + CHECKING(1), + SUCCESS(2), + FAIL(3); + + private final Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/property/SmsChannelProperties.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/property/SmsChannelProperties.java new file mode 100644 index 0000000..7eba25e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/core/property/SmsChannelProperties.java @@ -0,0 +1,52 @@ +package com.win.module.system.framework.sms.core.property; + +import com.win.module.system.framework.sms.core.enums.SmsChannelEnum; +import lombok.Data; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * 短信渠道配置类 + * + * @author zzf + * @since 2021/1/25 17:01 + */ +@Data +@Validated +public class SmsChannelProperties { + + /** + * 渠道编号 + */ + @NotNull(message = "短信渠道 ID 不能为空") + private Long id; + /** + * 短信签名 + */ + @NotEmpty(message = "短信签名不能为空") + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + @NotEmpty(message = "渠道编码不能为空") + private String code; + /** + * 短信 API 的账号 + */ + @NotEmpty(message = "短信 API 的账号不能为空") + private String apiKey; + /** + * 短信 API 的密钥 + */ + @NotEmpty(message = "短信 API 的密钥不能为空") + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java new file mode 100644 index 0000000..abdc76b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java @@ -0,0 +1,24 @@ +package com.win.module.system.framework.web.config; + +import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * system 模块的 web 组件的 Configuration + * + * @author 芋道源码 + */ +@Configuration(proxyBeanMethods = false) +public class SystemWebConfiguration { + + /** + * system 模块的 API 分组 + */ + @Bean + public GroupedOpenApi systemGroupedOpenApi() { + return WinSwaggerAutoConfiguration.buildGroupedOpenApi("system"); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java new file mode 100644 index 0000000..dc75f70 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的 web 配置 + */ +package com.win.module.system.framework.web; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java new file mode 100644 index 0000000..999cec6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java @@ -0,0 +1,27 @@ +package com.win.module.system.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.job.TenantJob; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.user.AdminUserMapper; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.List; + +@Component +public class DemoJob implements JobHandler { + + @Resource + private AdminUserMapper adminUserMapper; + + @Override + @TenantJob // 标记多租户 + public String execute(String param) { + System.out.println("当前租户:" + TenantContextHolder.getTenantId()); + List users = adminUserMapper.selectList(); + return "用户数量:" + users.size(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java new file mode 100644 index 0000000..0621269 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java @@ -0,0 +1 @@ +package com.win.module.system.job; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java new file mode 100644 index 0000000..aedd407 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java @@ -0,0 +1,31 @@ +package com.win.module.system.mq.consumer.mail; + +import com.win.module.system.mq.message.mail.MailSendMessage; +import com.win.module.system.service.mail.MailSendService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + +/** + * 针对 {@link MailSendMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class MailSendConsumer { + + @Resource + private MailSendService mailSendService; + + @EventListener + @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步 + public void onMessage(MailSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + mailSendService.doSendMail(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java new file mode 100644 index 0000000..d25c37b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -0,0 +1,31 @@ +package com.win.module.system.mq.consumer.sms; + +import com.win.module.system.mq.message.sms.SmsSendMessage; +import com.win.module.system.service.sms.SmsSendService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + +/** + * 针对 {@link SmsSendMessage} 的消费者 + * + * @author zzf + */ +@Component +@Slf4j +public class SmsSendConsumer { + + @Resource + private SmsSendService smsSendService; + + @EventListener + @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步 + public void onMessage(SmsSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + smsSendService.doSendSms(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java new file mode 100644 index 0000000..daf17cb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java @@ -0,0 +1,47 @@ +package com.win.module.system.mq.message.mail; + +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +/** + * 邮箱发送消息 + * + * @author 芋道源码 + */ +@Data +public class MailSendMessage { + + /** + * 邮件日志编号 + */ + @NotNull(message = "邮件日志编号不能为空") + private Long logId; + /** + * 接收邮件地址 + */ + @NotNull(message = "接收邮件地址不能为空") + private String mail; + /** + * 邮件账号编号 + */ + @NotNull(message = "邮件账号编号不能为空") + private Long accountId; + + /** + * 邮件发件人 + */ + private String nickname; + /** + * 邮件标题 + */ + @NotEmpty(message = "邮件标题不能为空") + private String title; + /** + * 邮件内容 + */ + @NotEmpty(message = "邮件内容不能为空") + private String content; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java new file mode 100644 index 0000000..ca7379c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java @@ -0,0 +1,42 @@ +package com.win.module.system.mq.message.sms; + +import com.win.framework.common.core.KeyValue; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.util.List; + +/** + * 短信发送消息 + * + * @author 芋道源码 + */ +@Data +public class SmsSendMessage { + + /** + * 短信日志编号 + */ + @NotNull(message = "短信日志编号不能为空") + private Long logId; + /** + * 手机号 + */ + @NotNull(message = "手机号不能为空") + private String mobile; + /** + * 短信渠道编号 + */ + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + /** + * 短信 API 的模板编号 + */ + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + /** + * 短信模板参数 + */ + private List> templateParams; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java new file mode 100644 index 0000000..410692c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java @@ -0,0 +1,41 @@ +package com.win.module.system.mq.producer.mail; + +import com.win.module.system.mq.message.mail.MailSendMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + +/** + * Mail 邮件相关消息的 Producer + * + * @author wangjingyi + * @since 2021/4/19 13:33 + */ +@Slf4j +@Component +public class MailProducer { + + @Resource + private ApplicationContext applicationContext; + + /** + * 发送 {@link MailSendMessage} 消息 + * + * @param sendLogId 发送日志编码 + * @param mail 接收邮件地址 + * @param accountId 邮件账号编号 + * @param nickname 邮件发件人 + * @param title 邮件标题 + * @param content 邮件内容 + */ + public void sendMailSendMessage(Long sendLogId, String mail, Long accountId, + String nickname, String title, String content) { + MailSendMessage message = new MailSendMessage() + .setLogId(sendLogId).setMail(mail).setAccountId(accountId) + .setNickname(nickname).setTitle(title).setContent(content); + applicationContext.publishEvent(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java new file mode 100644 index 0000000..5d4ccbd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java @@ -0,0 +1,41 @@ +package com.win.module.system.mq.producer.sms; + +import com.win.framework.common.core.KeyValue; +import com.win.module.system.mq.message.sms.SmsSendMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.List; + +/** + * Sms 短信相关消息的 Producer + * + * @author zzf + * @since 2021/3/9 16:35 + */ +@Slf4j +@Component +public class SmsProducer { + + @Resource + private ApplicationContext applicationContext; + + /** + * 发送 {@link SmsSendMessage} 消息 + * + * @param logId 短信日志编号 + * @param mobile 手机号 + * @param channelId 渠道编号 + * @param apiTemplateId 短信模板编号 + * @param templateParams 短信模板参数 + */ + public void sendSmsSendMessage(Long logId, String mobile, + Long channelId, String apiTemplateId, List> templateParams) { + SmsSendMessage message = new SmsSendMessage().setLogId(logId).setMobile(mobile); + message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); + applicationContext.publishEvent(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/package-info.java new file mode 100644 index 0000000..7789e98 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/package-info.java @@ -0,0 +1,8 @@ +/** + * system 模块下,我们放通用业务,支撑上层的核心业务。 + * 例如说:用户、部门、权限、数据字典等等 + * + * 1. Controller URL:以 /system/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 system_ 开头,方便在数据库中区分 + */ +package com.win.module.system; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java new file mode 100644 index 0000000..0ca1b1b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java @@ -0,0 +1,81 @@ +package com.win.module.system.service.auth; + +import com.win.module.system.controller.admin.auth.vo.*; +import com.win.module.system.dal.dataobject.user.AdminUserDO; + +import jakarta.validation.Valid; + +/** + * 管理后台的认证 Service 接口 + * + * 提供用户的登录、登出的能力 + * + * @author 芋道源码 + */ +public interface AdminAuthService { + + /** + * 验证账号 + 密码。如果通过,则返回用户 + * + * @param username 账号 + * @param password 密码 + * @return 用户 + */ + AdminUserDO authenticate(String username, String password); + + /** + * 账号登录 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO login(@Valid AuthLoginReqVO reqVO); + + /** + * 基于 token 退出登录 + * + * @param token token + * @param logType 登出类型 + */ + void logout(String token, Integer logType); + + /** + * 短信验证码发送 + * + * @param reqVO 发送请求 + */ + void sendSmsCode(AuthSmsSendReqVO reqVO); + + /** + * 短信登录 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) ; + + /** + * 社交快捷登录,使用 code 授权码 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO socialLogin(@Valid AuthSocialLoginReqVO reqVO); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @return 登录结果 + */ + AuthLoginRespVO refreshToken(String refreshToken); + + /** + * 用户注册 + * + * @param createReqVO 注册用户 + * @return 注册结果 + */ + AuthLoginRespVO register(AuthRegisterReqVO createReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java new file mode 100644 index 0000000..7e6f281 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java @@ -0,0 +1,279 @@ +package com.win.module.system.service.auth; + +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.common.util.validation.ValidationUtils; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.api.sms.SmsCodeApi; +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.api.social.dto.SocialUserRespDTO; +import com.win.module.system.controller.admin.auth.vo.*; +import com.win.module.system.convert.auth.AuthConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.enums.logger.LoginResultEnum; +import com.win.module.system.enums.oauth2.OAuth2ClientConstants; +import com.win.module.system.enums.sms.SmsSceneEnum; +import com.win.module.system.service.logger.LoginLogService; +import com.win.module.system.service.member.MemberService; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import com.win.module.system.service.social.SocialUserService; +import com.win.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import com.xingyuv.captcha.model.common.ResponseModel; +import com.xingyuv.captcha.model.vo.CaptchaVO; +import com.xingyuv.captcha.service.CaptchaService; +import jakarta.annotation.Resource; +import jakarta.validation.Validator; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.servlet.ServletUtils.getClientIP; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * Auth Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class AdminAuthServiceImpl implements AdminAuthService { + + @Resource + private AdminUserService userService; + @Resource + private LoginLogService loginLogService; + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private SocialUserService socialUserService; + @Resource + private MemberService memberService; + @Resource + private Validator validator; + @Resource + private CaptchaService captchaService; + @Resource + private SmsCodeApi smsCodeApi; + + /** + * 验证码的开关,默认为 true + */ + @Value("${win.captcha.enable:true}") + private Boolean captchaEnable; + + @Override + public AdminUserDO authenticate(String username, String password) { + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; + // 校验账号是否存在 + AdminUserDO user = userService.getUserByUsername(username); + if (user == null) { + createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + if (!userService.isPasswordMatch(password, user.getPassword())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + // 校验是否禁用 + if (CommonStatusEnum.isDisable(user.getStatus())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED); + throw exception(AUTH_LOGIN_USER_DISABLED); + } + return user; + } + + @Override + public AuthLoginRespVO login(AuthLoginReqVO reqVO) { + // 校验验证码 + validateCaptcha(reqVO); + + // 使用账号密码,进行登录 + AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); + + // 如果 socialType 非空,说明需要绑定社交用户 + if (reqVO.getSocialType() != null) { + socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), + reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); + } + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); + } + + @Override + public void sendSmsCode(AuthSmsSendReqVO reqVO) { + // 登录场景,验证是否存在 + if (userService.getUserByMobile(reqVO.getMobile()) == null) { + throw exception(AUTH_MOBILE_NOT_EXISTS); + } + // 发送验证码 + smsCodeApi.sendSmsCode(AuthConvert.INSTANCE.convert(reqVO).setCreateIp(getClientIP())); + } + + @Override + public AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) { + // 校验验证码 + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP())); + + // 获得用户信息 + AdminUserDO user = userService.getUserByMobile(reqVO.getMobile()); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE); + } + + private void createLoginLog(Long userId, String username, + LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { + // 插入登录日志 + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logTypeEnum.getType()); + reqDTO.setTraceId(TracerUtils.getTraceId()); + reqDTO.setUserId(userId); + reqDTO.setUserType(getUserType().getValue()); + reqDTO.setUsername(username); + reqDTO.setUserAgent(ServletUtils.getUserAgent()); + reqDTO.setUserIp(ServletUtils.getClientIP()); + reqDTO.setResult(loginResult.getResult()); + loginLogService.createLoginLog(reqDTO); + // 更新最后登录时间 + if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { + userService.updateUserLogin(userId, ServletUtils.getClientIP()); + } + } + + @Override + public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) { + // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 + SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(UserTypeEnum.ADMIN.getValue(), reqVO.getType(), + reqVO.getCode(), reqVO.getState()); + if (socialUser == null || socialUser.getUserId() == null) { + throw exception(AUTH_THIRD_LOGIN_NOT_BIND); + } + + // 获得用户 + AdminUserDO user = userService.getUser(socialUser.getUserId()); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL); + } + + @VisibleForTesting + void validateCaptcha(AuthLoginReqVO reqVO) { + // 如果验证码关闭,则不进行校验 + if (!captchaEnable) { + return; + } + // 校验验证码 + ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); + CaptchaVO captchaVO = new CaptchaVO(); + captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); + ResponseModel response = captchaService.verification(captchaVO); + // 验证不通过 + if (!response.isSuccess()) { + // 创建登录失败日志(验证码不正确) + createLoginLog(null, reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_CODE_ERROR); + throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR, response.getRepMsg()); + } + } + + private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { + // 插入登陆日志 + createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); + // 创建访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(), + OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); + // 构建返回结果 + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + + @Override + public AuthLoginRespVO refreshToken(String refreshToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT); + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + + @Override + public void logout(String token, Integer logType) { + // 删除访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(token); + if (accessTokenDO == null) { + return; + } + // 删除成功,则记录登出日志 + createLogoutLog(accessTokenDO.getUserId(), accessTokenDO.getUserType(), logType); + } + + private void createLogoutLog(Long userId, Integer userType, Integer logType) { + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logType); + reqDTO.setTraceId(TracerUtils.getTraceId()); + reqDTO.setUserId(userId); + reqDTO.setUserType(userType); + if (ObjectUtil.equal(getUserType().getValue(), userType)) { + reqDTO.setUsername(getUsername(userId)); + } else { + reqDTO.setUsername(memberService.getMemberUserMobile(userId)); + } + reqDTO.setUserAgent(ServletUtils.getUserAgent()); + reqDTO.setUserIp(ServletUtils.getClientIP()); + reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); + loginLogService.createLoginLog(reqDTO); + } + + private String getUsername(Long userId) { + if (userId == null) { + return null; + } + AdminUserDO user = userService.getUser(userId); + return user != null ? user.getUsername() : null; + } + + private UserTypeEnum getUserType() { + return UserTypeEnum.ADMIN; + } + + @Override + public AuthLoginRespVO register(AuthRegisterReqVO registerReqVO) { + // 1. 校验验证码 + validateCaptcha(registerReqVO); + + // 2. 校验用户名是否已存在 + Long userId = userService.registerUser(registerReqVO); + + // 3. 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(userId, registerReqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); + } + + @VisibleForTesting + void validateCaptcha(AuthRegisterReqVO reqVO) { + // 如果验证码关闭,则不进行校验 + if (!captchaEnable) { + return; + } + // 校验验证码 + ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); + CaptchaVO captchaVO = new CaptchaVO(); + captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); + ResponseModel response = captchaService.verification(captchaVO); + // 验证不通过 + if (!response.isSuccess()) { + throw exception(AUTH_REGISTER_CAPTCHA_CODE_ERROR, response.getRepMsg()); + } + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java new file mode 100644 index 0000000..f702f1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java @@ -0,0 +1,117 @@ +package com.win.module.system.service.dept; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.win.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; + +import java.util.*; + +/** + * 部门 Service 接口 + * + * @author 芋道源码 + */ +public interface DeptService { + + /** + * 创建部门 + * + * @param createReqVO 部门信息 + * @return 部门编号 + */ + Long createDept(DeptSaveReqVO createReqVO); + + /** + * 更新部门 + * + * @param updateReqVO 部门信息 + */ + void updateDept(DeptSaveReqVO updateReqVO); + + /** + * 删除部门 + * + * @param id 部门编号 + */ + void deleteDept(Long id); + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptDO getDept(Long id); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDeptList(Collection ids); + + /** + * 筛选部门列表 + * + * @param reqVO 筛选条件请求 VO + * @return 部门列表 + */ + List getDeptList(DeptListReqVO reqVO); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + List list = getDeptList(ids); + return CollectionUtils.convertMap(list, DeptDO::getId); + } + + /** + * 获得指定部门的所有子部门 + * + * @param id 部门编号 + * @return 子部门列表 + */ + default List getChildDeptList(Long id) { + return getChildDeptList(Collections.singleton(id)); + } + + /** + * 获得指定部门的所有子部门 + * + * @param ids 部门编号数组 + * @return 子部门列表 + */ + List getChildDeptList(Collection ids); + + /** + * 获得指定领导者的部门列表 + * + * @param id 领导者编号 + * @return 部门列表 + */ + List getDeptListByLeaderUserId(Long id); + + /** + * 获得所有子部门,从缓存中 + * + * @param id 父部门编号 + * @return 子部门列表 + */ + Set getChildDeptIdListFromCache(Long id); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validateDeptList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java new file mode 100644 index 0000000..a590be1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java @@ -0,0 +1,223 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.win.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.mysql.dept.DeptMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 部门 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class DeptServiceImpl implements DeptService { + + @Resource + private DeptMapper deptMapper; + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 + public Long createDept(DeptSaveReqVO createReqVO) { + if (createReqVO.getParentId() == null) { + createReqVO.setParentId(DeptDO.PARENT_ID_ROOT); + } + // 校验父部门的有效性 + validateParentDept(null, createReqVO.getParentId()); + // 校验部门名的唯一性 + validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName()); + + // 插入部门 + DeptDO dept = BeanUtils.toBean(createReqVO, DeptDO.class); + deptMapper.insert(dept); + return dept.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 + public void updateDept(DeptSaveReqVO updateReqVO) { + if (updateReqVO.getParentId() == null) { + updateReqVO.setParentId(DeptDO.PARENT_ID_ROOT); + } + // 校验自己存在 + validateDeptExists(updateReqVO.getId()); + // 校验父部门的有效性 + validateParentDept(updateReqVO.getId(), updateReqVO.getParentId()); + // 校验部门名的唯一性 + validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName()); + + // 更新部门 + DeptDO updateObj = BeanUtils.toBean(updateReqVO, DeptDO.class); + deptMapper.updateById(updateObj); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 + public void deleteDept(Long id) { + // 校验是否存在 + validateDeptExists(id); + // 校验是否有子部门 + if (deptMapper.selectCountByParentId(id) > 0) { + throw exception(DEPT_EXITS_CHILDREN); + } + // 删除部门 + deptMapper.deleteById(id); + } + + @VisibleForTesting + void validateDeptExists(Long id) { + if (id == null) { + return; + } + DeptDO dept = deptMapper.selectById(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + } + + @VisibleForTesting + void validateParentDept(Long id, Long parentId) { + if (parentId == null || DeptDO.PARENT_ID_ROOT.equals(parentId)) { + return; + } + // 1. 不能设置自己为父部门 + if (Objects.equals(id, parentId)) { + throw exception(DEPT_PARENT_ERROR); + } + // 2. 父部门不存在 + DeptDO parentDept = deptMapper.selectById(parentId); + if (parentDept == null) { + throw exception(DEPT_PARENT_NOT_EXITS); + } + // 3. 递归校验父部门,如果父部门是自己的子部门,则报错,避免形成环路 + if (id == null) { // id 为空,说明新增,不需要考虑环路 + return; + } + for (int i = 0; i < Short.MAX_VALUE; i++) { + // 3.1 校验环路 + parentId = parentDept.getParentId(); + if (Objects.equals(id, parentId)) { + throw exception(DEPT_PARENT_IS_CHILD); + } + // 3.2 继续递归下一级父部门 + if (parentId == null || DeptDO.PARENT_ID_ROOT.equals(parentId)) { + break; + } + parentDept = deptMapper.selectById(parentId); + if (parentDept == null) { + break; + } + } + } + + @VisibleForTesting + void validateDeptNameUnique(Long id, Long parentId, String name) { + DeptDO dept = deptMapper.selectByParentIdAndName(parentId, name); + if (dept == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的部门 + if (id == null) { + throw exception(DEPT_NAME_DUPLICATE); + } + if (ObjectUtil.notEqual(dept.getId(), id)) { + throw exception(DEPT_NAME_DUPLICATE); + } + } + + @Override + public DeptDO getDept(Long id) { + return deptMapper.selectById(id); + } + + @Override + public List getDeptList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return deptMapper.selectBatchIds(ids); + } + + @Override + public List getDeptList(DeptListReqVO reqVO) { + List list = deptMapper.selectList(reqVO); + list.sort(Comparator.comparing(DeptDO::getSort)); + return list; + } + + @Override + public List getChildDeptList(Collection ids) { + List children = new LinkedList<>(); + // 遍历每一层 + Collection parentIds = ids; + for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环 + // 查询当前层,所有的子部门 + List depts = deptMapper.selectListByParentId(parentIds); + // 1. 如果没有子部门,则结束遍历 + if (CollUtil.isEmpty(depts)) { + break; + } + // 2. 如果有子部门,继续遍历 + children.addAll(depts); + parentIds = convertSet(depts, DeptDO::getId); + } + return children; + } + + @Override + public List getDeptListByLeaderUserId(Long id) { + return deptMapper.selectListByLeaderUserId(id); + } + + @Override + @DataPermission(enable = false) // 禁用数据权限,避免建立不正确的缓存 + @Cacheable(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, key = "#id") + public Set getChildDeptIdListFromCache(Long id) { + List children = getChildDeptList(id); + return convertSet(children, DeptDO::getId); + } + + @Override + public void validateDeptList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得科室信息 + Map deptMap = getDeptMap(ids); + // 校验 + ids.forEach(id -> { + DeptDO dept = deptMap.get(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw exception(DEPT_NOT_ENABLE, dept.getName()); + } + }); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java new file mode 100644 index 0000000..0eca3d7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java @@ -0,0 +1,84 @@ +package com.win.module.system.service.dept; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.win.module.system.controller.admin.dept.vo.post.PostSaveReqVO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +/** + * 岗位 Service 接口 + * + * @author 芋道源码 + */ +public interface PostService { + + /** + * 创建岗位 + * + * @param createReqVO 岗位信息 + * @return 岗位编号 + */ + Long createPost(PostSaveReqVO createReqVO); + + /** + * 更新岗位 + * + * @param updateReqVO 岗位信息 + */ + void updatePost(PostSaveReqVO updateReqVO); + + /** + * 删除岗位信息 + * + * @param id 岗位编号 + */ + void deletePost(Long id); + + /** + * 获得岗位列表 + * + * @param ids 岗位编号数组 + * @return 部门列表 + */ + List getPostList(@Nullable Collection ids); + + /** + * 获得符合条件的岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @param statuses 状态数组。如果为空,不进行筛选 + * @return 部门列表 + */ + List getPostList(@Nullable Collection ids, + @Nullable Collection statuses); + + /** + * 获得岗位分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult getPostPage(PostPageReqVO reqVO); + + /** + * 获得岗位信息 + * + * @param id 岗位编号 + * @return 岗位信息 + */ + PostDO getPost(Long id); + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validatePostList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java new file mode 100644 index 0000000..e8fd3c8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java @@ -0,0 +1,153 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.win.module.system.controller.admin.dept.vo.post.PostSaveReqVO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.mysql.dept.PostMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 岗位 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class PostServiceImpl implements PostService { + + @Resource + private PostMapper postMapper; + + @Override + public Long createPost(PostSaveReqVO createReqVO) { + // 校验正确性 + validatePostForCreateOrUpdate(null, createReqVO.getName(), createReqVO.getCode()); + + // 插入岗位 + PostDO post = BeanUtils.toBean(createReqVO, PostDO.class); + postMapper.insert(post); + return post.getId(); + } + + @Override + public void updatePost(PostSaveReqVO updateReqVO) { + // 校验正确性 + validatePostForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getName(), updateReqVO.getCode()); + + // 更新岗位 + PostDO updateObj = BeanUtils.toBean(updateReqVO, PostDO.class); + postMapper.updateById(updateObj); + } + + @Override + public void deletePost(Long id) { + // 校验是否存在 + validatePostExists(id); + // 删除部门 + postMapper.deleteById(id); + } + + private void validatePostForCreateOrUpdate(Long id, String name, String code) { + // 校验自己存在 + validatePostExists(id); + // 校验岗位名的唯一性 + validatePostNameUnique(id, name); + // 校验岗位编码的唯一性 + validatePostCodeUnique(id, code); + } + + private void validatePostNameUnique(Long id, String name) { + PostDO post = postMapper.selectByName(name); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw exception(POST_NAME_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw exception(POST_NAME_DUPLICATE); + } + } + + private void validatePostCodeUnique(Long id, String code) { + PostDO post = postMapper.selectByCode(code); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw exception(POST_CODE_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw exception(POST_CODE_DUPLICATE); + } + } + + private void validatePostExists(Long id) { + if (id == null) { + return; + } + if (postMapper.selectById(id) == null) { + throw exception(POST_NOT_FOUND); + } + } + + @Override + public List getPostList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return postMapper.selectBatchIds(ids); + } + + @Override + public List getPostList(Collection ids, Collection statuses) { + return postMapper.selectList(ids, statuses); + } + + @Override + public PageResult getPostPage(PostPageReqVO reqVO) { + return postMapper.selectPage(reqVO); + } + + @Override + public PostDO getPost(Long id) { + return postMapper.selectById(id); + } + + @Override + public void validatePostList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List posts = postMapper.selectBatchIds(ids); + Map postMap = convertMap(posts, PostDO::getId); + // 校验 + ids.forEach(id -> { + PostDO post = postMap.get(id); + if (post == null) { + throw exception(POST_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { + throw exception(POST_NOT_ENABLE, post.getName()); + } + }); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java new file mode 100644 index 0000000..1c09b00 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java @@ -0,0 +1,110 @@ +package com.win.module.system.service.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +/** + * 字典数据 Service 接口 + * + * @author ruoyi + */ +public interface DictDataService { + + /** + * 创建字典数据 + * + * @param createReqVO 字典数据信息 + * @return 字典数据编号 + */ + Long createDictData(DictDataSaveReqVO createReqVO); + + /** + * 更新字典数据 + * + * @param updateReqVO 字典数据信息 + */ + void updateDictData(DictDataSaveReqVO updateReqVO); + + /** + * 删除字典数据 + * + * @param id 字典数据编号 + */ + void deleteDictData(Long id); + + /** + * 获得字典数据列表 + * + * @param status 状态 + * @param dictType 字典类型 + * @return 字典数据全列表 + */ + List getDictDataList(@Nullable Integer status, @Nullable String dictType); + + /** + * 获得字典数据分页列表 + * + * @param pageReqVO 分页请求 + * @return 字典数据分页列表 + */ + PageResult getDictDataPage(DictDataPageReqVO pageReqVO); + + /** + * 获得字典数据详情 + * + * @param id 字典数据编号 + * @return 字典数据 + */ + DictDataDO getDictData(Long id); + + /** + * 获得指定字典类型的数据数量 + * + * @param dictType 字典类型 + * @return 数据数量 + */ + long getDictDataCountByDictType(String dictType); + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validateDictDataList(String dictType, Collection values); + + /** + * 获得指定的字典数据 + * + * @param dictType 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + DictDataDO getDictData(String dictType, String value); + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param dictType 字典类型 + * @param label 字典数据标签 + * @return 字典数据 + */ + DictDataDO parseDictData(String dictType, String label); + + /** + * 获得指定数据类型的字典数据列表 + * + * @param dictType 字典类型 + * @return 字典数据列表 + */ + List getDictDataListByDictType(String dictType); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java new file mode 100644 index 0000000..ed94741 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java @@ -0,0 +1,179 @@ +package com.win.module.system.service.dict; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.dal.mysql.dict.DictDataMapper; +import com.google.common.annotations.VisibleForTesting; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 字典数据 Service 实现类 + * + * @author ruoyi + */ +@Service +@Slf4j +public class DictDataServiceImpl implements DictDataService { + + /** + * 排序 dictType > sort + */ + private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator + .comparing(DictDataDO::getDictType) + .thenComparingInt(DictDataDO::getSort); + + @Resource + private DictTypeService dictTypeService; + + @Resource + private DictDataMapper dictDataMapper; + + @Override + public List getDictDataList(Integer status, String dictType) { + List list = dictDataMapper.selectListByStatusAndDictType(status, dictType); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public PageResult getDictDataPage(DictDataPageReqVO pageReqVO) { + return dictDataMapper.selectPage(pageReqVO); + } + + @Override + public DictDataDO getDictData(Long id) { + return dictDataMapper.selectById(id); + } + + @Override + public Long createDictData(DictDataSaveReqVO createReqVO) { + // 校验字典类型有效 + validateDictTypeExists(createReqVO.getDictType()); + // 校验字典数据的值的唯一性 + validateDictDataValueUnique(null, createReqVO.getDictType(), createReqVO.getValue()); + + // 插入字典类型 + DictDataDO dictData = BeanUtils.toBean(createReqVO, DictDataDO.class); + dictDataMapper.insert(dictData); + return dictData.getId(); + } + + @Override + public void updateDictData(DictDataSaveReqVO updateReqVO) { + // 校验自己存在 + validateDictDataExists(updateReqVO.getId()); + // 校验字典类型有效 + validateDictTypeExists(updateReqVO.getDictType()); + // 校验字典数据的值的唯一性 + validateDictDataValueUnique(updateReqVO.getId(), updateReqVO.getDictType(), updateReqVO.getValue()); + + // 更新字典类型 + DictDataDO updateObj = BeanUtils.toBean(updateReqVO, DictDataDO.class); + dictDataMapper.updateById(updateObj); + } + + @Override + public void deleteDictData(Long id) { + // 校验是否存在 + validateDictDataExists(id); + + // 删除字典数据 + dictDataMapper.deleteById(id); + } + + @Override + public long getDictDataCountByDictType(String dictType) { + return dictDataMapper.selectCountByDictType(dictType); + } + + @VisibleForTesting + public void validateDictDataValueUnique(Long id, String dictType, String value) { + DictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); + if (dictData == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典数据 + if (id == null) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + if (!dictData.getId().equals(id)) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + } + + @VisibleForTesting + public void validateDictDataExists(Long id) { + if (id == null) { + return; + } + DictDataDO dictData = dictDataMapper.selectById(id); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + } + + @VisibleForTesting + public void validateDictTypeExists(String type) { + DictTypeDO dictType = dictTypeService.getDictType(type); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictType.getStatus())) { + throw exception(DICT_TYPE_NOT_ENABLE); + } + } + + @Override + public void validateDictDataList(String dictType, Collection values) { + if (CollUtil.isEmpty(values)) { + return; + } + Map dictDataMap = CollectionUtils.convertMap( + dictDataMapper.selectByDictTypeAndValues(dictType, values), DictDataDO::getValue); + // 校验 + values.forEach(value -> { + DictDataDO dictData = dictDataMap.get(value); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { + throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); + } + }); + } + + @Override + public DictDataDO getDictData(String dictType, String value) { + return dictDataMapper.selectByDictTypeAndValue(dictType, value); + } + + @Override + public DictDataDO parseDictData(String dictType, String label) { + return dictDataMapper.selectByDictTypeAndLabel(dictType, label); + } + + @Override + public List getDictDataListByDictType(String dictType) { + List list = dictDataMapper.selectList(DictDataDO::getDictType, dictType); + list.sort(Comparator.comparing(DictDataDO::getSort)); + return list; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java new file mode 100644 index 0000000..a35a046 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java @@ -0,0 +1,70 @@ +package com.win.module.system.service.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; + +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author 芋道源码 + */ +public interface DictTypeService { + + /** + * 创建字典类型 + * + * @param createReqVO 字典类型信息 + * @return 字典类型编号 + */ + Long createDictType(DictTypeSaveReqVO createReqVO); + + /** + * 更新字典类型 + * + * @param updateReqVO 字典类型信息 + */ + void updateDictType(DictTypeSaveReqVO updateReqVO); + + /** + * 删除字典类型 + * + * @param id 字典类型编号 + */ + void deleteDictType(Long id); + + /** + * 获得字典类型分页列表 + * + * @param pageReqVO 分页请求 + * @return 字典类型分页列表 + */ + PageResult getDictTypePage(DictTypePageReqVO pageReqVO); + + /** + * 获得字典类型详情 + * + * @param id 字典类型编号 + * @return 字典类型 + */ + DictTypeDO getDictType(Long id); + + /** + * 获得字典类型详情 + * + * @param type 字典类型 + * @return 字典类型详情 + */ + DictTypeDO getDictType(String type); + + /** + * 获得全部字典类型列表 + * + * @return 字典类型列表 + */ + List getDictTypeList(); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java new file mode 100644 index 0000000..047c266 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java @@ -0,0 +1,140 @@ +package com.win.module.system.service.dict; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.date.LocalDateTimeUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.dal.mysql.dict.DictTypeMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 字典类型 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class DictTypeServiceImpl implements DictTypeService { + + @Resource + private DictDataService dictDataService; + + @Resource + private DictTypeMapper dictTypeMapper; + + @Override + public PageResult getDictTypePage(DictTypePageReqVO pageReqVO) { + return dictTypeMapper.selectPage(pageReqVO); + } + + @Override + public DictTypeDO getDictType(Long id) { + return dictTypeMapper.selectById(id); + } + + @Override + public DictTypeDO getDictType(String type) { + return dictTypeMapper.selectByType(type); + } + + @Override + public Long createDictType(DictTypeSaveReqVO createReqVO) { + // 校验字典类型的名字的唯一性 + validateDictTypeNameUnique(null, createReqVO.getName()); + // 校验字典类型的类型的唯一性 + validateDictTypeUnique(null, createReqVO.getType()); + + // 插入字典类型 + DictTypeDO dictType = BeanUtils.toBean(createReqVO, DictTypeDO.class); + dictType.setDeletedTime(LocalDateTimeUtils.EMPTY); // 唯一索引,避免 null 值 + dictTypeMapper.insert(dictType); + return dictType.getId(); + } + + @Override + public void updateDictType(DictTypeSaveReqVO updateReqVO) { + // 校验自己存在 + validateDictTypeExists(updateReqVO.getId()); + // 校验字典类型的名字的唯一性 + validateDictTypeNameUnique(updateReqVO.getId(), updateReqVO.getName()); + // 校验字典类型的类型的唯一性 + validateDictTypeUnique(updateReqVO.getId(), updateReqVO.getType()); + + // 更新字典类型 + DictTypeDO updateObj = BeanUtils.toBean(updateReqVO, DictTypeDO.class); + dictTypeMapper.updateById(updateObj); + } + + @Override + public void deleteDictType(Long id) { + // 校验是否存在 + DictTypeDO dictType = validateDictTypeExists(id); + // 校验是否有字典数据 + if (dictDataService.getDictDataCountByDictType(dictType.getType()) > 0) { + throw exception(DICT_TYPE_HAS_CHILDREN); + } + // 删除字典类型 + dictTypeMapper.updateToDelete(id, LocalDateTime.now()); + } + + @Override + public List getDictTypeList() { + return dictTypeMapper.selectList(); + } + + @VisibleForTesting + void validateDictTypeNameUnique(Long id, String name) { + DictTypeDO dictType = dictTypeMapper.selectByName(name); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + } + + @VisibleForTesting + void validateDictTypeUnique(Long id, String type) { + if (StrUtil.isEmpty(type)) { + return; + } + DictTypeDO dictType = dictTypeMapper.selectByType(type); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + } + + @VisibleForTesting + DictTypeDO validateDictTypeExists(Long id) { + if (id == null) { + return null; + } + DictTypeDO dictType = dictTypeMapper.selectById(id); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + return dictType; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java new file mode 100644 index 0000000..78e66c7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java @@ -0,0 +1,30 @@ +package com.win.module.system.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; + +import jakarta.validation.Valid; + +/** + * 登录日志 Service 接口 + */ +public interface LoginLogService { + + /** + * 获得登录日志分页 + * + * @param pageReqVO 分页条件 + * @return 登录日志分页 + */ + PageResult getLoginLogPage(LoginLogPageReqVO pageReqVO); + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java new file mode 100644 index 0000000..f9bec2a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java @@ -0,0 +1,35 @@ +package com.win.module.system.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.module.system.dal.mysql.logger.LoginLogMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; + +/** + * 登录日志 Service 实现 + */ +@Service +@Validated +public class LoginLogServiceImpl implements LoginLogService { + + @Resource + private LoginLogMapper loginLogMapper; + + @Override + public PageResult getLoginLogPage(LoginLogPageReqVO pageReqVO) { + return loginLogMapper.selectPage(pageReqVO); + } + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + LoginLogDO loginLog = BeanUtils.toBean(reqDTO, LoginLogDO.class); + loginLogMapper.insert(loginLog); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java new file mode 100644 index 0000000..5006a47 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java @@ -0,0 +1,39 @@ +package com.win.module.system.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.api.logger.dto.OperateLogPageReqDTO; +import com.win.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; + +/** + * 操作日志 Service 接口 + * + * @author 芋道源码 + */ +public interface OperateLogService { + + /** + * 记录操作日志 + * + * @param createReqDTO 创建请求 + */ + void createOperateLog(OperateLogCreateReqDTO createReqDTO); + + /** + * 获得操作日志分页列表 + * + * @param pageReqVO 分页条件 + * @return 操作日志分页列表 + */ + PageResult getOperateLogPage(OperateLogPageReqVO pageReqVO); + + /** + * 获得操作日志分页列表 + * + * @param pageReqVO 分页条件 + * @return 操作日志分页列表 + */ + PageResult getOperateLogPage(OperateLogPageReqDTO pageReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java new file mode 100644 index 0000000..0a4f68d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java @@ -0,0 +1,44 @@ +package com.win.module.system.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.api.logger.dto.OperateLogPageReqDTO; +import com.win.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import com.win.module.system.dal.mysql.logger.OperateLogMapper; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 操作日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class OperateLogServiceImpl implements OperateLogService { + + @Resource + private OperateLogMapper operateLogMapper; + + @Override + public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { + OperateLogDO log = BeanUtils.toBean(createReqDTO, OperateLogDO.class); + operateLogMapper.insert(log); + } + + @Override + public PageResult getOperateLogPage(OperateLogPageReqVO pageReqVO) { + return operateLogMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getOperateLogPage(OperateLogPageReqDTO pageReqDTO) { + return operateLogMapper.selectPage(pageReqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java new file mode 100644 index 0000000..32e9205 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java @@ -0,0 +1,72 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 邮箱账号 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailAccountService { + + /** + * 创建邮箱账号 + * + * @param createReqVO 邮箱账号信息 + * @return 编号 + */ + Long createMailAccount(@Valid MailAccountSaveReqVO createReqVO); + + /** + * 修改邮箱账号 + * + * @param updateReqVO 邮箱账号信息 + */ + void updateMailAccount(@Valid MailAccountSaveReqVO updateReqVO); + + /** + * 删除邮箱账号 + * + * @param id 编号 + */ + void deleteMailAccount(Long id); + + /** + * 获取邮箱账号信息 + * + * @param id 编号 + * @return 邮箱账号信息 + */ + MailAccountDO getMailAccount(Long id); + + /** + * 从缓存中获取邮箱账号 + * + * @param id 编号 + * @return 邮箱账号 + */ + MailAccountDO getMailAccountFromCache(Long id); + + /** + * 获取邮箱账号分页信息 + * + * @param pageReqVO 邮箱账号分页参数 + * @return 邮箱账号分页信息 + */ + PageResult getMailAccountPage(MailAccountPageReqVO pageReqVO); + + /** + * 获取邮箱数组信息 + * + * @return 邮箱账号信息数组 + */ + List getMailAccountList(); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java new file mode 100644 index 0000000..f4f6e29 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java @@ -0,0 +1,99 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.mysql.mail.MailAccountMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_NOT_EXISTS; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS; + +/** + * 邮箱账号 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +@Slf4j +public class MailAccountServiceImpl implements MailAccountService { + + @Resource + private MailAccountMapper mailAccountMapper; + + @Resource + private MailTemplateService mailTemplateService; + + @Override + public Long createMailAccount(MailAccountSaveReqVO createReqVO) { + MailAccountDO account = BeanUtils.toBean(createReqVO, MailAccountDO.class); + mailAccountMapper.insert(account); + return account.getId(); + } + + @Override + @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#updateReqVO.id") + public void updateMailAccount(MailAccountSaveReqVO updateReqVO) { + // 校验是否存在 + validateMailAccountExists(updateReqVO.getId()); + + // 更新 + MailAccountDO updateObj = BeanUtils.toBean(updateReqVO, MailAccountDO.class); + mailAccountMapper.updateById(updateObj); + } + + @Override + @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#id") + public void deleteMailAccount(Long id) { + // 校验是否存在账号 + validateMailAccountExists(id); + // 校验是否存在关联模版 + if (mailTemplateService.getMailTemplateCountByAccountId(id) > 0) { + throw exception(MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS); + } + + // 删除 + mailAccountMapper.deleteById(id); + } + + private void validateMailAccountExists(Long id) { + if (mailAccountMapper.selectById(id) == null) { + throw exception(MAIL_ACCOUNT_NOT_EXISTS); + } + } + + @Override + public MailAccountDO getMailAccount(Long id) { + return mailAccountMapper.selectById(id); + } + + @Override + @Cacheable(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#id", unless = "#result == null") + public MailAccountDO getMailAccountFromCache(Long id) { + return getMailAccount(id); + } + + @Override + public PageResult getMailAccountPage(MailAccountPageReqVO pageReqVO) { + return mailAccountMapper.selectPage(pageReqVO); + } + + @Override + public List getMailAccountList() { + return mailAccountMapper.selectList(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java new file mode 100644 index 0000000..52f3bb1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java @@ -0,0 +1,61 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; + +import java.util.Map; + +/** + * 邮件日志 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailLogService { + + /** + * 邮件日志分页 + * + * @param pageVO 分页参数 + * @return 分页结果 + */ + PageResult getMailLogPage(MailLogPageReqVO pageVO); + + /** + * 获得指定编号的邮件日志 + * + * @param id 日志编号 + * @return 邮件日志 + */ + MailLogDO getMailLog(Long id); + + /** + * 创建邮件日志 + * + * @param userId 用户编码 + * @param userType 用户类型 + * @param toMail 收件人邮件 + * @param account 邮件账号信息 + * @param template 模版信息 + * @param templateContent 模版内容 + * @param templateParams 模版参数 + * @param isSend 是否发送成功 + * @return 日志编号 + */ + Long createMailLog(Long userId, Integer userType, String toMail, + MailAccountDO account, MailTemplateDO template , + String templateContent, Map templateParams, Boolean isSend); + + /** + * 更新邮件发送结果 + * + * @param logId 日志编号 + * @param messageId 发送后的消息编号 + * @param exception 发送异常 + */ + void updateMailSendResult(Long logId, String messageId, Exception exception); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java new file mode 100644 index 0000000..1571297 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java @@ -0,0 +1,78 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.mysql.mail.MailLogMapper; +import com.win.module.system.enums.mail.MailSendStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.Objects; + +import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; + +/** + * 邮件日志 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +public class MailLogServiceImpl implements MailLogService { + + @Resource + private MailLogMapper mailLogMapper; + + @Override + public PageResult getMailLogPage(MailLogPageReqVO pageVO) { + return mailLogMapper.selectPage(pageVO); + } + + @Override + public MailLogDO getMailLog(Long id) { + return mailLogMapper.selectById(id); + } + + @Override + public Long createMailLog(Long userId, Integer userType, String toMail, + MailAccountDO account, MailTemplateDO template, + String templateContent, Map templateParams, Boolean isSend) { + MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); + // 根据是否要发送,设置状态 + logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() + : MailSendStatusEnum.IGNORE.getStatus()) + // 用户信息 + .userId(userId).userType(userType).toMail(toMail) + .accountId(account.getId()).fromMail(account.getMail()) + // 模板相关字段 + .templateId(template.getId()).templateCode(template.getCode()).templateNickname(template.getNickname()) + .templateTitle(template.getTitle()).templateContent(templateContent).templateParams(templateParams); + + // 插入数据库 + MailLogDO logDO = logDOBuilder.build(); + mailLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateMailSendResult(Long logId, String messageId, Exception exception) { + // 1. 成功 + if (exception == null) { + mailLogMapper.updateById(new MailLogDO().setId(logId).setSendTime(LocalDateTime.now()) + .setSendStatus(MailSendStatusEnum.SUCCESS.getStatus()).setSendMessageId(messageId)); + return; + } + // 2. 失败 + mailLogMapper.updateById(new MailLogDO().setId(logId).setSendTime(LocalDateTime.now()) + .setSendStatus(MailSendStatusEnum.FAILURE.getStatus()).setSendException(getRootCauseMessage(exception))); + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java new file mode 100644 index 0000000..f71eead --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java @@ -0,0 +1,60 @@ +package com.win.module.system.service.mail; + +import com.win.module.system.mq.message.mail.MailSendMessage; + +import java.util.Map; + +/** + * 邮件发送 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailSendService { + + /** + * 发送单条邮件给管理后台的用户 + * + * @param mail 邮箱 + * @param userId 用户编码 + * @param templateCode 邮件模版编码 + * @param templateParams 邮件模版参数 + * @return 发送日志编号 + */ + Long sendSingleMailToAdmin(String mail, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条邮件给用户 APP 的用户 + * + * @param mail 邮箱 + * @param userId 用户编码 + * @param templateCode 邮件模版编码 + * @param templateParams 邮件模版参数 + * @return 发送日志编号 + */ + Long sendSingleMailToMember(String mail, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条邮件给用户 + * + * @param mail 邮箱 + * @param userId 用户编码 + * @param userType 用户类型 + * @param templateCode 邮件模版编码 + * @param templateParams 邮件模版参数 + * @return 发送日志编号 + */ + Long sendSingleMail(String mail, Long userId, Integer userType, + String templateCode, Map templateParams); + + /** + * 执行真正的邮件发送 + * 注意,该方法仅仅提供给 MQ Consumer 使用 + * + * @param message 邮件 + */ + void doSendMail(MailSendMessage message); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java new file mode 100644 index 0000000..adefca0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java @@ -0,0 +1,173 @@ +package com.win.module.system.service.mail; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.mq.message.mail.MailSendMessage; +import com.win.module.system.mq.producer.mail.MailProducer; +import com.win.module.system.service.member.MemberService; +import com.win.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.extra.mail.*; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 邮箱发送 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +@Slf4j +public class MailSendServiceImpl implements MailSendService { + + @Resource + private AdminUserService adminUserService; + @Resource + private MemberService memberService; + + @Resource + private MailAccountService mailAccountService; + @Resource + private MailTemplateService mailTemplateService; + + @Resource + private MailLogService mailLogService; + @Resource + private MailProducer mailProducer; + + @Override + public Long sendSingleMailToAdmin(String mail, Long userId, + String templateCode, Map templateParams) { + // 如果 mail 为空,则加载用户编号对应的邮箱 + if (StrUtil.isEmpty(mail)) { + AdminUserDO user = adminUserService.getUser(userId); + if (user != null) { + mail = user.getEmail(); + } + } + // 执行发送 + return sendSingleMail(mail, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleMailToMember(String mail, Long userId, + String templateCode, Map templateParams) { + // 如果 mail 为空,则加载用户编号对应的邮箱 + if (StrUtil.isEmpty(mail)) { + mail = memberService.getMemberUserEmail(userId); + } + // 执行发送 + return sendSingleMail(mail, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleMail(String mail, Long userId, Integer userType, + String templateCode, Map templateParams) { + // 校验邮箱模版是否合法 + MailTemplateDO template = validateMailTemplate(templateCode); + // 校验邮箱账号是否合法 + MailAccountDO account = validateMailAccount(template.getAccountId()); + + // 校验邮箱是否存在 + mail = validateMail(mail); + validateTemplateParams(template, templateParams); + + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); + String title = mailTemplateService.formatMailTemplateContent(template.getTitle(), templateParams); + String content = mailTemplateService.formatMailTemplateContent(template.getContent(), templateParams); + Long sendLogId = mailLogService.createMailLog(userId, userType, mail, + account, template, content, templateParams, isSend); + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + mailProducer.sendMailSendMessage(sendLogId, mail, account.getId(), + template.getNickname(), title, content); + } + return sendLogId; + } + + @Override + public void doSendMail(MailSendMessage message) { + // 1. 创建发送账号 + MailAccountDO account = validateMailAccount(message.getAccountId()); + MailAccount mailAccount = buildMailAccount(account, message.getNickname()); + // 2. 发送邮件 + try { + String messageId = MailUtil.send(mailAccount, message.getMail(), + message.getTitle(), message.getContent(), true); + // 3. 更新结果(成功) + mailLogService.updateMailSendResult(message.getLogId(), messageId, null); + } catch (Exception e) { + // 3. 更新结果(异常) + mailLogService.updateMailSendResult(message.getLogId(), null, e); + } + } + + private MailAccount buildMailAccount(MailAccountDO account, String nickname) { + String from = StrUtil.isNotEmpty(nickname) ? nickname + " <" + account.getMail() + ">" : account.getMail(); + return new MailAccount().setFrom(from).setAuth(true) + .setUser(account.getUsername()).setPass(account.getPassword().toCharArray()) + .setHost(account.getHost()).setPort(account.getPort()) + .setSslEnable(account.getSslEnable()).setStarttlsEnable(account.getStarttlsEnable()); + } + + @VisibleForTesting + MailTemplateDO validateMailTemplate(String templateCode) { + // 获得邮件模板。考虑到效率,从缓存中获取 + MailTemplateDO template = mailTemplateService.getMailTemplateByCodeFromCache(templateCode); + // 邮件模板不存在 + if (template == null) { + throw exception(MAIL_TEMPLATE_NOT_EXISTS); + } + return template; + } + + @VisibleForTesting + MailAccountDO validateMailAccount(Long accountId) { + // 获得邮箱账号。考虑到效率,从缓存中获取 + MailAccountDO account = mailAccountService.getMailAccountFromCache(accountId); + // 邮箱账号不存在 + if (account == null) { + throw exception(MAIL_ACCOUNT_NOT_EXISTS); + } + return account; + } + + @VisibleForTesting + String validateMail(String mail) { + if (StrUtil.isEmpty(mail)) { + throw exception(MAIL_SEND_MAIL_NOT_EXISTS); + } + return mail; + } + + /** + * 校验邮件参数是否确实 + * + * @param template 邮箱模板 + * @param templateParams 参数列表 + */ + @VisibleForTesting + void validateTemplateParams(MailTemplateDO template, Map templateParams) { + template.getParams().forEach(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(MAIL_SEND_TEMPLATE_PARAM_MISS, key); + } + }); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java new file mode 100644 index 0000000..29f32c1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java @@ -0,0 +1,90 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; +import com.win.module.system.controller.admin.mail.vo.template.MailTemplateSaveReqVO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; + +import jakarta.validation.Valid; +import java.util.List; +import java.util.Map; + +/** + * 邮件模版 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailTemplateService { + + /** + * 邮件模版创建 + * + * @param createReqVO 邮件信息 + * @return 编号 + */ + Long createMailTemplate(@Valid MailTemplateSaveReqVO createReqVO); + + /** + * 邮件模版修改 + * + * @param updateReqVO 邮件信息 + */ + void updateMailTemplate(@Valid MailTemplateSaveReqVO updateReqVO); + + /** + * 邮件模版删除 + * + * @param id 编号 + */ + void deleteMailTemplate(Long id); + + /** + * 获取邮件模版 + * + * @param id 编号 + * @return 邮件模版 + */ + MailTemplateDO getMailTemplate(Long id); + + /** + * 获取邮件模版分页 + * + * @param pageReqVO 模版信息 + * @return 邮件模版分页信息 + */ + PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO); + + /** + * 获取邮件模板数组 + * + * @return 模版数组 + */ + List getMailTemplateList(); + + /** + * 从缓存中获取邮件模版 + * + * @param code 模板编码 + * @return 邮件模板 + */ + MailTemplateDO getMailTemplateByCodeFromCache(String code); + + /** + * 邮件模版内容合成 + * + * @param content 邮件模版 + * @param params 合成参数 + * @return 格式化后的内容 + */ + String formatMailTemplateContent(String content, Map params); + + /** + * 获得指定邮件账号下的邮件模板数量 + * + * @param accountId 账号编号 + * @return 数量 + */ + long getMailTemplateCountByAccountId(Long accountId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java new file mode 100644 index 0000000..da07873 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java @@ -0,0 +1,138 @@ +package com.win.module.system.service.mail; + +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; +import com.win.module.system.controller.admin.mail.vo.template.MailTemplateSaveReqVO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.mysql.mail.MailTemplateMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_CODE_EXISTS; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS; + +/** + * 邮箱模版 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +@Slf4j +public class MailTemplateServiceImpl implements MailTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private MailTemplateMapper mailTemplateMapper; + + @Override + public Long createMailTemplate(MailTemplateSaveReqVO createReqVO) { + // 校验 code 是否唯一 + validateCodeUnique(null, createReqVO.getCode()); + + // 插入 + MailTemplateDO template = BeanUtils.toBean(createReqVO, MailTemplateDO.class) + .setParams(parseTemplateContentParams(createReqVO.getContent())); + mailTemplateMapper.insert(template); + return template.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.MAIL_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 + public void updateMailTemplate(@Valid MailTemplateSaveReqVO updateReqVO) { + // 校验是否存在 + validateMailTemplateExists(updateReqVO.getId()); + // 校验 code 是否唯一 + validateCodeUnique(updateReqVO.getId(),updateReqVO.getCode()); + + // 更新 + MailTemplateDO updateObj = BeanUtils.toBean(updateReqVO, MailTemplateDO.class) + .setParams(parseTemplateContentParams(updateReqVO.getContent())); + mailTemplateMapper.updateById(updateObj); + } + + @VisibleForTesting + void validateCodeUnique(Long id, String code) { + MailTemplateDO template = mailTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 存在 template 记录的情况下 + if (id == null // 新增时,说明重复 + || ObjUtil.notEqual(id, template.getId())) { // 更新时,如果 id 不一致,说明重复 + throw exception(MAIL_TEMPLATE_CODE_EXISTS); + } + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.MAIL_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 + public void deleteMailTemplate(Long id) { + // 校验是否存在 + validateMailTemplateExists(id); + + // 删除 + mailTemplateMapper.deleteById(id); + } + + private void validateMailTemplateExists(Long id) { + if (mailTemplateMapper.selectById(id) == null) { + throw exception(MAIL_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public MailTemplateDO getMailTemplate(Long id) {return mailTemplateMapper.selectById(id);} + + @Override + @Cacheable(value = RedisKeyConstants.MAIL_TEMPLATE, key = "#code", unless = "#result == null") + public MailTemplateDO getMailTemplateByCodeFromCache(String code) { + return mailTemplateMapper.selectByCode(code); + } + + @Override + public PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO) { + return mailTemplateMapper.selectPage(pageReqVO); + } + + @Override + public List getMailTemplateList() {return mailTemplateMapper.selectList();} + + @Override + public String formatMailTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + + @VisibleForTesting + public List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + + @Override + public long getMailTemplateCountByAccountId(Long accountId) { + return mailTemplateMapper.selectCountByAccountId(accountId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberService.java new file mode 100644 index 0000000..ada6810 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberService.java @@ -0,0 +1,26 @@ +package com.win.module.system.service.member; + +/** + * Member Service 接口 + * + * @author 芋道源码 + */ +public interface MemberService { + + /** + * 获得会员用户的手机号码 + * + * @param id 会员用户编号 + * @return 手机号码 + */ + String getMemberUserMobile(Long id); + + /** + * 获得会员用户的邮箱 + * + * @param id 会员用户编号 + * @return 邮箱 + */ + String getMemberUserEmail(Long id); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberServiceImpl.java new file mode 100644 index 0000000..9ee84de --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/MemberServiceImpl.java @@ -0,0 +1,54 @@ +package com.win.module.system.service.member; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * Member Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class MemberServiceImpl implements MemberService { + + @Value("${win.info.base-package}") + private String basePackage; + + private volatile Object memberUserApi; + + @Override + public String getMemberUserMobile(Long id) { + Object user = getMemberUser(id); + if (user == null) { + return null; + } + return ReflectUtil.invoke(user, "getMobile"); + } + + @Override + public String getMemberUserEmail(Long id) { + Object user = getMemberUser(id); + if (user == null) { + return null; + } + return ReflectUtil.invoke(user, "getEmail"); + } + + private Object getMemberUser(Long id) { + if (id == null) { + return null; + } + return ReflectUtil.invoke(getMemberUserApi(), "getUser", id); + } + + private Object getMemberUserApi() { + if (memberUserApi == null) { + memberUserApi = SpringUtil.getBean(ClassUtil.loadClass(String.format("%s.module.member.api.user.MemberUserApi", basePackage))); + } + return memberUserApi; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/package-info.java new file mode 100644 index 0000000..20cbab3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/member/package-info.java @@ -0,0 +1,4 @@ +/** + * win-module-member 模块的适配,解除 win-module-system 对它们的依赖 + */ +package com.win.module.system.service.member; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java new file mode 100644 index 0000000..c5f686f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java @@ -0,0 +1,51 @@ +package com.win.module.system.service.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.win.module.system.controller.admin.notice.vo.NoticeSaveReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; + +/** + * 通知公告 Service 接口 + */ +public interface NoticeService { + + /** + * 创建通知公告 + * + * @param createReqVO 通知公告 + * @return 编号 + */ + Long createNotice(NoticeSaveReqVO createReqVO); + + /** + * 更新通知公告 + * + * @param reqVO 通知公告 + */ + void updateNotice(NoticeSaveReqVO reqVO); + + /** + * 删除通知公告 + * + * @param id 编号 + */ + void deleteNotice(Long id); + + /** + * 获得通知公告分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult getNoticePage(NoticePageReqVO reqVO); + + /** + * 获得通知公告 + * + * @param id 编号 + * @return 通知公告 + */ + NoticeDO getNotice(Long id); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java new file mode 100644 index 0000000..df96fbf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java @@ -0,0 +1,73 @@ +package com.win.module.system.service.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.win.module.system.controller.admin.notice.vo.NoticeSaveReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; +import com.win.module.system.dal.mysql.notice.NoticeMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; + +/** + * 通知公告 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class NoticeServiceImpl implements NoticeService { + + @Resource + private NoticeMapper noticeMapper; + + @Override + public Long createNotice(NoticeSaveReqVO createReqVO) { + NoticeDO notice = BeanUtils.toBean(createReqVO, NoticeDO.class); + noticeMapper.insert(notice); + return notice.getId(); + } + + @Override + public void updateNotice(NoticeSaveReqVO updateReqVO) { + // 校验是否存在 + validateNoticeExists(updateReqVO.getId()); + // 更新通知公告 + NoticeDO updateObj = BeanUtils.toBean(updateReqVO, NoticeDO.class); + noticeMapper.updateById(updateObj); + } + + @Override + public void deleteNotice(Long id) { + // 校验是否存在 + validateNoticeExists(id); + // 删除通知公告 + noticeMapper.deleteById(id); + } + + @Override + public PageResult getNoticePage(NoticePageReqVO reqVO) { + return noticeMapper.selectPage(reqVO); + } + + @Override + public NoticeDO getNotice(Long id) { + return noticeMapper.selectById(id); + } + + @VisibleForTesting + public void validateNoticeExists(Long id) { + if (id == null) { + return; + } + NoticeDO notice = noticeMapper.selectById(id); + if (notice == null) { + throw exception(NOTICE_NOT_FOUND); + } + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java new file mode 100644 index 0000000..dfabde9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java @@ -0,0 +1,97 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 站内信 Service 接口 + * + * @author xrcoder + */ +public interface NotifyMessageService { + + /** + * 创建站内信 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param template 模版信息 + * @param templateContent 模版内容 + * @param templateParams 模版参数 + * @return 站内信编号 + */ + Long createNotifyMessage(Long userId, Integer userType, + NotifyTemplateDO template, String templateContent, Map templateParams); + + /** + * 获得站内信分页 + * + * @param pageReqVO 分页查询 + * @return 站内信分页 + */ + PageResult getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO); + + /** + * 获得【我的】站内信分页 + * + * @param pageReqVO 分页查询 + * @param userId 用户编号 + * @param userType 用户类型 + * @return 站内信分页 + */ + PageResult getMyMyNotifyMessagePage(NotifyMessageMyPageReqVO pageReqVO, Long userId, Integer userType); + + /** + * 获得站内信 + * + * @param id 编号 + * @return 站内信 + */ + NotifyMessageDO getNotifyMessage(Long id); + + /** + * 获得【我的】未读站内信列表 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param size 数量 + * @return 站内信列表 + */ + List getUnreadNotifyMessageList(Long userId, Integer userType, Integer size); + + /** + * 统计用户未读站内信条数 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @return 返回未读站内信条数 + */ + Long getUnreadNotifyMessageCount(Long userId, Integer userType); + + /** + * 标记站内信为已读 + * + * @param ids 站内信编号集合 + * @param userId 用户编号 + * @param userType 用户类型 + * @return 更新到的条数 + */ + int updateNotifyMessageRead(Collection ids, Long userId, Integer userType); + + /** + * 标记所有站内信为已读 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @return 更新到的条数 + */ + int updateAllNotifyMessageRead(Long userId, Integer userType); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java new file mode 100644 index 0000000..2ed8ada --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java @@ -0,0 +1,75 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.win.module.system.dal.mysql.notify.NotifyMessageMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 站内信 Service 实现类 + * + * @author xrcoder + */ +@Service +@Validated +public class NotifyMessageServiceImpl implements NotifyMessageService { + + @Resource + private NotifyMessageMapper notifyMessageMapper; + + @Override + public Long createNotifyMessage(Long userId, Integer userType, + NotifyTemplateDO template, String templateContent, Map templateParams) { + NotifyMessageDO message = new NotifyMessageDO().setUserId(userId).setUserType(userType) + .setTemplateId(template.getId()).setTemplateCode(template.getCode()) + .setTemplateType(template.getType()).setTemplateNickname(template.getNickname()) + .setTemplateContent(templateContent).setTemplateParams(templateParams).setReadStatus(false); + notifyMessageMapper.insert(message); + return message.getId(); + } + + @Override + public PageResult getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO) { + return notifyMessageMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getMyMyNotifyMessagePage(NotifyMessageMyPageReqVO pageReqVO, Long userId, Integer userType) { + return notifyMessageMapper.selectPage(pageReqVO, userId, userType); + } + + @Override + public NotifyMessageDO getNotifyMessage(Long id) { + return notifyMessageMapper.selectById(id); + } + + @Override + public List getUnreadNotifyMessageList(Long userId, Integer userType, Integer size) { + return notifyMessageMapper.selectUnreadListByUserIdAndUserType(userId, userType, size); + } + + @Override + public Long getUnreadNotifyMessageCount(Long userId, Integer userType) { + return notifyMessageMapper.selectUnreadCountByUserIdAndUserType(userId, userType); + } + + @Override + public int updateNotifyMessageRead(Collection ids, Long userId, Integer userType) { + return notifyMessageMapper.updateListRead(ids, userId, userType); + } + + @Override + public int updateAllNotifyMessageRead(Long userId, Integer userType) { + return notifyMessageMapper.updateListRead(userId, userType); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java new file mode 100644 index 0000000..05e082a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java @@ -0,0 +1,55 @@ +package com.win.module.system.service.notify; + +import java.util.List; +import java.util.Map; + +/** + * 站内信发送 Service 接口 + * + * @author xrcoder + */ +public interface NotifySendService { + + /** + * 发送单条站内信给管理后台的用户 + * + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 + * + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleNotifyToAdmin(Long userId, + String templateCode, Map templateParams); + /** + * 发送单条站内信给用户 APP 的用户 + * + * 在 mobile 为空时,使用 userId 加载对应会员的手机号 + * + * @param userId 用户编号 + * @param templateCode 站内信模板编号 + * @param templateParams 站内信模板参数 + * @return 发送日志编号 + */ + Long sendSingleNotifyToMember(Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条站内信给用户 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param templateCode 站内信模板编号 + * @param templateParams 站内信模板参数 + * @return 发送日志编号 + */ + Long sendSingleNotify( Long userId, Integer userType, + String templateCode, Map templateParams); + + default void sendBatchNotify(List mobiles, List userIds, Integer userType, + String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java new file mode 100644 index 0000000..86bcc71 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java @@ -0,0 +1,86 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.Map; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 站内信发送 Service 实现类 + * + * @author xrcoder + */ +@Service +@Validated +@Slf4j +public class NotifySendServiceImpl implements NotifySendService { + + @Resource + private NotifyTemplateService notifyTemplateService; + + @Resource + private NotifyMessageService notifyMessageService; + + @Override + public Long sendSingleNotifyToAdmin(Long userId, String templateCode, Map templateParams) { + return sendSingleNotify(userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleNotifyToMember(Long userId, String templateCode, Map templateParams) { + return sendSingleNotify(userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleNotify(Long userId, Integer userType, String templateCode, Map templateParams) { + // 校验模版 + NotifyTemplateDO template = validateNotifyTemplate(templateCode); + if (Objects.equals(template.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { + log.info("[sendSingleNotify][模版({})已经关闭,无法给用户({}/{})发送]", templateCode, userId, userType); + return null; + } + // 校验参数 + validateTemplateParams(template, templateParams); + + // 发送站内信 + String content = notifyTemplateService.formatNotifyTemplateContent(template.getContent(), templateParams); + return notifyMessageService.createNotifyMessage(userId, userType, template, content, templateParams); + } + + @VisibleForTesting + public NotifyTemplateDO validateNotifyTemplate(String templateCode) { + // 获得站内信模板。考虑到效率,从缓存中获取 + NotifyTemplateDO template = notifyTemplateService.getNotifyTemplateByCodeFromCache(templateCode); + // 站内信模板不存在 + if (template == null) { + throw exception(NOTICE_NOT_FOUND); + } + return template; + } + + /** + * 校验站内信模版参数是否确实 + * + * @param template 邮箱模板 + * @param templateParams 参数列表 + */ + @VisibleForTesting + public void validateTemplateParams(NotifyTemplateDO template, Map templateParams) { + template.getParams().forEach(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(NOTIFY_SEND_TEMPLATE_PARAM_MISS, key); + } + }); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java new file mode 100644 index 0000000..51d6cfe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java @@ -0,0 +1,73 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.notify.vo.template.NotifyTemplatePageReqVO; +import com.win.module.system.controller.admin.notify.vo.template.NotifyTemplateSaveReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; + +import jakarta.validation.Valid; +import java.util.Map; + +/** + * 站内信模版 Service 接口 + * + * @author xrcoder + */ +public interface NotifyTemplateService { + + /** + * 创建站内信模版 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createNotifyTemplate(@Valid NotifyTemplateSaveReqVO createReqVO); + + /** + * 更新站内信模版 + * + * @param updateReqVO 更新信息 + */ + void updateNotifyTemplate(@Valid NotifyTemplateSaveReqVO updateReqVO); + + /** + * 删除站内信模版 + * + * @param id 编号 + */ + void deleteNotifyTemplate(Long id); + + /** + * 获得站内信模版 + * + * @param id 编号 + * @return 站内信模版 + */ + NotifyTemplateDO getNotifyTemplate(Long id); + + /** + * 获得站内信模板,从缓存中 + * + * @param code 模板编码 + * @return 站内信模板 + */ + NotifyTemplateDO getNotifyTemplateByCodeFromCache(String code); + + /** + * 获得站内信模版分页 + * + * @param pageReqVO 分页查询 + * @return 站内信模版分页 + */ + PageResult getNotifyTemplatePage(NotifyTemplatePageReqVO pageReqVO); + + /** + * 格式化站内信内容 + * + * @param content 站内信模板的内容 + * @param params 站内信内容的参数 + * @return 格式化后的内容 + */ + String formatNotifyTemplateContent(String content, Map params); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java new file mode 100644 index 0000000..f823f5d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java @@ -0,0 +1,138 @@ +package com.win.module.system.service.notify; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.notify.vo.template.NotifyTemplatePageReqVO; +import com.win.module.system.controller.admin.notify.vo.template.NotifyTemplateSaveReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.win.module.system.dal.mysql.notify.NotifyTemplateMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.NOTIFY_TEMPLATE_CODE_DUPLICATE; +import static com.win.module.system.enums.ErrorCodeConstants.NOTIFY_TEMPLATE_NOT_EXISTS; + +/** + * 站内信模版 Service 实现类 + * + * @author xrcoder + */ +@Service +@Validated +@Slf4j +public class NotifyTemplateServiceImpl implements NotifyTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private NotifyTemplateMapper notifyTemplateMapper; + + @Override + public Long createNotifyTemplate(NotifyTemplateSaveReqVO createReqVO) { + // 校验站内信编码是否重复 + validateNotifyTemplateCodeDuplicate(null, createReqVO.getCode()); + + // 插入 + NotifyTemplateDO notifyTemplate = BeanUtils.toBean(createReqVO, NotifyTemplateDO.class); + notifyTemplate.setParams(parseTemplateContentParams(notifyTemplate.getContent())); + notifyTemplateMapper.insert(notifyTemplate); + return notifyTemplate.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 + public void updateNotifyTemplate(NotifyTemplateSaveReqVO updateReqVO) { + // 校验存在 + validateNotifyTemplateExists(updateReqVO.getId()); + // 校验站内信编码是否重复 + validateNotifyTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); + + // 更新 + NotifyTemplateDO updateObj = BeanUtils.toBean(updateReqVO, NotifyTemplateDO.class); + updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); + notifyTemplateMapper.updateById(updateObj); + } + + @VisibleForTesting + public List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 + public void deleteNotifyTemplate(Long id) { + // 校验存在 + validateNotifyTemplateExists(id); + // 删除 + notifyTemplateMapper.deleteById(id); + } + + private void validateNotifyTemplateExists(Long id) { + if (notifyTemplateMapper.selectById(id) == null) { + throw exception(NOTIFY_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public NotifyTemplateDO getNotifyTemplate(Long id) { + return notifyTemplateMapper.selectById(id); + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, key = "#code", + unless = "#result == null") + public NotifyTemplateDO getNotifyTemplateByCodeFromCache(String code) { + return notifyTemplateMapper.selectByCode(code); + } + + @Override + public PageResult getNotifyTemplatePage(NotifyTemplatePageReqVO pageReqVO) { + return notifyTemplateMapper.selectPage(pageReqVO); + } + + @VisibleForTesting + void validateNotifyTemplateCodeDuplicate(Long id, String code) { + NotifyTemplateDO template = notifyTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(NOTIFY_TEMPLATE_CODE_DUPLICATE, code); + } + if (!template.getId().equals(id)) { + throw exception(NOTIFY_TEMPLATE_CODE_DUPLICATE, code); + } + } + + /** + * 格式化站内信内容 + * + * @param content 站内信模板的内容 + * @param params 站内信内容的参数 + * @return 格式化后的内容 + */ + @Override + public String formatNotifyTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java new file mode 100644 index 0000000..cc97df6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java @@ -0,0 +1,52 @@ +package com.win.module.system.service.oauth2; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * OAuth2 批准 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 ApprovalStoreUserApprovalHandler 的功能,记录用户针对指定客户端的授权,减少手动确定。 + * + * @author 芋道源码 + */ +public interface OAuth2ApproveService { + + /** + * 获得指定用户,针对指定客户端的指定授权,是否通过 + * + * 参考 ApprovalStoreUserApprovalHandler 的 checkForPreApproval 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param requestedScopes 授权范围 + * @return 是否授权通过 + */ + boolean checkForPreApproval(Long userId, Integer userType, String clientId, Collection requestedScopes); + + /** + * 在用户发起批准时,基于 scopes 的选项,计算最终是否通过 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param requestedScopes 授权范围 + * @return 是否授权通过 + */ + boolean updateAfterApproval(Long userId, Integer userType, String clientId, Map requestedScopes); + + /** + * 获得用户的批准列表,排除已过期的 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @return 是否授权通过 + */ + List getApproveList(Long userId, Integer userType, String clientId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java new file mode 100644 index 0000000..f5d81a9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java @@ -0,0 +1,103 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import com.win.framework.common.util.date.DateUtils; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2ApproveMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * OAuth2 批准 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class OAuth2ApproveServiceImpl implements OAuth2ApproveService { + + /** + * 批准的过期时间,默认 30 天 + */ + private static final Integer TIMEOUT = 30 * 24 * 60 * 60; // 单位:秒 + + @Resource + private OAuth2ClientService oauth2ClientService; + + @Resource + private OAuth2ApproveMapper oauth2ApproveMapper; + + @Override + @Transactional + public boolean checkForPreApproval(Long userId, Integer userType, String clientId, Collection requestedScopes) { + // 第一步,基于 Client 的自动授权计算,如果 scopes 都在自动授权中,则返回 true 通过 + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + Assert.notNull(clientDO, "客户端不能为空"); // 防御性编程 + if (CollUtil.containsAll(clientDO.getAutoApproveScopes(), requestedScopes)) { + // gh-877 - if all scopes are auto approved, approvals still need to be added to the approval store. + LocalDateTime expireTime = LocalDateTime.now().plusSeconds(TIMEOUT); + for (String scope : requestedScopes) { + saveApprove(userId, userType, clientId, scope, true, expireTime); + } + return true; + } + + // 第二步,算上用户已经批准的授权。如果 scopes 都包含,则返回 true + List approveDOs = getApproveList(userId, userType, clientId); + Set scopes = convertSet(approveDOs, OAuth2ApproveDO::getScope, + OAuth2ApproveDO::getApproved); // 只保留未过期的 + 同意的 + return CollUtil.containsAll(scopes, requestedScopes); + } + + @Override + @Transactional + public boolean updateAfterApproval(Long userId, Integer userType, String clientId, Map requestedScopes) { + // 如果 requestedScopes 为空,说明没有要求,则返回 true 通过 + if (CollUtil.isEmpty(requestedScopes)) { + return true; + } + + // 更新批准的信息 + boolean success = false; // 需要至少有一个同意 + LocalDateTime expireTime = LocalDateTime.now().plusSeconds(TIMEOUT); + for (Map.Entry entry : requestedScopes.entrySet()) { + if (entry.getValue()) { + success = true; + } + saveApprove(userId, userType, clientId, entry.getKey(), entry.getValue(), expireTime); + } + return success; + } + + @Override + public List getApproveList(Long userId, Integer userType, String clientId) { + List approveDOs = oauth2ApproveMapper.selectListByUserIdAndUserTypeAndClientId( + userId, userType, clientId); + approveDOs.removeIf(o -> DateUtils.isExpired(o.getExpiresTime())); + return approveDOs; + } + + @VisibleForTesting + void saveApprove(Long userId, Integer userType, String clientId, + String scope, Boolean approved, LocalDateTime expireTime) { + // 先更新 + OAuth2ApproveDO approveDO = new OAuth2ApproveDO().setUserId(userId).setUserType(userType) + .setClientId(clientId).setScope(scope).setApproved(approved).setExpiresTime(expireTime); + if (oauth2ApproveMapper.update(approveDO) == 1) { + return; + } + // 失败,则说明不存在,进行更新 + oauth2ApproveMapper.insert(approveDO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java new file mode 100644 index 0000000..109831b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java @@ -0,0 +1,90 @@ +package com.win.module.system.service.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientSaveReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; + +import jakarta.validation.Valid; +import java.util.Collection; + +/** + * OAuth2.0 Client Service 接口 + * + * 从功能上,和 JdbcClientDetailsService 的功能,提供客户端的操作 + * + * @author 芋道源码 + */ +public interface OAuth2ClientService { + + /** + * 创建 OAuth2 客户端 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOAuth2Client(@Valid OAuth2ClientSaveReqVO createReqVO); + + /** + * 更新 OAuth2 客户端 + * + * @param updateReqVO 更新信息 + */ + void updateOAuth2Client(@Valid OAuth2ClientSaveReqVO updateReqVO); + + /** + * 删除 OAuth2 客户端 + * + * @param id 编号 + */ + void deleteOAuth2Client(Long id); + + /** + * 获得 OAuth2 客户端 + * + * @param id 编号 + * @return OAuth2 客户端 + */ + OAuth2ClientDO getOAuth2Client(Long id); + + /** + * 获得 OAuth2 客户端,从缓存中 + * + * @param clientId 客户端编号 + * @return OAuth2 客户端 + */ + OAuth2ClientDO getOAuth2ClientFromCache(String clientId); + + /** + * 获得 OAuth2 客户端分页 + * + * @param pageReqVO 分页查询 + * @return OAuth2 客户端分页 + */ + PageResult getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO); + + /** + * 从缓存中,校验客户端是否合法 + * + * @return 客户端 + */ + default OAuth2ClientDO validOAuthClientFromCache(String clientId) { + return validOAuthClientFromCache(clientId, null, null, null, null); + } + + /** + * 从缓存中,校验客户端是否合法 + * + * 非空时,进行校验 + * + * @param clientId 客户端编号 + * @param clientSecret 客户端密钥 + * @param authorizedGrantType 授权方式 + * @param scopes 授权范围 + * @param redirectUri 重定向地址 + * @return 客户端 + */ + OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, String authorizedGrantType, + Collection scopes, String redirectUri); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java new file mode 100644 index 0000000..3a3b1cb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java @@ -0,0 +1,153 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.common.util.string.StrUtils; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.controller.admin.oauth2.vo.client.OAuth2ClientSaveReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2ClientMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.Collection; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * OAuth2.0 Client Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class OAuth2ClientServiceImpl implements OAuth2ClientService { + + @Resource + private OAuth2ClientMapper oauth2ClientMapper; + + @Override + public Long createOAuth2Client(OAuth2ClientSaveReqVO createReqVO) { + validateClientIdExists(null, createReqVO.getClientId()); + // 插入 + OAuth2ClientDO client = BeanUtils.toBean(createReqVO, OAuth2ClientDO.class); + oauth2ClientMapper.insert(client); + return client.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 clientId 字段,不好清理 + public void updateOAuth2Client(OAuth2ClientSaveReqVO updateReqVO) { + // 校验存在 + validateOAuth2ClientExists(updateReqVO.getId()); + // 校验 Client 未被占用 + validateClientIdExists(updateReqVO.getId(), updateReqVO.getClientId()); + + // 更新 + OAuth2ClientDO updateObj = BeanUtils.toBean(updateReqVO, OAuth2ClientDO.class); + oauth2ClientMapper.updateById(updateObj); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 key,不好清理 + public void deleteOAuth2Client(Long id) { + // 校验存在 + validateOAuth2ClientExists(id); + // 删除 + oauth2ClientMapper.deleteById(id); + } + + private void validateOAuth2ClientExists(Long id) { + if (oauth2ClientMapper.selectById(id) == null) { + throw exception(OAUTH2_CLIENT_NOT_EXISTS); + } + } + + @VisibleForTesting + void validateClientIdExists(Long id, String clientId) { + OAuth2ClientDO client = oauth2ClientMapper.selectByClientId(clientId); + if (client == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的客户端 + if (id == null) { + throw exception(OAUTH2_CLIENT_EXISTS); + } + if (!client.getId().equals(id)) { + throw exception(OAUTH2_CLIENT_EXISTS); + } + } + + @Override + public OAuth2ClientDO getOAuth2Client(Long id) { + return oauth2ClientMapper.selectById(id); + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.OAUTH_CLIENT, key = "#clientId", + unless = "#result == null") + public OAuth2ClientDO getOAuth2ClientFromCache(String clientId) { + return oauth2ClientMapper.selectByClientId(clientId); + } + + @Override + public PageResult getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO) { + return oauth2ClientMapper.selectPage(pageReqVO); + } + + @Override + public OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, String authorizedGrantType, + Collection scopes, String redirectUri) { + // 校验客户端存在、且开启 + OAuth2ClientDO client = getSelf().getOAuth2ClientFromCache(clientId); + if (client == null) { + throw exception(OAUTH2_CLIENT_NOT_EXISTS); + } + if (CommonStatusEnum.isDisable(client.getStatus())) { + throw exception(OAUTH2_CLIENT_DISABLE); + } + + // 校验客户端密钥 + if (StrUtil.isNotEmpty(clientSecret) && ObjectUtil.notEqual(client.getSecret(), clientSecret)) { + throw exception(OAUTH2_CLIENT_CLIENT_SECRET_ERROR); + } + // 校验授权方式 + if (StrUtil.isNotEmpty(authorizedGrantType) && !CollUtil.contains(client.getAuthorizedGrantTypes(), authorizedGrantType)) { + throw exception(OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS); + } + // 校验授权范围 + if (CollUtil.isNotEmpty(scopes) && !CollUtil.containsAll(client.getScopes(), scopes)) { + throw exception(OAUTH2_CLIENT_SCOPE_OVER); + } + // 校验回调地址 + if (StrUtil.isNotEmpty(redirectUri) && !StrUtils.startWithAny(redirectUri, client.getRedirectUris())) { + throw exception(OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH, redirectUri); + } + return client; + } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private OAuth2ClientServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java new file mode 100644 index 0000000..ef0b173 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java @@ -0,0 +1,39 @@ +package com.win.module.system.service.oauth2; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; + +import java.util.List; + +/** + * OAuth2.0 授权码 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 JdbcAuthorizationCodeServices 的功能,提供授权码的操作 + * + * @author 芋道源码 + */ +public interface OAuth2CodeService { + + /** + * 创建授权码 + * + * 参考 JdbcAuthorizationCodeServices 的 createAuthorizationCode 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 授权码的信息 + */ + OAuth2CodeDO createAuthorizationCode(Long userId, Integer userType, String clientId, + List scopes, String redirectUri, String state); + + /** + * 使用授权码 + * + * @param code 授权码 + */ + OAuth2CodeDO consumeAuthorizationCode(String code); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java new file mode 100644 index 0000000..d5b3406 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java @@ -0,0 +1,64 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.util.IdUtil; +import com.win.framework.common.util.date.DateUtils; +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2CodeMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_EXPIRE; +import static com.win.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_NOT_EXISTS; + +/** + * OAuth2.0 授权码 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class OAuth2CodeServiceImpl implements OAuth2CodeService { + + /** + * 授权码的过期时间,默认 5 分钟 + */ + private static final Integer TIMEOUT = 5 * 60; + + @Resource + private OAuth2CodeMapper oauth2CodeMapper; + + @Override + public OAuth2CodeDO createAuthorizationCode(Long userId, Integer userType, String clientId, + List scopes, String redirectUri, String state) { + OAuth2CodeDO codeDO = new OAuth2CodeDO().setCode(generateCode()) + .setUserId(userId).setUserType(userType) + .setClientId(clientId).setScopes(scopes) + .setExpiresTime(LocalDateTime.now().plusSeconds(TIMEOUT)) + .setRedirectUri(redirectUri).setState(state); + oauth2CodeMapper.insert(codeDO); + return codeDO; + } + + @Override + public OAuth2CodeDO consumeAuthorizationCode(String code) { + OAuth2CodeDO codeDO = oauth2CodeMapper.selectByCode(code); + if (codeDO == null) { + throw exception(OAUTH2_CODE_NOT_EXISTS); + } + if (DateUtils.isExpired(codeDO.getExpiresTime())) { + throw exception(OAUTH2_CODE_EXPIRE); + } + oauth2CodeMapper.deleteById(codeDO.getId()); + return codeDO; + } + + private static String generateCode() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java new file mode 100644 index 0000000..4d87fa0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java @@ -0,0 +1,113 @@ +package com.win.module.system.service.oauth2; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.util.List; + +/** + * OAuth2 授予 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 TokenGranter 的功能,提供访问令牌、刷新令牌的操作 + * + * 将自身的 AdminUser 用户,授权给第三方应用,采用 OAuth2.0 的协议。 + * + * 问题:为什么自身也作为一个第三方应用,也走这套流程呢? + * 回复:当然可以这么做,采用 password 模式。考虑到大多数开发者使用不到这个特性,OAuth2.0 毕竟有一定学习成本,所以暂时没有采取这种方式。 + * + * @author 芋道源码 + */ +public interface OAuth2GrantService { + + /** + * 简化模式 + * + * 对应 Spring Security OAuth2 的 ImplicitTokenGranter 功能 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantImplicit(Long userId, Integer userType, + String clientId, List scopes); + + /** + * 授权码模式,第一阶段,获得 code 授权码 + * + * 对应 Spring Security OAuth2 的 AuthorizationEndpoint 的 generateCode 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 授权码 + */ + String grantAuthorizationCodeForCode(Long userId, Integer userType, + String clientId, List scopes, + String redirectUri, String state); + + /** + * 授权码模式,第二阶段,获得 accessToken 访问令牌 + * + * 对应 Spring Security OAuth2 的 AuthorizationCodeTokenGranter 功能 + * + * @param clientId 客户端编号 + * @param code 授权码 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, + String redirectUri, String state); + + /** + * 密码模式 + * + * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 + * + * @param username 账号 + * @param password 密码 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantPassword(String username, String password, + String clientId, List scopes); + + /** + * 刷新模式 + * + * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId); + + /** + * 客户端模式 + * + * 对应 Spring Security OAuth2 的 ClientCredentialsTokenGranter 功能 + * + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes); + + /** + * 移除访问令牌 + * + * 对应 Spring Security OAuth2 的 ConsumerTokenServices 的 revokeToken 方法 + * + * @param accessToken 访问令牌 + * @param clientId 客户端编号 + * @return 是否移除到 + */ + boolean revokeToken(String clientId, String accessToken); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java new file mode 100644 index 0000000..f9fe20f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java @@ -0,0 +1,104 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.ErrorCodeConstants; +import com.win.module.system.service.auth.AdminAuthService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * OAuth2 授予 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class OAuth2GrantServiceImpl implements OAuth2GrantService { + + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private OAuth2CodeService oauth2CodeService; + @Resource + private AdminAuthService adminAuthService; + + @Override + public OAuth2AccessTokenDO grantImplicit(Long userId, Integer userType, + String clientId, List scopes) { + return oauth2TokenService.createAccessToken(userId, userType, clientId, scopes); + } + + @Override + public String grantAuthorizationCodeForCode(Long userId, Integer userType, + String clientId, List scopes, + String redirectUri, String state) { + return oauth2CodeService.createAuthorizationCode(userId, userType, clientId, scopes, + redirectUri, state).getCode(); + } + + @Override + public OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, + String redirectUri, String state) { + OAuth2CodeDO codeDO = oauth2CodeService.consumeAuthorizationCode(code); + Assert.notNull(codeDO, "授权码不能为空"); // 防御性编程 + // 校验 clientId 是否匹配 + if (!StrUtil.equals(clientId, codeDO.getClientId())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_CLIENT_ID_MISMATCH); + } + // 校验 redirectUri 是否匹配 + if (!StrUtil.equals(redirectUri, codeDO.getRedirectUri())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_REDIRECT_URI_MISMATCH); + } + // 校验 state 是否匹配 + state = StrUtil.nullToDefault(state, ""); // 数据库 state 为 null 时,会设置为 "" 空串 + if (!StrUtil.equals(state, codeDO.getState())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_STATE_MISMATCH); + } + + // 创建访问令牌 + return oauth2TokenService.createAccessToken(codeDO.getUserId(), codeDO.getUserType(), + codeDO.getClientId(), codeDO.getScopes()); + } + + @Override + public OAuth2AccessTokenDO grantPassword(String username, String password, String clientId, List scopes) { + // 使用账号 + 密码进行登录 + AdminUserDO user = adminAuthService.authenticate(username, password); + Assert.notNull(user, "用户不能为空!"); // 防御性编程 + + // 创建访问令牌 + return oauth2TokenService.createAccessToken(user.getId(), UserTypeEnum.ADMIN.getValue(), clientId, scopes); + } + + @Override + public OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId) { + return oauth2TokenService.refreshAccessToken(refreshToken, clientId); + } + + @Override + public OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes) { + // TODO 芋艿:项目中使用 OAuth2 解决的是三方应用的授权,内部的 SSO 等问题,所以暂时不考虑 client_credentials 这个场景 + throw new UnsupportedOperationException("暂时不支持 client_credentials 授权模式"); + } + + @Override + public boolean revokeToken(String clientId, String accessToken) { + // 先查询,保证 clientId 时匹配的 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.getAccessToken(accessToken); + if (accessTokenDO == null || ObjectUtil.notEqual(clientId, accessTokenDO.getClientId())) { + return false; + } + // 再删除 + return oauth2TokenService.removeAccessToken(accessToken) != null; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java new file mode 100644 index 0000000..a94005e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java @@ -0,0 +1,80 @@ +package com.win.module.system.service.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.util.List; + +/** + * OAuth2.0 Token Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 DefaultTokenServices + JdbcTokenStore 的功能,提供访问令牌、刷新令牌的操作 + * + * @author 芋道源码 + */ +public interface OAuth2TokenService { + + /** + * 创建访问令牌 + * 注意:该流程中,会包含创建刷新令牌的创建 + * + * 参考 DefaultTokenServices 的 createAccessToken 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List scopes); + + /** + * 刷新访问令牌 + * + * 参考 DefaultTokenServices 的 refreshAccessToken 方法 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId); + + /** + * 获得访问令牌 + * + * 参考 DefaultTokenServices 的 getAccessToken 方法 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO getAccessToken(String accessToken); + + /** + * 校验访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO checkAccessToken(String accessToken); + + /** + * 移除访问令牌 + * 注意:该流程中,会移除相关的刷新令牌 + * + * 参考 DefaultTokenServices 的 revokeToken 方法 + * + * @param accessToken 刷新令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO removeAccessToken(String accessToken); + + /** + * 获得访问令牌分页 + * + * @param reqVO 请求 + * @return 访问令牌分页 + */ + PageResult getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java new file mode 100644 index 0000000..6b7cb0a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -0,0 +1,219 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.security.core.LoginUser; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import com.win.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper; +import com.win.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper; +import com.win.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO; +import com.win.module.system.service.user.AdminUserService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * OAuth2.0 Token Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class OAuth2TokenServiceImpl implements OAuth2TokenService { + + @Resource + private OAuth2AccessTokenMapper oauth2AccessTokenMapper; + @Resource + private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper; + + @Resource + private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO; + + @Resource + private OAuth2ClientService oauth2ClientService; + @Resource + @Lazy // 懒加载,避免循环依赖 + private AdminUserService adminUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List scopes) { + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + // 创建刷新令牌 + OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes); + // 创建访问令牌 + return createOAuth2AccessToken(refreshTokenDO, clientDO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) { + // 查询访问令牌 + OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(refreshToken); + if (refreshTokenDO == null) { + throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "无效的刷新令牌"); + } + + // 校验 Client 匹配 + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + if (ObjectUtil.notEqual(clientId, refreshTokenDO.getClientId())) { + throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "刷新令牌的客户端编号不正确"); + } + + // 移除相关的访问令牌 + List accessTokenDOs = oauth2AccessTokenMapper.selectListByRefreshToken(refreshToken); + if (CollUtil.isNotEmpty(accessTokenDOs)) { + oauth2AccessTokenMapper.deleteByIds(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getId)); + oauth2AccessTokenRedisDAO.deleteList(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getAccessToken)); + } + + // 已过期的情况下,删除刷新令牌 + if (DateUtils.isExpired(refreshTokenDO.getExpiresTime())) { + oauth2RefreshTokenMapper.deleteById(refreshTokenDO.getId()); + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "刷新令牌已过期"); + } + + // 创建访问令牌 + return createOAuth2AccessToken(refreshTokenDO, clientDO); + } + + @Override + public OAuth2AccessTokenDO getAccessToken(String accessToken) { + // 优先从 Redis 中获取 + OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenRedisDAO.get(accessToken); + if (accessTokenDO != null) { + return accessTokenDO; + } + + // 获取不到,从 MySQL 中获取访问令牌 + accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); + if (accessTokenDO == null) { + // 特殊:从 MySQL 中获取刷新令牌。原因:解决部分场景不方便刷新访问令牌场景 + // 例如说,积木报表只允许传递 token,不允许传递 refresh_token,导致无法刷新访问令牌 + // 再例如说,前端 WebSocket 的 token 直接跟在 url 上,无法传递 refresh_token + OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(accessToken); + if (refreshTokenDO != null && !DateUtils.isExpired(refreshTokenDO.getExpiresTime())) { + accessTokenDO = convertToAccessToken(refreshTokenDO); + } + } + + // 如果在 MySQL 存在,则往 Redis 中写入 + if (accessTokenDO != null && !DateUtils.isExpired(accessTokenDO.getExpiresTime())) { + oauth2AccessTokenRedisDAO.set(accessTokenDO); + } + return accessTokenDO; + } + + @Override + public OAuth2AccessTokenDO checkAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken); + if (accessTokenDO == null) { + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌不存在"); + } + if (DateUtils.isExpired(accessTokenDO.getExpiresTime())) { + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌已过期"); + } + return accessTokenDO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public OAuth2AccessTokenDO removeAccessToken(String accessToken) { + // 删除访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); + if (accessTokenDO == null) { + return null; + } + oauth2AccessTokenMapper.deleteById(accessTokenDO.getId()); + oauth2AccessTokenRedisDAO.delete(accessToken); + // 删除刷新令牌 + oauth2RefreshTokenMapper.deleteByRefreshToken(accessTokenDO.getRefreshToken()); + return accessTokenDO; + } + + @Override + public PageResult getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO) { + return oauth2AccessTokenMapper.selectPage(reqVO); + } + + private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) { + OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken()) + .setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType()) + .setUserInfo(buildUserInfo(refreshTokenDO.getUserId(), refreshTokenDO.getUserType())) + .setClientId(clientDO.getClientId()).setScopes(refreshTokenDO.getScopes()) + .setRefreshToken(refreshTokenDO.getRefreshToken()) + .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getAccessTokenValiditySeconds())); + accessTokenDO.setTenantId(TenantContextHolder.getTenantId()); // 手动设置租户编号,避免缓存到 Redis 的时候,无对应的租户编号 + oauth2AccessTokenMapper.insert(accessTokenDO); + // 记录到 Redis 中 + oauth2AccessTokenRedisDAO.set(accessTokenDO); + return accessTokenDO; + } + + private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List scopes) { + OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) + .setUserId(userId).setUserType(userType) + .setClientId(clientDO.getClientId()).setScopes(scopes) + .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())); + oauth2RefreshTokenMapper.insert(refreshToken); + return refreshToken; + } + + private OAuth2AccessTokenDO convertToAccessToken(OAuth2RefreshTokenDO refreshTokenDO) { + OAuth2AccessTokenDO accessTokenDO = BeanUtils.toBean(refreshTokenDO, OAuth2AccessTokenDO.class) + .setAccessToken(refreshTokenDO.getRefreshToken()); + TenantUtils.execute(refreshTokenDO.getTenantId(), + () -> accessTokenDO.setUserInfo(buildUserInfo(refreshTokenDO.getUserId(), refreshTokenDO.getUserType()))); + return accessTokenDO; + } + + /** + * 加载用户信息,方便 {@link com.win.framework.security.core.LoginUser} 获取到昵称、部门等信息 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @return 用户信息 + */ + private Map buildUserInfo(Long userId, Integer userType) { + if (userType.equals(UserTypeEnum.ADMIN.getValue())) { + AdminUserDO user = adminUserService.getUser(userId); + return MapUtil.builder(LoginUser.INFO_KEY_NICKNAME, user.getNickname()) + .put(LoginUser.INFO_KEY_DEPT_ID, StrUtil.toStringOrNull(user.getDeptId())).build(); + } else if (userType.equals(UserTypeEnum.MEMBER.getValue())) { + // 注意:目前 Member 暂时不读取,可以按需实现 + return Collections.emptyMap(); + } + return null; + } + + private static String generateAccessToken() { + return IdUtil.fastSimpleUUID(); + } + + private static String generateRefreshToken() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java new file mode 100644 index 0000000..08fc6d1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java @@ -0,0 +1,95 @@ +package com.win.module.system.service.permission; + +import com.win.module.system.controller.admin.permission.vo.menu.MenuSaveVO; +import com.win.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; + +import java.util.Collection; +import java.util.List; + +/** + * 菜单 Service 接口 + * + * @author 芋道源码 + */ +public interface MenuService { + + /** + * 创建菜单 + * + * @param createReqVO 菜单信息 + * @return 创建出来的菜单编号 + */ + Long createMenu(MenuSaveVO createReqVO); + + /** + * 更新菜单 + * + * @param updateReqVO 菜单信息 + */ + void updateMenu(MenuSaveVO updateReqVO); + + /** + * 删除菜单 + * + * @param id 菜单编号 + */ + void deleteMenu(Long id); + + /** + * 获得所有菜单列表 + * + * @return 菜单列表 + */ + List getMenuList(); + + /** + * 基于租户,筛选菜单列表 + * 注意,如果是系统租户,返回的还是全菜单 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getMenuListByTenant(MenuListReqVO reqVO); + + /** + * 过滤掉关闭的菜单及其子菜单 + * + * @param list 菜单列表 + * @return 过滤后的菜单列表 + */ + List filterDisableMenus(List list); + + /** + * 筛选菜单列表 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getMenuList(MenuListReqVO reqVO); + + /** + * 获得权限对应的菜单编号数组 + * + * @param permission 权限标识 + * @return 数组 + */ + List getMenuIdListByPermissionFromCache(String permission); + + /** + * 获得菜单 + * + * @param id 菜单编号 + * @return 菜单 + */ + MenuDO getMenu(Long id); + + /** + * 获得菜单数组 + * + * @param ids 菜单编号数组 + * @return 菜单数组 + */ + List getMenuList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java new file mode 100644 index 0000000..9ee9d1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java @@ -0,0 +1,262 @@ +package com.win.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.win.module.system.controller.admin.permission.vo.menu.MenuSaveVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.mysql.permission.MenuMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.permission.MenuTypeEnum; +import com.win.module.system.service.tenant.TenantService; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Lists; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.system.dal.dataobject.permission.MenuDO.ID_ROOT; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 菜单 Service 实现 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class MenuServiceImpl implements MenuService { + + @Resource + private MenuMapper menuMapper; + @Resource + private PermissionService permissionService; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Override + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, key = "#createReqVO.permission", + condition = "#createReqVO.permission != null") + public Long createMenu(MenuSaveVO createReqVO) { + // 校验父菜单存在 + validateParentMenu(createReqVO.getParentId(), null); + // 校验菜单(自己) + validateMenu(createReqVO.getParentId(), createReqVO.getName(), null); + + // 插入数据库 + MenuDO menu = BeanUtils.toBean(createReqVO, MenuDO.class); + initMenuProperty(menu); + menuMapper.insert(menu); + // 返回 + return menu.getId(); + } + + @Override + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为 permission 如果变更,涉及到新老两个 permission。直接清理,简单有效 + public void updateMenu(MenuSaveVO updateReqVO) { + // 校验更新的菜单是否存在 + if (menuMapper.selectById(updateReqVO.getId()) == null) { + throw exception(MENU_NOT_EXISTS); + } + // 校验父菜单存在 + validateParentMenu(updateReqVO.getParentId(), updateReqVO.getId()); + // 校验菜单(自己) + validateMenu(updateReqVO.getParentId(), updateReqVO.getName(), updateReqVO.getId()); + + // 更新到数据库 + MenuDO updateObj = BeanUtils.toBean(updateReqVO, MenuDO.class); + initMenuProperty(updateObj); + menuMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为此时不知道 id 对应的 permission 是多少。直接清理,简单有效 + public void deleteMenu(Long id) { + // 校验是否还有子菜单 + if (menuMapper.selectCountByParentId(id) > 0) { + throw exception(MENU_EXISTS_CHILDREN); + } + // 校验删除的菜单是否存在 + if (menuMapper.selectById(id) == null) { + throw exception(MENU_NOT_EXISTS); + } + // 标记删除 + menuMapper.deleteById(id); + // 删除授予给角色的权限 + permissionService.processMenuDeleted(id); + } + + @Override + public List getMenuList() { + return menuMapper.selectList(); + } + + @Override + public List getMenuListByTenant(MenuListReqVO reqVO) { + // 查询所有菜单,并过滤掉关闭的节点 + List menus = getMenuList(reqVO); + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> menus.removeIf(menu -> !CollUtil.contains(menuIds, menu.getId()))); + return menus; + } + + @Override + public List filterDisableMenus(List menuList) { + if (CollUtil.isEmpty(menuList)){ + return Collections.emptyList(); + } + Map menuMap = convertMap(menuList, MenuDO::getId); + + // 遍历 menu 菜单,查找不是禁用的菜单,添加到 enabledMenus 结果 + List enabledMenus = new ArrayList<>(); + Set disabledMenuCache = new HashSet<>(); // 存下递归搜索过被禁用的菜单,防止重复的搜索 + for (MenuDO menu : menuList) { + if (isMenuDisabled(menu, menuMap, disabledMenuCache)) { + continue; + } + enabledMenus.add(menu); + } + return enabledMenus; + } + + private boolean isMenuDisabled(MenuDO node, Map menuMap, Set disabledMenuCache) { + // 如果已经判定是禁用的节点,直接结束 + if (disabledMenuCache.contains(node.getId())) { + return true; + } + + // 1. 先判断自身是否禁用 + if (CommonStatusEnum.isDisable(node.getStatus())) { + disabledMenuCache.add(node.getId()); + return true; + } + + // 2. 遍历到 parentId 为根节点,则无需判断 + Long parentId = node.getParentId(); + if (ObjUtil.equal(parentId, ID_ROOT)) { + return false; + } + + // 3. 继续遍历 parent 节点 + MenuDO parent = menuMap.get(parentId); + if (parent == null || isMenuDisabled(parent, menuMap, disabledMenuCache)) { + disabledMenuCache.add(node.getId()); + return true; + } + return false; + } + + @Override + public List getMenuList(MenuListReqVO reqVO) { + return menuMapper.selectList(reqVO); + } + + @Override + @Cacheable(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, key = "#permission") + public List getMenuIdListByPermissionFromCache(String permission) { + List menus = menuMapper.selectListByPermission(permission); + return convertList(menus, MenuDO::getId); + } + + @Override + public MenuDO getMenu(Long id) { + return menuMapper.selectById(id); + } + + @Override + public List getMenuList(Collection ids) { + // 当 ids 为空时,返回一个空的实例对象 + if (CollUtil.isEmpty(ids)) { + return Lists.newArrayList(); + } + return menuMapper.selectBatchIds(ids); + } + + /** + * 校验父菜单是否合法 + *

+ * 1. 不能设置自己为父菜单 + * 2. 父菜单不存在 + * 3. 父菜单必须是 {@link MenuTypeEnum#MENU} 菜单类型 + * + * @param parentId 父菜单编号 + * @param childId 当前菜单编号 + */ + @VisibleForTesting + void validateParentMenu(Long parentId, Long childId) { + if (parentId == null || ID_ROOT.equals(parentId)) { + return; + } + // 不能设置自己为父菜单 + if (parentId.equals(childId)) { + throw exception(MENU_PARENT_ERROR); + } + MenuDO menu = menuMapper.selectById(parentId); + // 父菜单不存在 + if (menu == null) { + throw exception(MENU_PARENT_NOT_EXISTS); + } + // 父菜单必须是目录或者菜单类型 + if (!MenuTypeEnum.DIR.getType().equals(menu.getType()) + && !MenuTypeEnum.MENU.getType().equals(menu.getType())) { + throw exception(MENU_PARENT_NOT_DIR_OR_MENU); + } + } + + /** + * 校验菜单是否合法 + *

+ * 1. 校验相同父菜单编号下,是否存在相同的菜单名 + * + * @param name 菜单名字 + * @param parentId 父菜单编号 + * @param id 菜单编号 + */ + @VisibleForTesting + void validateMenu(Long parentId, String name, Long id) { + MenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的菜单 + if (id == null) { + throw exception(MENU_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw exception(MENU_NAME_DUPLICATE); + } + } + + /** + * 初始化菜单的通用属性。 + *

+ * 例如说,只有目录或者菜单类型的菜单,才设置 icon + * + * @param menu 菜单 + */ + private void initMenuProperty(MenuDO menu) { + // 菜单为按钮类型时,无需 component、icon、path 属性,进行置空 + if (MenuTypeEnum.BUTTON.getType().equals(menu.getType())) { + menu.setComponent(""); + menu.setComponentName(""); + menu.setIcon(""); + menu.setPath(""); + } + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java new file mode 100644 index 0000000..081b253 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java @@ -0,0 +1,146 @@ +package com.win.module.system.service.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; + +import java.util.Collection; +import java.util.Set; + +import static java.util.Collections.singleton; + +/** + * 权限 Service 接口 + *

+ * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 + * + * @author 芋道源码 + */ +public interface PermissionService { + + /** + * 判断是否有权限,任一一个即可 + * + * @param userId 用户编号 + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(Long userId, String... permissions); + + /** + * 判断是否有角色,任一一个即可 + * + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(Long userId, String... roles); + + // ========== 角色-菜单的相关方法 ========== + + /** + * 设置角色菜单 + * + * @param roleId 角色编号 + * @param menuIds 菜单编号集合 + */ + void assignRoleMenu(Long roleId, Set menuIds); + + /** + * 处理角色删除时,删除关联授权数据 + * + * @param roleId 角色编号 + */ + void processRoleDeleted(Long roleId); + + /** + * 处理菜单删除时,删除关联授权数据 + * + * @param menuId 菜单编号 + */ + void processMenuDeleted(Long menuId); + + /** + * 获得角色拥有的菜单编号集合 + * + * @param roleId 角色编号 + * @return 菜单编号集合 + */ + default Set getRoleMenuListByRoleId(Long roleId) { + return getRoleMenuListByRoleId(singleton(roleId)); + } + + /** + * 获得角色们拥有的菜单编号集合 + * + * @param roleIds 角色编号数组 + * @return 菜单编号集合 + */ + Set getRoleMenuListByRoleId(Collection roleIds); + + /** + * 获得拥有指定菜单的角色编号数组,从缓存中获取 + * + * @param menuId 菜单编号 + * @return 角色编号数组 + */ + Set getMenuRoleIdListByMenuIdFromCache(Long menuId); + + // ========== 用户-角色的相关方法 ========== + + /** + * 设置用户角色 + * + * @param userId 角色编号 + * @param roleIds 角色编号集合 + */ + void assignUserRole(Long userId, Set roleIds); + + /** + * 处理用户删除时,删除关联授权数据 + * + * @param userId 用户编号 + */ + void processUserDeleted(Long userId); + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleId(Collection roleIds); + + /** + * 获得用户拥有的角色编号集合 + * + * @param userId 用户编号 + * @return 角色编号集合 + */ + Set getUserRoleIdListByUserId(Long userId); + + /** + * 获得用户拥有的角色编号集合,从缓存中获取 + * + * @param userId 用户编号 + * @return 角色编号集合 + */ + Set getUserRoleIdListByUserIdFromCache(Long userId); + + // ========== 用户-部门的相关方法 ========== + + /** + * 设置角色的数据权限 + * + * @param roleId 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds); + + /** + * 获得登陆用户的部门数据权限 + * + * @param userId 用户编号 + * @return 部门数据权限 + */ + DeptDataPermissionRespDTO getDeptDataPermission(Long userId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java new file mode 100644 index 0000000..5437845 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java @@ -0,0 +1,337 @@ +package com.win.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.permission.RoleMenuDO; +import com.win.module.system.dal.dataobject.permission.UserRoleDO; +import com.win.module.system.dal.mysql.permission.RoleMenuMapper; +import com.win.module.system.dal.mysql.permission.UserRoleMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.permission.DataScopeEnum; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.user.AdminUserService; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Suppliers; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import java.util.*; +import java.util.function.Supplier; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.common.util.json.JsonUtils.toJsonString; + +/** + * 权限 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class PermissionServiceImpl implements PermissionService { + + @Resource + private RoleMenuMapper roleMenuMapper; + @Resource + private UserRoleMapper userRoleMapper; + + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private DeptService deptService; + @Resource + private AdminUserService userService; + + @Override + public boolean hasAnyPermissions(Long userId, String... permissions) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(permissions)) { + return true; + } + + // 获得当前登录的角色。如果为空,说明没有权限 + List roles = getEnableUserRoleListByUserIdFromCache(userId); + if (CollUtil.isEmpty(roles)) { + return false; + } + + // 情况一:遍历判断每个权限,如果有一满足,说明有权限 + for (String permission : permissions) { + if (hasAnyPermission(roles, permission)) { + return true; + } + } + + // 情况二:如果是超管,也说明有权限 + return roleService.hasAnySuperAdmin(convertSet(roles, RoleDO::getId)); + } + + /** + * 判断指定角色,是否拥有该 permission 权限 + * + * @param roles 指定角色数组 + * @param permission 权限标识 + * @return 是否拥有 + */ + private boolean hasAnyPermission(List roles, String permission) { + List menuIds = menuService.getMenuIdListByPermissionFromCache(permission); + // 采用严格模式,如果权限找不到对应的 Menu 的话,也认为没有权限 + if (CollUtil.isEmpty(menuIds)) { + return false; + } + + // 判断是否有权限 + Set roleIds = convertSet(roles, RoleDO::getId); + for (Long menuId : menuIds) { + // 获得拥有该菜单的角色编号集合 + Set menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache(menuId); + // 如果有交集,说明有权限 + if (CollUtil.containsAny(menuRoleIds, roleIds)) { + return true; + } + } + return false; + } + + @Override + public boolean hasAnyRoles(Long userId, String... roles) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(roles)) { + return true; + } + + // 获得当前登录的角色。如果为空,说明没有权限 + List roleList = getEnableUserRoleListByUserIdFromCache(userId); + if (CollUtil.isEmpty(roleList)) { + return false; + } + + // 判断是否有角色 + Set userRoles = convertSet(roleList, RoleDO::getCode); + return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); + } + + // ========== 角色-菜单的相关方法 ========== + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,主要一次更新涉及到的 menuIds 较多,反倒批量会更快 + public void assignRoleMenu(Long roleId, Set menuIds) { + // 获得角色拥有菜单编号 + Set dbMenuIds = convertSet(roleMenuMapper.selectListByRoleId(roleId), RoleMenuDO::getMenuId); + // 计算新增和删除的菜单编号 + Set menuIdList = CollUtil.emptyIfNull(menuIds); + Collection createMenuIds = CollUtil.subtract(menuIdList, dbMenuIds); + Collection deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIdList); + // 执行新增和删除。对于已经授权的菜单,不用做任何处理 + if (CollUtil.isNotEmpty(createMenuIds)) { + roleMenuMapper.insertBatch(CollectionUtils.convertList(createMenuIds, menuId -> { + RoleMenuDO entity = new RoleMenuDO(); + entity.setRoleId(roleId); + entity.setMenuId(menuId); + return entity; + })); + } + if (CollUtil.isNotEmpty(deleteMenuIds)) { + roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @Caching(evict = { + @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, + allEntries = true), // allEntries 清空所有缓存,此处无法方便获得 roleId 对应的 menu 缓存们 + @CacheEvict(value = RedisKeyConstants.USER_ROLE_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,此处无法方便获得 roleId 对应的 user 缓存们 + }) + public void processRoleDeleted(Long roleId) { + // 标记删除 UserRole + userRoleMapper.deleteListByRoleId(roleId); + // 标记删除 RoleMenu + roleMenuMapper.deleteListByRoleId(roleId); + } + + @Override + @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, key = "#menuId") + public void processMenuDeleted(Long menuId) { + roleMenuMapper.deleteListByMenuId(menuId); + } + + @Override + public Set getRoleMenuListByRoleId(Collection roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return Collections.emptySet(); + } + + // 如果是管理员的情况下,获取全部菜单编号 + if (roleService.hasAnySuperAdmin(roleIds)) { + return convertSet(menuService.getMenuList(), MenuDO::getId); + } + // 如果是非管理员的情况下,获得拥有的菜单编号 + return convertSet(roleMenuMapper.selectListByRoleId(roleIds), RoleMenuDO::getMenuId); + } + + @Override + @Cacheable(value = RedisKeyConstants.MENU_ROLE_ID_LIST, key = "#menuId") + public Set getMenuRoleIdListByMenuIdFromCache(Long menuId) { + return convertSet(roleMenuMapper.selectListByMenuId(menuId), RoleMenuDO::getRoleId); + } + + // ========== 用户-角色的相关方法 ========== + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + @CacheEvict(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId") + public void assignUserRole(Long userId, Set roleIds) { + // 获得角色拥有角色编号 + Set dbRoleIds = convertSet(userRoleMapper.selectListByUserId(userId), + UserRoleDO::getRoleId); + // 计算新增和删除的角色编号 + Set roleIdList = CollUtil.emptyIfNull(roleIds); + Collection createRoleIds = CollUtil.subtract(roleIdList, dbRoleIds); + Collection deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIdList); + // 执行新增和删除。对于已经授权的角色,不用做任何处理 + if (!CollectionUtil.isEmpty(createRoleIds)) { + userRoleMapper.insertBatch(CollectionUtils.convertList(createRoleIds, roleId -> { + UserRoleDO entity = new UserRoleDO(); + entity.setUserId(userId); + entity.setRoleId(roleId); + return entity; + })); + } + if (!CollectionUtil.isEmpty(deleteMenuIds)) { + userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); + } + } + + @Override + @CacheEvict(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId") + public void processUserDeleted(Long userId) { + userRoleMapper.deleteListByUserId(userId); + } + + @Override + public Set getUserRoleIdListByUserId(Long userId) { + return convertSet(userRoleMapper.selectListByUserId(userId), UserRoleDO::getRoleId); + } + + @Override + @Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId") + public Set getUserRoleIdListByUserIdFromCache(Long userId) { + return getUserRoleIdListByUserId(userId); + } + + @Override + public Set getUserRoleIdListByRoleId(Collection roleIds) { + return convertSet(userRoleMapper.selectListByRoleIds(roleIds), UserRoleDO::getUserId); + } + + /** + * 获得用户拥有的角色,并且这些角色是开启状态的 + * + * @param userId 用户编号 + * @return 用户拥有的角色 + */ + @VisibleForTesting + List getEnableUserRoleListByUserIdFromCache(Long userId) { + // 获得用户拥有的角色编号 + Set roleIds = getSelf().getUserRoleIdListByUserIdFromCache(userId); + // 获得角色数组,并移除被禁用的 + List roles = roleService.getRoleListFromCache(roleIds); + roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); + return roles; + } + + // ========== 用户-部门的相关方法 ========== + + @Override + public void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds) { + roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds); + } + + @Override + @DataPermission(enable = false) // 关闭数据权限,不然就会出现递归获取数据权限的问题 + public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { + // 获得用户的角色 + List roles = getEnableUserRoleListByUserIdFromCache(userId); + + // 如果角色为空,则只能查看自己 + DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO(); + if (CollUtil.isEmpty(roles)) { + result.setSelf(true); + return result; + } + + // 获得用户的部门编号的缓存,通过 Guava 的 Suppliers 惰性求值,即有且仅有第一次发起 DB 的查询 + Supplier userDeptId = Suppliers.memoize(() -> userService.getUser(userId).getDeptId()); + // 遍历每个角色,计算 + for (RoleDO role : roles) { + // 为空时,跳过 + if (role.getDataScope() == null) { + continue; + } + // 情况一,ALL + if (Objects.equals(role.getDataScope(), DataScopeEnum.ALL.getScope())) { + result.setAll(true); + continue; + } + // 情况二,DEPT_CUSTOM + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { + CollUtil.addAll(result.getDeptIds(), role.getDataScopeDeptIds()); + // 自定义可见部门时,保证可以看到自己所在的部门。否则,一些场景下可能会有问题。 + // 例如说,登录时,基于 t_user 的 username 查询会可能被 dept_id 过滤掉 + CollUtil.addAll(result.getDeptIds(), userDeptId.get()); + continue; + } + // 情况三,DEPT_ONLY + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { + CollectionUtils.addIfNotNull(result.getDeptIds(), userDeptId.get()); + continue; + } + // 情况四,DEPT_DEPT_AND_CHILD + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { + CollUtil.addAll(result.getDeptIds(), deptService.getChildDeptIdListFromCache(userDeptId.get())); + // 添加本身部门编号 + CollUtil.addAll(result.getDeptIds(), userDeptId.get()); + continue; + } + // 情况五,SELF + if (Objects.equals(role.getDataScope(), DataScopeEnum.SELF.getScope())) { + result.setSelf(true); + continue; + } + // 未知情况,error log 即可 + log.error("[getDeptDataPermission][LoginUser({}) role({}) 无法处理]", userId, toJsonString(result)); + } + return result; + } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private PermissionServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java new file mode 100644 index 0000000..2b11896 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java @@ -0,0 +1,124 @@ +package com.win.module.system.service.permission; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.win.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; +import com.win.module.system.dal.dataobject.permission.RoleDO; + +import jakarta.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 角色 Service 接口 + * + * @author 芋道源码 + */ +public interface RoleService { + + /** + * 创建角色 + * + * @param createReqVO 创建角色信息 + * @param type 角色类型 + * @return 角色编号 + */ + Long createRole(@Valid RoleSaveReqVO createReqVO, Integer type); + + /** + * 更新角色 + * + * @param updateReqVO 更新角色信息 + */ + void updateRole(@Valid RoleSaveReqVO updateReqVO); + + /** + * 删除角色 + * + * @param id 角色编号 + */ + void deleteRole(Long id); + + /** + * 设置角色的数据权限 + * + * @param id 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds); + + /** + * 获得角色 + * + * @param id 角色编号 + * @return 角色 + */ + RoleDO getRole(Long id); + + /** + * 获得角色,从缓存中 + * + * @param id 角色编号 + * @return 角色 + */ + RoleDO getRoleFromCache(Long id); + + /** + * 获得角色列表 + * + * @param ids 角色编号数组 + * @return 角色列表 + */ + List getRoleList(Collection ids); + + /** + * 获得角色数组,从缓存中 + * + * @param ids 角色编号数组 + * @return 角色数组 + */ + List getRoleListFromCache(Collection ids); + + /** + * 获得角色列表 + * + * @param statuses 筛选的状态 + * @return 角色列表 + */ + List getRoleListByStatus(Collection statuses); + + /** + * 获得所有角色列表 + * + * @return 角色列表 + */ + List getRoleList(); + + /** + * 获得角色分页 + * + * @param reqVO 角色分页查询 + * @return 角色分页结果 + */ + PageResult getRolePage(RolePageReqVO reqVO); + + /** + * 判断角色编号数组中,是否有管理员 + * + * @param ids 角色编号数组 + * @return 是否有管理员 + */ + boolean hasAnySuperAdmin(Collection ids); + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validateRoleList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java new file mode 100644 index 0000000..2371e24 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java @@ -0,0 +1,262 @@ +package com.win.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.win.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.mysql.permission.RoleMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.permission.DataScopeEnum; +import com.win.module.system.enums.permission.RoleCodeEnum; +import com.win.module.system.enums.permission.RoleTypeEnum; +import com.google.common.annotations.VisibleForTesting; +import com.mzt.logapi.context.LogRecordContext; +import com.mzt.logapi.service.impl.DiffParseFunction; +import com.mzt.logapi.starter.annotation.LogRecord; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.system.enums.ErrorCodeConstants.*; +import static com.win.module.system.enums.LogRecordConstants.*; + +/** + * 角色 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class RoleServiceImpl implements RoleService { + + @Resource + private PermissionService permissionService; + + @Resource + private RoleMapper roleMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + @LogRecord(type = SYSTEM_ROLE_TYPE, subType = SYSTEM_ROLE_CREATE_SUB_TYPE, bizNo = "{{#role.id}}", + success = SYSTEM_ROLE_CREATE_SUCCESS) + public Long createRole(RoleSaveReqVO createReqVO, Integer type) { + // 1. 校验角色 + validateRoleDuplicate(createReqVO.getName(), createReqVO.getCode(), null); + + // 2. 插入到数据库 + RoleDO role = BeanUtils.toBean(createReqVO, RoleDO.class) + .setType(ObjectUtil.defaultIfNull(type, RoleTypeEnum.CUSTOM.getType())) + .setStatus(ObjUtil.defaultIfNull(createReqVO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) + .setDataScope(DataScopeEnum.ALL.getScope()); // 默认可查看所有数据。原因是,可能一些项目不需要项目权限 + roleMapper.insert(role); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("role", role); + return role.getId(); + } + + @Override + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#updateReqVO.id") + @LogRecord(type = SYSTEM_ROLE_TYPE, subType = SYSTEM_ROLE_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", + success = SYSTEM_ROLE_UPDATE_SUCCESS) + public void updateRole(RoleSaveReqVO updateReqVO) { + // 1.1 校验是否可以更新 + RoleDO role = validateRoleForUpdate(updateReqVO.getId()); + // 1.2 校验角色的唯一字段是否重复 + validateRoleDuplicate(updateReqVO.getName(), updateReqVO.getCode(), updateReqVO.getId()); + + // 2. 更新到数据库 + RoleDO updateObj = BeanUtils.toBean(updateReqVO, RoleDO.class); + roleMapper.updateById(updateObj); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("role", role); + } + + @Override + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#id") + public void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds) { + // 校验是否可以更新 + validateRoleForUpdate(id); + + // 更新数据范围 + RoleDO updateObject = new RoleDO(); + updateObject.setId(id); + updateObject.setDataScope(dataScope); + updateObject.setDataScopeDeptIds(dataScopeDeptIds); + roleMapper.updateById(updateObject); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#id") + @LogRecord(type = SYSTEM_ROLE_TYPE, subType = SYSTEM_ROLE_DELETE_SUB_TYPE, bizNo = "{{#id}}", + success = SYSTEM_ROLE_DELETE_SUCCESS) + public void deleteRole(Long id) { + // 1. 校验是否可以更新 + RoleDO role = validateRoleForUpdate(id); + + // 2.1 标记删除 + roleMapper.deleteById(id); + // 2.2 删除相关数据 + permissionService.processRoleDeleted(id); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(role, RoleSaveReqVO.class)); + LogRecordContext.putVariable("role", role); + } + + /** + * 校验角色的唯一字段是否重复 + * + * 1. 是否存在相同名字的角色 + * 2. 是否存在相同编码的角色 + * + * @param name 角色名字 + * @param code 角色额编码 + * @param id 角色编号 + */ + @VisibleForTesting + void validateRoleDuplicate(String name, String code, Long id) { + // 0. 超级管理员,不允许创建 + if (RoleCodeEnum.isSuperAdmin(code)) { + throw exception(ROLE_ADMIN_CODE_ERROR, code); + } + // 1. 该 name 名字被其它角色所使用 + RoleDO role = roleMapper.selectByName(name); + if (role != null && !role.getId().equals(id)) { + throw exception(ROLE_NAME_DUPLICATE, name); + } + // 2. 是否存在相同编码的角色 + if (!StringUtils.hasText(code)) { + return; + } + // 该 code 编码被其它角色所使用 + role = roleMapper.selectByCode(code); + if (role != null && !role.getId().equals(id)) { + throw exception(ROLE_CODE_DUPLICATE, code); + } + } + + /** + * 校验角色是否可以被更新 + * + * @param id 角色编号 + */ + @VisibleForTesting + RoleDO validateRoleForUpdate(Long id) { + RoleDO role = roleMapper.selectById(id); + if (role == null) { + throw exception(ROLE_NOT_EXISTS); + } + // 内置角色,不允许删除 + if (RoleTypeEnum.SYSTEM.getType().equals(role.getType())) { + throw exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); + } + return role; + } + + @Override + public RoleDO getRole(Long id) { + return roleMapper.selectById(id); + } + + @Override + @Cacheable(value = RedisKeyConstants.ROLE, key = "#id", + unless = "#result == null") + public RoleDO getRoleFromCache(Long id) { + return roleMapper.selectById(id); + } + + + @Override + public List getRoleListByStatus(Collection statuses) { + return roleMapper.selectListByStatus(statuses); + } + + @Override + public List getRoleList() { + return roleMapper.selectList(); + } + + @Override + public List getRoleList(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return roleMapper.selectBatchIds(ids); + } + + @Override + public List getRoleListFromCache(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + // 这里采用 for 循环从缓存中获取,主要考虑 Spring CacheManager 无法批量操作的问题 + RoleServiceImpl self = getSelf(); + return CollectionUtils.convertList(ids, self::getRoleFromCache); + } + + @Override + public PageResult getRolePage(RolePageReqVO reqVO) { + return roleMapper.selectPage(reqVO); + } + + @Override + public boolean hasAnySuperAdmin(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return false; + } + RoleServiceImpl self = getSelf(); + return ids.stream().anyMatch(id -> { + RoleDO role = self.getRoleFromCache(id); + return role != null && RoleCodeEnum.isSuperAdmin(role.getCode()); + }); + } + + @Override + public void validateRoleList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得角色信息 + List roles = roleMapper.selectBatchIds(ids); + Map roleMap = convertMap(roles, RoleDO::getId); + // 校验 + ids.forEach(id -> { + RoleDO role = roleMap.get(id); + if (role == null) { + throw exception(ROLE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { + throw exception(ROLE_IS_DISABLE, role.getName()); + } + }); + } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private RoleServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java new file mode 100644 index 0000000..0b6912f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java @@ -0,0 +1,81 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.framework.sms.core.client.SmsClient; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 短信渠道 Service 接口 + * + * @author zzf + * @since 2021/1/25 9:24 + */ +public interface SmsChannelService { + + /** + * 创建短信渠道 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsChannel(@Valid SmsChannelSaveReqVO createReqVO); + + /** + * 更新短信渠道 + * + * @param updateReqVO 更新信息 + */ + void updateSmsChannel(@Valid SmsChannelSaveReqVO updateReqVO); + + /** + * 删除短信渠道 + * + * @param id 编号 + */ + void deleteSmsChannel(Long id); + + /** + * 获得短信渠道 + * + * @param id 编号 + * @return 短信渠道 + */ + SmsChannelDO getSmsChannel(Long id); + + /** + * 获得所有短信渠道列表 + * + * @return 短信渠道列表 + */ + List getSmsChannelList(); + + /** + * 获得短信渠道分页 + * + * @param pageReqVO 分页查询 + * @return 短信渠道分页 + */ + PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO); + + /** + * 获得短信客户端 + * + * @param id 编号 + * @return 短信客户端 + */ + SmsClient getSmsClient(Long id); + + /** + * 获得短信客户端 + * + * @param code 编码 + * @return 短信客户端 + */ + SmsClient getSmsClient(String code); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java new file mode 100644 index 0000000..478e02a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java @@ -0,0 +1,103 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.dal.mysql.sms.SmsChannelMapper; +import com.win.module.system.framework.sms.core.client.SmsClient; +import com.win.module.system.framework.sms.core.client.SmsClientFactory; +import com.win.module.system.framework.sms.core.property.SmsChannelProperties; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static com.win.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; + +/** + * 短信渠道 Service 实现类 + * + * @author zzf + */ +@Service +@Slf4j +public class SmsChannelServiceImpl implements SmsChannelService { + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SmsChannelMapper smsChannelMapper; + + @Resource + private SmsTemplateService smsTemplateService; + + @Override + public Long createSmsChannel(SmsChannelSaveReqVO createReqVO) { + SmsChannelDO channel = BeanUtils.toBean(createReqVO, SmsChannelDO.class); + smsChannelMapper.insert(channel); + return channel.getId(); + } + + @Override + public void updateSmsChannel(SmsChannelSaveReqVO updateReqVO) { + // 校验存在 + validateSmsChannelExists(updateReqVO.getId()); + // 更新 + SmsChannelDO updateObj = BeanUtils.toBean(updateReqVO, SmsChannelDO.class); + smsChannelMapper.updateById(updateObj); + } + + @Override + public void deleteSmsChannel(Long id) { + // 校验存在 + validateSmsChannelExists(id); + // 校验是否有在使用该账号的模版 + if (smsTemplateService.getSmsTemplateCountByChannelId(id) > 0) { + throw exception(SMS_CHANNEL_HAS_CHILDREN); + } + // 删除 + smsChannelMapper.deleteById(id); + } + + private SmsChannelDO validateSmsChannelExists(Long id) { + SmsChannelDO channel = smsChannelMapper.selectById(id); + if (channel == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + return channel; + } + + @Override + public SmsChannelDO getSmsChannel(Long id) { + return smsChannelMapper.selectById(id); + } + + @Override + public List getSmsChannelList() { + return smsChannelMapper.selectList(); + } + + @Override + public PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO) { + return smsChannelMapper.selectPage(pageReqVO); + } + + @Override + public SmsClient getSmsClient(Long id) { + SmsChannelDO channel = smsChannelMapper.selectById(id); + SmsChannelProperties properties = BeanUtils.toBean(channel, SmsChannelProperties.class); + return smsClientFactory.createOrUpdateSmsClient(properties); + } + + @Override + public SmsClient getSmsClient(String code) { + return smsClientFactory.getSmsClient(code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java new file mode 100644 index 0000000..43f0272 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java @@ -0,0 +1,40 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.exception.ServiceException; +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; + +import jakarta.validation.Valid; + +/** + * 短信验证码 Service 接口 + * + * @author 芋道源码 + */ +public interface SmsCodeService { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java new file mode 100644 index 0000000..9a47d62 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java @@ -0,0 +1,112 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.dal.dataobject.sms.SmsCodeDO; +import com.win.module.system.dal.mysql.sms.SmsCodeMapper; +import com.win.module.system.enums.sms.SmsSceneEnum; +import com.win.module.system.framework.sms.config.SmsCodeProperties; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.randomInt; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.date.DateUtils.isToday; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信验证码 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SmsCodeServiceImpl implements SmsCodeService { + + @Resource + private SmsCodeProperties smsCodeProperties; + + @Resource + private SmsCodeMapper smsCodeMapper; + + @Resource + private SmsSendService smsSendService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene()); + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene()); + // 创建验证码 + String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp()); + // 发送验证码 + smsSendService.sendSingleSms(reqDTO.getMobile(), null, null, + sceneEnum.getTemplateCode(), MapUtil.of("code", code)); + } + + private String createSmsCode(String mobile, Integer scene, String ip) { + // 校验是否可以发送验证码,不用筛选场景 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null, null); + if (lastSmsCode != null) { + if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis() + < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 + throw exception(SMS_CODE_SEND_TOO_FAST); + } + if (isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限 + lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 + throw exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); + } + // TODO 芋艿:提升,每个 IP 每天可发送数量 + // TODO 芋艿:提升,每个 IP 每小时可发送数量 + } + + // 创建验证码记录 + String code = String.format("%0" + smsCodeProperties.getEndCode().toString().length() + "d", + randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); + SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene) + .todayIndex(lastSmsCode != null && isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1) + .createIp(ip).used(false).build(); + smsCodeMapper.insert(newSmsCode); + return code; + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + // 检测验证码是否有效 + SmsCodeDO lastSmsCode = validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); + // 使用验证码 + smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId()) + .used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build()); + } + + @Override + public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) { + validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); + } + + private SmsCodeDO validateSmsCode0(String mobile, String code, Integer scene) { + // 校验验证码 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene); + // 若验证码不存在,抛出异常 + if (lastSmsCode == null) { + throw exception(SMS_CODE_NOT_FOUND); + } + // 超过时间 + if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis() + >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 + throw exception(SMS_CODE_EXPIRED); + } + // 判断验证码是否已被使用 + if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { + throw exception(SMS_CODE_USED); + } + return lastSmsCode; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java new file mode 100644 index 0000000..72725f6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java @@ -0,0 +1,68 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 短信日志 Service 接口 + * + * @author zzf + * @date 13:48 2021/3/2 + */ +public interface SmsLogService { + + /** + * 创建短信日志 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param isSend 是否发送 + * @param template 短信模板 + * @param templateContent 短信内容 + * @param templateParams 短信参数 + * @return 发送日志编号 + */ + Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams); + + /** + * 更新日志的发送结果 + * + * @param id 日志编号 + * @param success 发送是否成功 + * @param apiSendCode 短信 API 发送结果的编码 + * @param apiSendMsg 短信 API 发送失败的提示 + * @param apiRequestId 短信 API 发送返回的唯一请求 ID + * @param apiSerialNo 短信 API 发送返回的序号 + */ + void updateSmsSendResult(Long id, Boolean success, + String apiSendCode, String apiSendMsg, + String apiRequestId, String apiSerialNo); + + /** + * 更新日志的接收结果 + * + * @param id 日志编号 + * @param success 是否接收成功 + * @param receiveTime 用户接收时间 + * @param apiReceiveCode API 接收结果的编码 + * @param apiReceiveMsg API 接收结果的说明 + */ + void updateSmsReceiveResult(Long id, Boolean success, + LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg); + + /** + * 获得短信日志分页 + * + * @param pageReqVO 分页查询 + * @return 短信日志分页 + */ + PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java new file mode 100644 index 0000000..be08516 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java @@ -0,0 +1,79 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.dal.mysql.sms.SmsLogMapper; +import com.win.module.system.enums.sms.SmsReceiveStatusEnum; +import com.win.module.system.enums.sms.SmsSendStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.Objects; + +/** + * 短信日志 Service 实现类 + * + * @author zzf + */ +@Slf4j +@Service +public class SmsLogServiceImpl implements SmsLogService { + + @Resource + private SmsLogMapper smsLogMapper; + + @Override + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams) { + SmsLogDO.SmsLogDOBuilder logBuilder = SmsLogDO.builder(); + // 根据是否要发送,设置状态 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SmsSendStatusEnum.INIT.getStatus() + : SmsSendStatusEnum.IGNORE.getStatus()); + // 设置手机相关字段 + logBuilder.mobile(mobile).userId(userId).userType(userType); + // 设置模板相关字段 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); + logBuilder.templateContent(templateContent).templateParams(templateParams) + .apiTemplateId(template.getApiTemplateId()); + // 设置渠道相关字段 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); + // 设置接收相关字段 + logBuilder.receiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + + // 插入数据库 + SmsLogDO logDO = logBuilder.build(); + smsLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateSmsSendResult(Long id, Boolean success, + String apiSendCode, String apiSendMsg, + String apiRequestId, String apiSerialNo) { + SmsSendStatusEnum sendStatus = success ? SmsSendStatusEnum.SUCCESS : SmsSendStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id) + .sendStatus(sendStatus.getStatus()).sendTime(LocalDateTime.now()) + .apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); + } + + @Override + public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime, + String apiReceiveCode, String apiReceiveMsg) { + SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? + SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) + .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); + } + + @Override + public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { + return smsLogMapper.selectPage(pageReqVO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java new file mode 100644 index 0000000..521bef8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java @@ -0,0 +1,78 @@ +package com.win.module.system.service.sms; + +import com.win.module.system.mq.message.sms.SmsSendMessage; + +import java.util.List; +import java.util.Map; + +/** + * 短信发送 Service 接口 + * + * @author 芋道源码 + */ +public interface SmsSendService { + + /** + * 发送单条短信给管理后台的用户 + * + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(String mobile, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条短信给用户 APP 的用户 + * + * 在 mobile 为空时,使用 userId 加载对应会员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToMember(String mobile, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条短信给用户 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSms(String mobile, Long userId, Integer userType, + String templateCode, Map templateParams); + + default void sendBatchSms(List mobiles, List userIds, Integer userType, + String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + + /** + * 执行真正的短信发送 + * 注意,该方法仅仅提供给 MQ Consumer 使用 + * + * @param message 短信 + */ + void doSendSms(SmsSendMessage message); + + /** + * 接收短信的接收结果 + * + * @param channelCode 渠道编码 + * @param text 结果内容 + * @throws Throwable 处理失败时,抛出异常 + */ + void receiveSmsStatus(String channelCode, String text) throws Throwable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java new file mode 100644 index 0000000..c49189e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java @@ -0,0 +1,191 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.framework.sms.core.client.SmsClient; +import com.win.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.module.system.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.mq.message.sms.SmsSendMessage; +import com.win.module.system.mq.producer.sms.SmsProducer; +import com.win.module.system.service.member.MemberService; +import com.win.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信发送 Service 发送的实现 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SmsSendServiceImpl implements SmsSendService { + + @Resource + private AdminUserService adminUserService; + @Resource + private MemberService memberService; + @Resource + private SmsChannelService smsChannelService; + @Resource + private SmsTemplateService smsTemplateService; + @Resource + private SmsLogService smsLogService; + + @Resource + private SmsProducer smsProducer; + + @Override + @DataPermission(enable = false) // 发送短信时,无需考虑数据权限 + public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { + // 如果 mobile 为空,则加载用户编号对应的手机号 + if (StrUtil.isEmpty(mobile)) { + AdminUserDO user = adminUserService.getUser(userId); + if (user != null) { + mobile = user.getMobile(); + } + } + // 执行发送 + return sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { + // 如果 mobile 为空,则加载用户编号对应的手机号 + if (StrUtil.isEmpty(mobile)) { + mobile = memberService.getMemberUserMobile(userId); + } + // 执行发送 + return sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleSms(String mobile, Long userId, Integer userType, + String templateCode, Map templateParams) { + // 校验短信模板是否合法 + SmsTemplateDO template = validateSmsTemplate(templateCode); + // 校验短信渠道是否合法 + SmsChannelDO smsChannel = validateSmsChannel(template.getChannelId()); + + // 校验手机号码是否存在 + mobile = validateMobile(mobile); + // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 + List> newTemplateParams = buildTemplateParams(template, templateParams); + + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()) + && CommonStatusEnum.ENABLE.getStatus().equals(smsChannel.getStatus()); + String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); + Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); + + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), + template.getApiTemplateId(), newTemplateParams); + } + return sendLogId; + } + + @VisibleForTesting + SmsChannelDO validateSmsChannel(Long channelId) { + // 获得短信模板。考虑到效率,从缓存中获取 + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + // 短信模板不存在 + if (channelDO == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + return channelDO; + } + + @VisibleForTesting + SmsTemplateDO validateSmsTemplate(String templateCode) { + // 获得短信模板。考虑到效率,从缓存中获取 + SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); + // 短信模板不存在 + if (template == null) { + throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); + } + return template; + } + + /** + * 将参数模板,处理成有序的 KeyValue 数组 + *

+ * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说 腾讯云 + * + * @param template 短信模板 + * @param templateParams 原始参数 + * @return 处理后的参数 + */ + @VisibleForTesting + List> buildTemplateParams(SmsTemplateDO template, Map templateParams) { + return template.getParams().stream().map(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key); + } + return new KeyValue<>(key, value); + }).collect(Collectors.toList()); + } + + @VisibleForTesting + public String validateMobile(String mobile) { + if (StrUtil.isEmpty(mobile)) { + throw exception(SMS_SEND_MOBILE_NOT_EXISTS); + } + return mobile; + } + + @Override + public void doSendSms(SmsSendMessage message) { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsChannelService.getSmsClient(message.getChannelId()); + Assert.notNull(smsClient, "短信客户端({}) 不存在", message.getChannelId()); + // 发送短信 + try { + SmsSendRespDTO sendResponse = smsClient.sendSms(message.getLogId(), message.getMobile(), + message.getApiTemplateId(), message.getTemplateParams()); + smsLogService.updateSmsSendResult(message.getLogId(), sendResponse.getSuccess(), + sendResponse.getApiCode(), sendResponse.getApiMsg(), + sendResponse.getApiRequestId(), sendResponse.getSerialNo()); + } catch (Throwable ex) { + log.error("[doSendSms][发送短信异常,日志编号({})]", message.getLogId(), ex); + smsLogService.updateSmsSendResult(message.getLogId(), false, + "EXCEPTION", ExceptionUtil.getRootCauseMessage(ex), null, null); + } + } + + @Override + public void receiveSmsStatus(String channelCode, String text) throws Throwable { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsChannelService.getSmsClient(channelCode); + Assert.notNull(smsClient, "短信客户端({}) 不存在", channelCode); + // 解析内容 + List receiveResults = smsClient.parseSmsReceiveStatus(text); + if (CollUtil.isEmpty(receiveResults)) { + return; + } + // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), + result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java new file mode 100644 index 0000000..a127709 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java @@ -0,0 +1,82 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.win.module.system.controller.admin.sms.vo.template.SmsTemplateSaveReqVO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; + +import jakarta.validation.Valid; +import java.util.Map; + +/** + * 短信模板 Service 接口 + * + * @author zzf + * @since 2021/1/25 9:24 + */ +public interface SmsTemplateService { + + /** + * 创建短信模板 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsTemplate(@Valid SmsTemplateSaveReqVO createReqVO); + + /** + * 更新短信模板 + * + * @param updateReqVO 更新信息 + */ + void updateSmsTemplate(@Valid SmsTemplateSaveReqVO updateReqVO); + + /** + * 删除短信模板 + * + * @param id 编号 + */ + void deleteSmsTemplate(Long id); + + /** + * 获得短信模板 + * + * @param id 编号 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplate(Long id); + + /** + * 获得短信模板,从缓存中 + * + * @param code 模板编码 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplateByCodeFromCache(String code); + + /** + * 获得短信模板分页 + * + * @param pageReqVO 分页查询 + * @return 短信模板分页 + */ + PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO); + + /** + * 获得指定短信渠道下的短信模板数量 + * + * @param channelId 短信渠道编号 + * @return 数量 + */ + Long getSmsTemplateCountByChannelId(Long channelId); + + /** + * 格式化短信内容 + * + * @param content 短信模板的内容 + * @param params 内容的参数 + * @return 格式化后的内容 + */ + String formatSmsTemplateContent(String content, Map params); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java new file mode 100644 index 0000000..123392b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java @@ -0,0 +1,199 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.framework.sms.core.client.SmsClient; +import com.win.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.win.module.system.controller.admin.sms.vo.template.SmsTemplateSaveReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.dal.mysql.sms.SmsTemplateMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.regex.Pattern; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信模板 Service 实现类 + * + * @author zzf + * @since 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SmsTemplateServiceImpl implements SmsTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private SmsTemplateMapper smsTemplateMapper; + + @Resource + private SmsChannelService smsChannelService; + + @Override + public Long createSmsTemplate(SmsTemplateSaveReqVO createReqVO) { + // 校验短信渠道 + SmsChannelDO channelDO = validateSmsChannel(createReqVO.getChannelId()); + // 校验短信编码是否重复 + validateSmsTemplateCodeDuplicate(null, createReqVO.getCode()); + // 校验短信模板 + validateApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); + + // 插入 + SmsTemplateDO template = BeanUtils.toBean(createReqVO, SmsTemplateDO.class); + template.setParams(parseTemplateContentParams(template.getContent())); + template.setChannelCode(channelDO.getCode()); + smsTemplateMapper.insert(template); + // 返回 + return template.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.SMS_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 + public void updateSmsTemplate(SmsTemplateSaveReqVO updateReqVO) { + // 校验存在 + validateSmsTemplateExists(updateReqVO.getId()); + // 校验短信渠道 + SmsChannelDO channelDO = validateSmsChannel(updateReqVO.getChannelId()); + // 校验短信编码是否重复 + validateSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); + // 校验短信模板 + validateApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); + + // 更新 + SmsTemplateDO updateObj = BeanUtils.toBean(updateReqVO, SmsTemplateDO.class); + updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); + updateObj.setChannelCode(channelDO.getCode()); + smsTemplateMapper.updateById(updateObj); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.SMS_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 + public void deleteSmsTemplate(Long id) { + // 校验存在 + validateSmsTemplateExists(id); + // 更新 + smsTemplateMapper.deleteById(id); + } + + private void validateSmsTemplateExists(Long id) { + if (smsTemplateMapper.selectById(id) == null) { + throw exception(SMS_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public SmsTemplateDO getSmsTemplate(Long id) { + return smsTemplateMapper.selectById(id); + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.SMS_TEMPLATE, key = "#code", + unless = "#result == null") + public SmsTemplateDO getSmsTemplateByCodeFromCache(String code) { + return smsTemplateMapper.selectByCode(code); + } + + @Override + public PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) { + return smsTemplateMapper.selectPage(pageReqVO); + } + + @Override + public Long getSmsTemplateCountByChannelId(Long channelId) { + return smsTemplateMapper.selectCountByChannelId(channelId); + } + + @VisibleForTesting + public SmsChannelDO validateSmsChannel(Long channelId) { + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + if (channelDO == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + if (CommonStatusEnum.isDisable(channelDO.getStatus())) { + throw exception(SMS_CHANNEL_DISABLE); + } + return channelDO; + } + + @VisibleForTesting + public void validateSmsTemplateCodeDuplicate(Long id, String code) { + SmsTemplateDO template = smsTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + if (!template.getId().equals(id)) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + } + + /** + * 校验 API 短信平台的模板是否有效 + * + * @param channelId 渠道编号 + * @param apiTemplateId API 模板编号 + */ + @VisibleForTesting + void validateApiTemplate(Long channelId, String apiTemplateId) { + // 获得短信模板 + SmsClient smsClient = smsChannelService.getSmsClient(channelId); + Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId)); + SmsTemplateRespDTO template; + try { + template = smsClient.getSmsTemplate(apiTemplateId); + } catch (Throwable ex) { + throw exception(SMS_TEMPLATE_API_ERROR, ExceptionUtil.getRootCauseMessage(ex)); + } + // 校验短信模版 + if (template == null) { + throw exception(SMS_TEMPLATE_API_NOT_FOUND); + } + if (Objects.equals(template.getAuditStatus(), SmsTemplateAuditStatusEnum.CHECKING.getStatus())) { + throw exception(SMS_TEMPLATE_API_AUDIT_CHECKING); + } + if (Objects.equals(template.getAuditStatus(), SmsTemplateAuditStatusEnum.FAIL.getStatus())) { + throw exception(SMS_TEMPLATE_API_AUDIT_FAIL, template.getAuditReason()); + } + Assert.equals(template.getAuditStatus(), SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), + String.format("短信模板(%s) 审核状态(%d) 不正确", apiTemplateId, template.getAuditStatus())); + } + + @Override + public String formatSmsTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + + @VisibleForTesting + List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientService.java new file mode 100644 index 0000000..643a582 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientService.java @@ -0,0 +1,135 @@ +package com.win.module.system.service.social; + +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import com.win.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; +import com.win.module.system.dal.dataobject.social.SocialClientDO; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.xingyuv.jushauth.model.AuthUser; +import jakarta.validation.Valid; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; + +import java.util.List; + +/** + * 社交应用 Service 接口 + * + * @author 芋道源码 + */ +public interface SocialClientService { + + /** + * 获得社交平台的授权 URL + * + * @param socialType 社交平台的类型 {@link SocialTypeEnum} + * @param userType 用户类型 + * @param redirectUri 重定向 URL + * @return 社交平台的授权 URL + */ + String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri); + + /** + * 请求社交平台,获得授权的用户 + * + * @param socialType 社交平台的类型 + * @param userType 用户类型 + * @param code 授权码 + * @param state 授权 state + * @return 授权的用户 + */ + AuthUser getAuthUser(Integer socialType, Integer userType, String code, String state); + + // =================== 微信公众号独有 =================== + + /** + * 创建微信公众号的 JS SDK 初始化所需的签名 + * + * @param userType 用户类型 + * @param url 访问的 URL 地址 + * @return 签名 + */ + WxJsapiSignature createWxMpJsapiSignature(Integer userType, String url); + + // =================== 微信小程序独有 =================== + + /** + * 获得微信小程序的手机信息 + * + * @param userType 用户类型 + * @param phoneCode 手机授权码 + * @return 手机信息 + */ + WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode); + + /** + * 获得小程序二维码 + * + * @param reqVO 请求信息 + * @return 小程序二维码 + */ + byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO); + + /** + * 获得微信小程订阅模板 + * + * 缓存的目的:考虑到微信小程序订阅消息选择好模版后几乎不会变动,缓存增加查询效率 + * + * @param userType 用户类型 + * @return 微信小程订阅模板 + */ + List getSubscribeTemplateList(Integer userType); + + /** + * 发送微信小程序订阅消息 + * + * @param reqDTO 请求 + * @param templateId 模版编号 + * @param openId 会员 openId + */ + void sendSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO, String templateId, String openId); + + // =================== 客户端管理 =================== + + /** + * 创建社交客户端 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSocialClient(@Valid SocialClientSaveReqVO createReqVO); + + /** + * 更新社交客户端 + * + * @param updateReqVO 更新信息 + */ + void updateSocialClient(@Valid SocialClientSaveReqVO updateReqVO); + + /** + * 删除社交客户端 + * + * @param id 编号 + */ + void deleteSocialClient(Long id); + + /** + * 获得社交客户端 + * + * @param id 编号 + * @return 社交客户端 + */ + SocialClientDO getSocialClient(Long id); + + /** + * 获得社交客户端分页 + * + * @param pageReqVO 分页查询 + * @return 社交客户端分页 + */ + PageResult getSocialClientPage(SocialClientPageReqVO pageReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientServiceImpl.java new file mode 100644 index 0000000..fb3d49f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialClientServiceImpl.java @@ -0,0 +1,439 @@ +package com.win.module.system.service.social; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; +import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; +import cn.binarywang.wx.miniapp.constant.WxMaConstants; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.ReflectUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.enums.UserTypeEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.cache.CacheUtils; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import com.win.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; +import com.win.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; +import com.win.module.system.dal.dataobject.social.SocialClientDO; +import com.win.module.system.dal.mysql.social.SocialClientMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties; +import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.xingyuv.jushauth.config.AuthConfig; +import com.xingyuv.jushauth.model.AuthCallback; +import com.xingyuv.jushauth.model.AuthResponse; +import com.xingyuv.jushauth.model.AuthUser; +import com.xingyuv.jushauth.request.AuthRequest; +import com.xingyuv.jushauth.utils.AuthStateUtils; +import com.xingyuv.justauth.AuthRequestFactory; +import jakarta.annotation.Resource; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.MapUtils.findAndThen; +import static com.win.framework.common.util.json.JsonUtils.toJsonString; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 社交应用 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SocialClientServiceImpl implements SocialClientService { + + /** + * 小程序码要打开的小程序版本 + * + * 1. release:正式版 + * 2. trial:体验版 + * 3. developer:开发版 + */ + @Value("${win.wxa-code.env-version:release}") + public String envVersion; + /** + * 订阅消息跳转小程序类型 + * + * 1. developer:开发版 + * 2. trial:体验版 + * 3. formal:正式版 + */ + @Value("${win.wxa-subscribe-message.miniprogram-state:formal}") + public String miniprogramState; + + @Resource + private AuthRequestFactory authRequestFactory; + + @Resource + private WxMpService wxMpService; + @Resource + private WxMpProperties wxMpProperties; + @Resource + private StringRedisTemplate stringRedisTemplate; // WxMpService 需要使用到,所以在 Service 注入了它 + /** + * 缓存 WxMpService 对象 + * + * key:使用微信公众号的 appId + secret 拼接,即 {@link SocialClientDO} 的 clientId 和 clientSecret 属性。 + * 为什么 key 使用这种格式?因为 {@link SocialClientDO} 在管理后台可以变更,通过这个 key 存储它的单例。 + * + * 为什么要做 WxMpService 缓存?因为 WxMpService 构建成本比较大,所以尽量保证它是单例。 + */ + private final LoadingCache wxMpServiceCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofSeconds(10L), + new CacheLoader() { + + @Override + public WxMpService load(String key) { + String[] keys = key.split(":"); + return buildWxMpService(keys[0], keys[1]); + } + + }); + + @Resource + private WxMaService wxMaService; + @Resource + private WxMaProperties wxMaProperties; + /** + * 缓存 WxMaService 对象 + * + * 说明同 {@link #wxMpServiceCache} 变量 + */ + private final LoadingCache wxMaServiceCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofSeconds(10L), + new CacheLoader() { + + @Override + public WxMaService load(String key) { + String[] keys = key.split(":"); + return buildWxMaService(keys[0], keys[1]); + } + + }); + + @Resource + private SocialClientMapper socialClientMapper; + + @Override + public String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) { + // 获得对应的 AuthRequest 实现 + AuthRequest authRequest = buildAuthRequest(socialType, userType); + // 生成跳转地址 + String authorizeUri = authRequest.authorize(AuthStateUtils.createState()); + return HttpUtils.replaceUrlQuery(authorizeUri, "redirect_uri", redirectUri); + } + + @Override + public AuthUser getAuthUser(Integer socialType, Integer userType, String code, String state) { + // 构建请求 + AuthRequest authRequest = buildAuthRequest(socialType, userType); + AuthCallback authCallback = AuthCallback.builder().code(code).state(state).build(); + // 执行请求 + AuthResponse authResponse = authRequest.login(authCallback); + log.info("[getAuthUser][请求社交平台 type({}) request({}) response({})]", socialType, + toJsonString(authCallback), toJsonString(authResponse)); + if (!authResponse.ok()) { + throw exception(SOCIAL_USER_AUTH_FAILURE, authResponse.getMsg()); + } + return (AuthUser) authResponse.getData(); + } + + /** + * 构建 AuthRequest 对象,支持多租户配置 + * + * @param socialType 社交类型 + * @param userType 用户类型 + * @return AuthRequest 对象 + */ + @VisibleForTesting + AuthRequest buildAuthRequest(Integer socialType, Integer userType) { + // 1. 先查找默认的配置项,从 application-*.yaml 中读取 + AuthRequest request = authRequestFactory.get(SocialTypeEnum.valueOfType(socialType).getSource()); + Assert.notNull(request, String.format("社交平台(%d) 不存在", socialType)); + // 2. 查询 DB 的配置项,如果存在则进行覆盖 + SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(socialType, userType); + if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + // 2.1 构造新的 AuthConfig 对象 + AuthConfig authConfig = (AuthConfig) ReflectUtil.getFieldValue(request, "config"); + AuthConfig newAuthConfig = ReflectUtil.newInstance(authConfig.getClass()); + BeanUtil.copyProperties(authConfig, newAuthConfig); + // 2.2 修改对应的 clientId + clientSecret 密钥 + newAuthConfig.setClientId(client.getClientId()); + newAuthConfig.setClientSecret(client.getClientSecret()); + if (client.getAgentId() != null) { // 如果有 agentId 则修改 agentId + newAuthConfig.setAgentId(client.getAgentId()); + } + // 2.3 设置会 request 里,进行后续使用 + ReflectUtil.setFieldValue(request, "config", newAuthConfig); + } + return request; + } + + // =================== 微信公众号独有 =================== + + @Override + @SneakyThrows + public WxJsapiSignature createWxMpJsapiSignature(Integer userType, String url) { + WxMpService service = getWxMpService(userType); + return service.createJsapiSignature(url); + } + + /** + * 获得 clientId + clientSecret 对应的 WxMpService 对象 + * + * @param userType 用户类型 + * @return WxMpService 对象 + */ + @VisibleForTesting + WxMpService getWxMpService(Integer userType) { + // 第一步,查询 DB 的配置项,获得对应的 WxMpService 对象 + SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType( + SocialTypeEnum.WECHAT_MP.getType(), userType); + if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + return wxMpServiceCache.getUnchecked(client.getClientId() + ":" + client.getClientSecret()); + } + // 第二步,不存在 DB 配置项,则使用 application-*.yaml 对应的 WxMpService 对象 + return wxMpService; + } + + /** + * 创建 clientId + clientSecret 对应的 WxMpService 对象 + * + * @param clientId 微信公众号 appId + * @param clientSecret 微信公众号 secret + * @return WxMpService 对象 + */ + public WxMpService buildWxMpService(String clientId, String clientSecret) { + // 第一步,创建 WxMpRedisConfigImpl 对象 + WxMpRedisConfigImpl configStorage = new WxMpRedisConfigImpl( + new RedisTemplateWxRedisOps(stringRedisTemplate), + wxMpProperties.getConfigStorage().getKeyPrefix()); + configStorage.setAppId(clientId); + configStorage.setSecret(clientSecret); + + // 第二步,创建 WxMpService 对象 + WxMpService service = new WxMpServiceImpl(); + service.setWxMpConfigStorage(configStorage); + return service; + } + + // =================== 微信小程序独有 =================== + + @Override + public WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode) { + WxMaService service = getWxMaService(userType); + try { + return service.getUserService().getPhoneNoInfo(phoneCode); + } catch (WxErrorException e) { + log.error("[getPhoneNoInfo][userType({}) phoneCode({}) 获得手机号失败]", userType, phoneCode, e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR); + } + } + + @Override + public byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO) { + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + try { + return service.getQrcodeService().createWxaCodeUnlimitBytes( + ObjUtil.defaultIfEmpty(reqVO.getScene(), SocialWxQrcodeReqDTO.SCENE), + reqVO.getPath(), + ObjUtil.defaultIfNull(reqVO.getCheckPath(), SocialWxQrcodeReqDTO.CHECK_PATH), + envVersion, + ObjUtil.defaultIfNull(reqVO.getWidth(), SocialWxQrcodeReqDTO.WIDTH), + ObjUtil.defaultIfNull(reqVO.getAutoColor(), SocialWxQrcodeReqDTO.AUTO_COLOR), + null, + ObjUtil.defaultIfNull(reqVO.getHyaline(), SocialWxQrcodeReqDTO.HYALINE)); + } catch (WxErrorException e) { + log.error("[getWxQrcode][reqVO({}) 获得小程序码失败]", reqVO, e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR); + } + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.WXA_SUBSCRIBE_TEMPLATE, key = "#userType", + unless = "#result == null") + public List getSubscribeTemplateList(Integer userType) { + WxMaService service = getWxMaService(userType); + try { + WxMaSubscribeService subscribeService = service.getSubscribeService(); + return subscribeService.getTemplateList(); + } catch (WxErrorException e) { + log.error("[getSubscribeTemplate][userType({}) 获得小程序订阅消息模版]", userType, e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); + } + } + + @Override + public void sendSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) { + WxMaService service = getWxMaService(reqDTO.getUserType()); + try { + WxMaSubscribeService subscribeService = service.getSubscribeService(); + subscribeService.sendSubscribeMsg(buildMessageSendReqDTO(reqDTO, templateId, openId)); + } catch (WxErrorException e) { + log.error("[sendSubscribeMessage][reqVO({}) templateId({}) openId({}) 发送小程序订阅消息失败]", reqDTO, templateId, openId, e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR); + } + } + + /** + * 构建发送消息请求参数 + * + * @param reqDTO 请求 + * @param templateId 模版编号 + * @param openId 会员 openId + * @return 微信小程序订阅消息请求参数 + */ + private WxMaSubscribeMessage buildMessageSendReqDTO(SocialWxaSubscribeMessageSendReqDTO reqDTO, + String templateId, String openId) { + // 设置订阅消息基本参数 + WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage().setLang(WxMaConstants.MiniProgramLang.ZH_CN) + .setMiniprogramState(miniprogramState).setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); + // 设置具体消息参数 + Map messages = reqDTO.getMessages(); + if (CollUtil.isNotEmpty(messages)) { + reqDTO.getMessages().keySet().forEach(key -> findAndThen(messages, key, value -> + subscribeMessage.addData(new WxMaSubscribeMessage.MsgData(key, value)))); + } + return subscribeMessage; + } + + /** + * 获得 clientId + clientSecret 对应的 WxMpService 对象 + * + * @param userType 用户类型 + * @return WxMpService 对象 + */ + @VisibleForTesting + WxMaService getWxMaService(Integer userType) { + // 第一步,查询 DB 的配置项,获得对应的 WxMaService 对象 + SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType( + SocialTypeEnum.WECHAT_MINI_APP.getType(), userType); + if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + return wxMaServiceCache.getUnchecked(client.getClientId() + ":" + client.getClientSecret()); + } + // 第二步,不存在 DB 配置项,则使用 application-*.yaml 对应的 WxMaService 对象 + return wxMaService; + } + + /** + * 创建 clientId + clientSecret 对应的 WxMaService 对象 + * + * @param clientId 微信小程序 appId + * @param clientSecret 微信小程序 secret + * @return WxMaService 对象 + */ + private WxMaService buildWxMaService(String clientId, String clientSecret) { + // 第一步,创建 WxMaRedisBetterConfigImpl 对象 + WxMaRedisBetterConfigImpl configStorage = new WxMaRedisBetterConfigImpl( + new RedisTemplateWxRedisOps(stringRedisTemplate), + wxMaProperties.getConfigStorage().getKeyPrefix()); + configStorage.setAppid(clientId); + configStorage.setSecret(clientSecret); + + // 第二步,创建 WxMpService 对象 + WxMaService service = new WxMaServiceImpl(); + service.setWxMaConfig(configStorage); + return service; + } + + // =================== 客户端管理 =================== + + @Override + public Long createSocialClient(SocialClientSaveReqVO createReqVO) { + // 校验重复 + validateSocialClientUnique(null, createReqVO.getUserType(), createReqVO.getSocialType()); + + // 插入 + SocialClientDO client = BeanUtils.toBean(createReqVO, SocialClientDO.class); + socialClientMapper.insert(client); + return client.getId(); + } + + @Override + public void updateSocialClient(SocialClientSaveReqVO updateReqVO) { + // 校验存在 + validateSocialClientExists(updateReqVO.getId()); + // 校验重复 + validateSocialClientUnique(updateReqVO.getId(), updateReqVO.getUserType(), updateReqVO.getSocialType()); + + // 更新 + SocialClientDO updateObj = BeanUtils.toBean(updateReqVO, SocialClientDO.class); + socialClientMapper.updateById(updateObj); + } + + @Override + public void deleteSocialClient(Long id) { + // 校验存在 + validateSocialClientExists(id); + // 删除 + socialClientMapper.deleteById(id); + } + + private void validateSocialClientExists(Long id) { + if (socialClientMapper.selectById(id) == null) { + throw exception(SOCIAL_CLIENT_NOT_EXISTS); + } + } + + /** + * 校验社交应用是否重复,需要保证 userType + socialType 唯一 + * + * 原因是,不同端(userType)选择某个社交登录(socialType)时,需要通过 {@link #buildAuthRequest(Integer, Integer)} 构建对应的请求 + * + * @param id 编号 + * @param userType 用户类型 + * @param socialType 社交类型 + */ + private void validateSocialClientUnique(Long id, Integer userType, Integer socialType) { + SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType( + socialType, userType); + if (client == null) { + return; + } + if (id == null // 新增时,说明重复 + || ObjUtil.notEqual(id, client.getId())) { // 更新时,如果 id 不一致,说明重复 + throw exception(SOCIAL_CLIENT_UNIQUE); + } + } + + @Override + public SocialClientDO getSocialClient(Long id) { + return socialClientMapper.selectById(id); + } + + @Override + public PageResult getSocialClientPage(SocialClientPageReqVO pageReqVO) { + return socialClientMapper.selectPage(pageReqVO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserService.java new file mode 100644 index 0000000..183f610 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserService.java @@ -0,0 +1,90 @@ +package com.win.module.system.service.social; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.api.social.dto.SocialUserRespDTO; +import com.win.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO; +import com.win.module.system.dal.dataobject.social.SocialUserDO; +import com.win.module.system.enums.social.SocialTypeEnum; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 社交用户 Service 接口,例如说社交平台的授权登录 + * + * @author 芋道源码 + */ +public interface SocialUserService { + + /** + * 获得指定用户的社交用户列表 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @return 社交用户列表 + */ + List getSocialUserList(Long userId, Integer userType); + + /** + * 绑定社交用户 + * + * @param reqDTO 绑定信息 + * @return 社交用户 openid + */ + String bindSocialUser(@Valid SocialUserBindReqDTO reqDTO); + + /** + * 取消绑定社交用户 + * + * @param userId 用户编号 + * @param userType 全局用户类型 + * @param socialType 社交平台的类型 {@link SocialTypeEnum} + * @param openid 社交平台的 openid + */ + void unbindSocialUser(Long userId, Integer userType, Integer socialType, String openid); + + /** + * 获得社交用户,基于 userId + * + * @param userType 用户类型 + * @param userId 用户编号 + * @param socialType 社交平台的类型 + * @return 社交用户 + */ + SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType); + + /** + * 获得社交用户 + * + * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 + * + * @param userType 用户类型 + * @param socialType 社交平台的类型 + * @param code 授权码 + * @param state state + * @return 社交用户 + */ + SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state); + + // ==================== 社交用户 CRUD ==================== + + /** + * 获得社交用户 + * + * @param id 编号 + * @return 社交用户 + */ + SocialUserDO getSocialUser(Long id); + + /** + * 获得社交用户分页 + * + * @param pageReqVO 分页查询 + * @return 社交用户分页 + */ + PageResult getSocialUserPage(SocialUserPageReqVO pageReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserServiceImpl.java new file mode 100644 index 0000000..9168281 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/social/SocialUserServiceImpl.java @@ -0,0 +1,174 @@ +package com.win.module.system.service.social; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.social.dto.SocialUserBindReqDTO; +import com.win.module.system.api.social.dto.SocialUserRespDTO; +import com.win.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import com.win.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO; +import com.win.module.system.dal.dataobject.social.SocialUserBindDO; +import com.win.module.system.dal.dataobject.social.SocialUserDO; +import com.win.module.system.dal.mysql.social.SocialUserBindMapper; +import com.win.module.system.dal.mysql.social.SocialUserMapper; +import com.win.module.system.enums.social.SocialTypeEnum; +import com.xingyuv.jushauth.model.AuthUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotNull; +import java.util.Collections; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.common.util.json.JsonUtils.toJsonString; +import static com.win.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; + +/** + * 社交用户 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class SocialUserServiceImpl implements SocialUserService { + + @Resource + private SocialUserBindMapper socialUserBindMapper; + @Resource + private SocialUserMapper socialUserMapper; + + @Resource + private SocialClientService socialClientService; + + @Override + public List getSocialUserList(Long userId, Integer userType) { + // 获得绑定 + List socialUserBinds = socialUserBindMapper.selectListByUserIdAndUserType(userId, userType); + if (CollUtil.isEmpty(socialUserBinds)) { + return Collections.emptyList(); + } + // 获得社交用户 + return socialUserMapper.selectBatchIds(convertSet(socialUserBinds, SocialUserBindDO::getSocialUserId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String bindSocialUser(SocialUserBindReqDTO reqDTO) { + // 获得社交用户 + SocialUserDO socialUser = authSocialUser(reqDTO.getSocialType(), reqDTO.getUserType(), + reqDTO.getCode(), reqDTO.getState()); + Assert.notNull(socialUser, "社交用户不能为空"); + + // 社交用户可能之前绑定过别的用户,需要进行解绑 + socialUserBindMapper.deleteByUserTypeAndSocialUserId(reqDTO.getUserType(), socialUser.getId()); + + // 用户可能之前已经绑定过该社交类型,需要进行解绑 + socialUserBindMapper.deleteByUserTypeAndUserIdAndSocialType(reqDTO.getUserType(), reqDTO.getUserId(), + socialUser.getType()); + + // 绑定当前登录的社交用户 + SocialUserBindDO socialUserBind = SocialUserBindDO.builder() + .userId(reqDTO.getUserId()).userType(reqDTO.getUserType()) + .socialUserId(socialUser.getId()).socialType(socialUser.getType()).build(); + socialUserBindMapper.insert(socialUserBind); + return socialUser.getOpenid(); + } + + @Override + public void unbindSocialUser(Long userId, Integer userType, Integer socialType, String openid) { + // 获得 openid 对应的 SocialUserDO 社交用户 + SocialUserDO socialUser = socialUserMapper.selectByTypeAndOpenid(socialType, openid); + if (socialUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + + // 获得对应的社交绑定关系 + socialUserBindMapper.deleteByUserTypeAndUserIdAndSocialType(userType, userId, socialUser.getType()); + } + + @Override + public SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType) { + // 获得绑定用户 + SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserIdAndUserTypeAndSocialType(userId, userType, socialType); + if (socialUserBind == null) { + return null; + } + // 获得社交用户 + SocialUserDO socialUser = socialUserMapper.selectById(socialUserBind.getSocialUserId()); + Assert.notNull(socialUser, "社交用户不能为空"); + return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(), + socialUserBind.getUserId()); + } + + @Override + public SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state) { + // 获得社交用户 + SocialUserDO socialUser = authSocialUser(socialType, userType, code, state); + Assert.notNull(socialUser, "社交用户不能为空"); + + // 获得绑定用户 + SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(userType, + socialUser.getId()); + return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(), + socialUserBind != null ? socialUserBind.getUserId() : null); + } + + /** + * 授权获得对应的社交用户 + * 如果授权失败,则会抛出 {@link ServiceException} 异常 + * + * @param socialType 社交平台的类型 {@link SocialTypeEnum} + * @param userType 用户类型 + * @param code 授权码 + * @param state state + * @return 授权用户 + */ + @NotNull + public SocialUserDO authSocialUser(Integer socialType, Integer userType, String code, String state) { + // 优先从 DB 中获取,因为 code 有且可以使用一次。 + // 在社交登录时,当未绑定 User 时,需要绑定登录,此时需要 code 使用两次 + SocialUserDO socialUser = socialUserMapper.selectByTypeAndCodeAnState(socialType, code, state); + if (socialUser != null) { + return socialUser; + } + + // 请求获取 + AuthUser authUser = socialClientService.getAuthUser(socialType, userType, code, state); + Assert.notNull(authUser, "三方用户不能为空"); + + // 保存到 DB 中 + socialUser = socialUserMapper.selectByTypeAndOpenid(socialType, authUser.getUuid()); + if (socialUser == null) { + socialUser = new SocialUserDO(); + } + socialUser.setType(socialType).setCode(code).setState(state) // 需要保存 code + state 字段,保证后续可查询 + .setOpenid(authUser.getUuid()).setToken(authUser.getToken().getAccessToken()).setRawTokenInfo((toJsonString(authUser.getToken()))) + .setNickname(authUser.getNickname()).setAvatar(authUser.getAvatar()).setRawUserInfo(toJsonString(authUser.getRawUserInfo())); + if (socialUser.getId() == null) { + socialUserMapper.insert(socialUser); + } else { + socialUserMapper.updateById(socialUser); + } + return socialUser; + } + + // ==================== 社交用户 CRUD ==================== + + @Override + public SocialUserDO getSocialUser(Long id) { + return socialUserMapper.selectById(id); + } + + @Override + public PageResult getSocialUserPage(SocialUserPageReqVO pageReqVO) { + return socialUserMapper.selectPage(pageReqVO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java new file mode 100644 index 0000000..03c4ed4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java @@ -0,0 +1,72 @@ +package com.win.module.system.service.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.win.module.system.controller.admin.tenant.vo.packages.TenantPackageSaveReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * 租户套餐 Service 接口 + * + * @author 芋道源码 + */ +public interface TenantPackageService { + + /** + * 创建租户套餐 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTenantPackage(@Valid TenantPackageSaveReqVO createReqVO); + + /** + * 更新租户套餐 + * + * @param updateReqVO 更新信息 + */ + void updateTenantPackage(@Valid TenantPackageSaveReqVO updateReqVO); + + /** + * 删除租户套餐 + * + * @param id 编号 + */ + void deleteTenantPackage(Long id); + + /** + * 获得租户套餐 + * + * @param id 编号 + * @return 租户套餐 + */ + TenantPackageDO getTenantPackage(Long id); + + /** + * 获得租户套餐分页 + * + * @param pageReqVO 分页查询 + * @return 租户套餐分页 + */ + PageResult getTenantPackagePage(TenantPackagePageReqVO pageReqVO); + + /** + * 校验租户套餐 + * + * @param id 编号 + * @return 租户套餐 + */ + TenantPackageDO validTenantPackage(Long id); + + /** + * 获得指定状态的租户套餐列表 + * + * @param status 状态 + * @return 租户套餐 + */ + List getTenantPackageListByStatus(Integer status); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java new file mode 100644 index 0000000..a448b11 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java @@ -0,0 +1,114 @@ +package com.win.module.system.service.tenant; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.BeanUtils; +import com.win.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.win.module.system.controller.admin.tenant.vo.packages.TenantPackageSaveReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.win.module.system.dal.mysql.tenant.TenantPackageMapper; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 租户套餐 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class TenantPackageServiceImpl implements TenantPackageService { + + @Resource + private TenantPackageMapper tenantPackageMapper; + + @Resource + @Lazy // 避免循环依赖的报错 + private TenantService tenantService; + + @Override + public Long createTenantPackage(TenantPackageSaveReqVO createReqVO) { + // 插入 + TenantPackageDO tenantPackage = BeanUtils.toBean(createReqVO, TenantPackageDO.class); + tenantPackageMapper.insert(tenantPackage); + // 返回 + return tenantPackage.getId(); + } + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + public void updateTenantPackage(TenantPackageSaveReqVO updateReqVO) { + // 校验存在 + TenantPackageDO tenantPackage = validateTenantPackageExists(updateReqVO.getId()); + // 更新 + TenantPackageDO updateObj = BeanUtils.toBean(updateReqVO, TenantPackageDO.class); + tenantPackageMapper.updateById(updateObj); + // 如果菜单发生变化,则修改每个租户的菜单 + if (!CollUtil.isEqualList(tenantPackage.getMenuIds(), updateReqVO.getMenuIds())) { + List tenants = tenantService.getTenantListByPackageId(tenantPackage.getId()); + tenants.forEach(tenant -> tenantService.updateTenantRoleMenu(tenant.getId(), updateReqVO.getMenuIds())); + } + } + + @Override + public void deleteTenantPackage(Long id) { + // 校验存在 + validateTenantPackageExists(id); + // 校验正在使用 + validateTenantUsed(id); + // 删除 + tenantPackageMapper.deleteById(id); + } + + private TenantPackageDO validateTenantPackageExists(Long id) { + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(id); + if (tenantPackage == null) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + return tenantPackage; + } + + private void validateTenantUsed(Long id) { + if (tenantService.getTenantCountByPackageId(id) > 0) { + throw exception(TENANT_PACKAGE_USED); + } + } + + @Override + public TenantPackageDO getTenantPackage(Long id) { + return tenantPackageMapper.selectById(id); + } + + @Override + public PageResult getTenantPackagePage(TenantPackagePageReqVO pageReqVO) { + return tenantPackageMapper.selectPage(pageReqVO); + } + + @Override + public TenantPackageDO validTenantPackage(Long id) { + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(id); + if (tenantPackage == null) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + if (tenantPackage.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { + throw exception(TENANT_PACKAGE_DISABLE, tenantPackage.getName()); + } + return tenantPackage; + } + + @Override + public List getTenantPackageListByStatus(Integer status) { + return tenantPackageMapper.selectListByStatus(status); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java new file mode 100644 index 0000000..71f9280 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java @@ -0,0 +1,130 @@ +package com.win.module.system.service.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.service.tenant.handler.TenantInfoHandler; +import com.win.module.system.service.tenant.handler.TenantMenuHandler; + +import jakarta.validation.Valid; +import java.util.List; +import java.util.Set; + +/** + * 租户 Service 接口 + * + * @author 芋道源码 + */ +public interface TenantService { + + /** + * 创建租户 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTenant(@Valid TenantSaveReqVO createReqVO); + + /** + * 更新租户 + * + * @param updateReqVO 更新信息 + */ + void updateTenant(@Valid TenantSaveReqVO updateReqVO); + + /** + * 更新租户的角色菜单 + * + * @param tenantId 租户编号 + * @param menuIds 菜单编号数组 + */ + void updateTenantRoleMenu(Long tenantId, Set menuIds); + + /** + * 删除租户 + * + * @param id 编号 + */ + void deleteTenant(Long id); + + /** + * 获得租户 + * + * @param id 编号 + * @return 租户 + */ + TenantDO getTenant(Long id); + + /** + * 获得租户分页 + * + * @param pageReqVO 分页查询 + * @return 租户分页 + */ + PageResult getTenantPage(TenantPageReqVO pageReqVO); + + /** + * 获得名字对应的租户 + * + * @param name 租户名 + * @return 租户 + */ + TenantDO getTenantByName(String name); + + /** + * 获得域名对应的租户 + * + * @param website 域名 + * @return 租户 + */ + TenantDO getTenantByWebsite(String website); + + /** + * 获得使用指定套餐的租户数量 + * + * @param packageId 租户套餐编号 + * @return 租户数量 + */ + Long getTenantCountByPackageId(Long packageId); + + /** + * 获得使用指定套餐的租户数组 + * + * @param packageId 租户套餐编号 + * @return 租户数组 + */ + List getTenantListByPackageId(Long packageId); + + /** + * 进行租户的信息处理逻辑 + * 其中,租户编号从 {@link TenantContextHolder} 上下文中获取 + * + * @param handler 处理器 + */ + void handleTenantInfo(TenantInfoHandler handler); + + /** + * 进行租户的菜单处理逻辑 + * 其中,租户编号从 {@link TenantContextHolder} 上下文中获取 + * + * @param handler 处理器 + */ + void handleTenantMenu(TenantMenuHandler handler); + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIdList(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java new file mode 100644 index 0000000..4605c47 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java @@ -0,0 +1,306 @@ +package com.win.module.system.service.tenant; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.tenant.config.TenantProperties; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import com.win.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.win.module.system.convert.tenant.TenantConvert; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.win.module.system.dal.mysql.tenant.TenantMapper; +import com.win.module.system.enums.permission.RoleCodeEnum; +import com.win.module.system.enums.permission.RoleTypeEnum; +import com.win.module.system.service.permission.MenuService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.permission.RoleService; +import com.win.module.system.service.tenant.handler.TenantInfoHandler; +import com.win.module.system.service.tenant.handler.TenantMenuHandler; +import com.win.module.system.service.user.AdminUserService; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; +import static java.util.Collections.singleton; + +/** + * 租户 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class TenantServiceImpl implements TenantService { + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired(required = false) // 由于 win.tenant.enable 配置项,可以关闭多租户的功能,所以这里只能不强制注入 + private TenantProperties tenantProperties; + + @Resource + private TenantMapper tenantMapper; + + @Resource + private TenantPackageService tenantPackageService; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + + @Override + public List getTenantIdList() { + List tenants = tenantMapper.selectList(); + return CollectionUtils.convertList(tenants, TenantDO::getId); + } + + @Override + public void validTenant(Long id) { + TenantDO tenant = getTenant(id); + if (tenant == null) { + throw exception(TENANT_NOT_EXISTS); + } + if (tenant.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { + throw exception(TENANT_DISABLE, tenant.getName()); + } + if (DateUtils.isExpired(tenant.getExpireTime())) { + throw exception(TENANT_EXPIRE, tenant.getName()); + } + } + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + public Long createTenant(TenantSaveReqVO createReqVO) { + // 校验租户名称是否重复 + validTenantNameDuplicate(createReqVO.getName(), null); + // 校验租户域名是否重复 + validTenantWebsiteDuplicate(createReqVO.getWebsite(), null); + // 校验套餐被禁用 + TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId()); + + // 创建租户 + TenantDO tenant = BeanUtils.toBean(createReqVO, TenantDO.class); + tenantMapper.insert(tenant); + // 创建租户的管理员 + TenantUtils.execute(tenant.getId(), () -> { + // 创建角色 + Long roleId = createRole(tenantPackage); + // 创建用户,并分配角色 + Long userId = createUser(roleId, createReqVO); + // 修改租户的管理员 + tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(userId)); + }); + return tenant.getId(); + } + + private Long createUser(Long roleId, TenantSaveReqVO createReqVO) { + // 创建用户 + Long userId = userService.createUser(TenantConvert.INSTANCE.convert02(createReqVO)); + // 分配角色 + permissionService.assignUserRole(userId, singleton(roleId)); + return userId; + } + + private Long createRole(TenantPackageDO tenantPackage) { + // 创建角色 + RoleSaveReqVO reqVO = new RoleSaveReqVO(); + reqVO.setName(RoleCodeEnum.TENANT_ADMIN.getName()).setCode(RoleCodeEnum.TENANT_ADMIN.getCode()) + .setSort(0).setRemark("系统自动生成"); + Long roleId = roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType()); + // 分配权限 + permissionService.assignRoleMenu(roleId, tenantPackage.getMenuIds()); + return roleId; + } + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + public void updateTenant(TenantSaveReqVO updateReqVO) { + // 校验存在 + TenantDO tenant = validateUpdateTenant(updateReqVO.getId()); + // 校验租户名称是否重复 + validTenantNameDuplicate(updateReqVO.getName(), updateReqVO.getId()); + // 校验租户域名是否重复 + validTenantWebsiteDuplicate(updateReqVO.getWebsite(), updateReqVO.getId()); + // 校验套餐被禁用 + TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId()); + + // 更新租户 + TenantDO updateObj = BeanUtils.toBean(updateReqVO, TenantDO.class); + tenantMapper.updateById(updateObj); + // 如果套餐发生变化,则修改其角色的权限 + if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) { + updateTenantRoleMenu(tenant.getId(), tenantPackage.getMenuIds()); + } + } + + private void validTenantNameDuplicate(String name, Long id) { + TenantDO tenant = tenantMapper.selectByName(name); + if (tenant == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同名字的租户 + if (id == null) { + throw exception(TENANT_NAME_DUPLICATE, name); + } + if (!tenant.getId().equals(id)) { + throw exception(TENANT_NAME_DUPLICATE, name); + } + } + + private void validTenantWebsiteDuplicate(String website, Long id) { + if (StrUtil.isEmpty(website)) { + return; + } + TenantDO tenant = tenantMapper.selectByWebsite(website); + if (tenant == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同名字的租户 + if (id == null) { + throw exception(TENANT_WEBSITE_DUPLICATE, website); + } + if (!tenant.getId().equals(id)) { + throw exception(TENANT_WEBSITE_DUPLICATE, website); + } + } + + @Override + @DSTransactional + public void updateTenantRoleMenu(Long tenantId, Set menuIds) { + TenantUtils.execute(tenantId, () -> { + // 获得所有角色 + List roles = roleService.getRoleList(); + roles.forEach(role -> Assert.isTrue(tenantId.equals(role.getTenantId()), "角色({}/{}) 租户不匹配", + role.getId(), role.getTenantId(), tenantId)); // 兜底校验 + // 重新分配每个角色的权限 + roles.forEach(role -> { + // 如果是租户管理员,重新分配其权限为租户套餐的权限 + if (Objects.equals(role.getCode(), RoleCodeEnum.TENANT_ADMIN.getCode())) { + permissionService.assignRoleMenu(role.getId(), menuIds); + log.info("[updateTenantRoleMenu][租户管理员({}/{}) 的权限修改为({})]", role.getId(), role.getTenantId(), menuIds); + return; + } + // 如果是其他角色,则去掉超过套餐的权限 + Set roleMenuIds = permissionService.getRoleMenuListByRoleId(role.getId()); + roleMenuIds = CollUtil.intersectionDistinct(roleMenuIds, menuIds); + permissionService.assignRoleMenu(role.getId(), roleMenuIds); + log.info("[updateTenantRoleMenu][角色({}/{}) 的权限修改为({})]", role.getId(), role.getTenantId(), roleMenuIds); + }); + }); + } + + @Override + public void deleteTenant(Long id) { + // 校验存在 + validateUpdateTenant(id); + // 删除 + tenantMapper.deleteById(id); + } + + private TenantDO validateUpdateTenant(Long id) { + TenantDO tenant = tenantMapper.selectById(id); + if (tenant == null) { + throw exception(TENANT_NOT_EXISTS); + } + // 内置租户,不允许删除 + if (isSystemTenant(tenant)) { + throw exception(TENANT_CAN_NOT_UPDATE_SYSTEM); + } + return tenant; + } + + @Override + public TenantDO getTenant(Long id) { + return tenantMapper.selectById(id); + } + + @Override + public PageResult getTenantPage(TenantPageReqVO pageReqVO) { + return tenantMapper.selectPage(pageReqVO); + } + + @Override + public TenantDO getTenantByName(String name) { + return tenantMapper.selectByName(name); + } + + @Override + public TenantDO getTenantByWebsite(String website) { + return tenantMapper.selectByWebsite(website); + } + + @Override + public Long getTenantCountByPackageId(Long packageId) { + return tenantMapper.selectCountByPackageId(packageId); + } + + @Override + public List getTenantListByPackageId(Long packageId) { + return tenantMapper.selectListByPackageId(packageId); + } + + @Override + public void handleTenantInfo(TenantInfoHandler handler) { + // 如果禁用,则不执行逻辑 + if (isTenantDisable()) { + return; + } + // 获得租户 + TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId()); + // 执行处理器 + handler.handle(tenant); + } + + @Override + public void handleTenantMenu(TenantMenuHandler handler) { + // 如果禁用,则不执行逻辑 + if (isTenantDisable()) { + return; + } + // 获得租户,然后获得菜单 + TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId()); + Set menuIds; + if (isSystemTenant(tenant)) { // 系统租户,菜单是全量的 + menuIds = CollectionUtils.convertSet(menuService.getMenuList(), MenuDO::getId); + } else { + menuIds = tenantPackageService.getTenantPackage(tenant.getPackageId()).getMenuIds(); + } + // 执行处理器 + handler.handle(menuIds); + } + + private static boolean isSystemTenant(TenantDO tenant) { + return Objects.equals(tenant.getPackageId(), TenantDO.PACKAGE_ID_SYSTEM); + } + + private boolean isTenantDisable() { + return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java new file mode 100644 index 0000000..bed3017 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java @@ -0,0 +1,21 @@ +package com.win.module.system.service.tenant.handler; + +import com.win.module.system.dal.dataobject.tenant.TenantDO; + +/** + * 租户信息处理 + * 目的:尽量减少租户逻辑耦合到系统中 + * + * @author 芋道源码 + */ +public interface TenantInfoHandler { + + /** + * 基于传入的租户信息,进行相关逻辑的执行 + * 例如说,创建用户时,超过最大账户配额 + * + * @param tenant 租户信息 + */ + void handle(TenantDO tenant); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java new file mode 100644 index 0000000..999040a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java @@ -0,0 +1,21 @@ +package com.win.module.system.service.tenant.handler; + +import java.util.Set; + +/** + * 租户菜单处理 + * 目的:尽量减少租户逻辑耦合到系统中 + * + * @author 芋道源码 + */ +public interface TenantMenuHandler { + + /** + * 基于传入的租户菜单【全】列表,进行相关逻辑的执行 + * 例如说,返回可分配菜单的时候,可以移除多余的 + * + * @param menuIds 菜单列表 + */ + void handle(Set menuIds); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java new file mode 100644 index 0000000..b4873b3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java @@ -0,0 +1,219 @@ +package com.win.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.controller.admin.auth.vo.AuthRegisterReqVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.win.module.system.controller.admin.user.vo.user.UserImportRespVO; +import com.win.module.system.controller.admin.user.vo.user.UserPageReqVO; +import com.win.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import jakarta.validation.Valid; + +import java.io.InputStream; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 后台用户 Service 接口 + * + * @author 芋道源码 + */ +public interface AdminUserService { + + /** + * 创建用户 + * + * @param createReqVO 用户信息 + * @return 用户编号 + */ + Long createUser(@Valid UserSaveReqVO createReqVO); + + /** + * 注册用户 + * + * @param registerReqVO 用户信息 + * @return 用户编号 + */ + Long registerUser(@Valid AuthRegisterReqVO registerReqVO); + + /** + * 修改用户 + * + * @param updateReqVO 用户信息 + */ + void updateUser(@Valid UserSaveReqVO updateReqVO); + + /** + * 更新用户的最后登陆信息 + * + * @param id 用户编号 + * @param loginIp 登陆 IP + */ + void updateUserLogin(Long id, String loginIp); + + /** + * 修改用户个人信息 + * + * @param id 用户编号 + * @param reqVO 用户个人信息 + */ + void updateUserProfile(Long id, @Valid UserProfileUpdateReqVO reqVO); + + /** + * 修改用户个人密码 + * + * @param id 用户编号 + * @param reqVO 更新用户个人密码 + */ + void updateUserPassword(Long id, @Valid UserProfileUpdatePasswordReqVO reqVO); + + /** + * 更新用户头像 + * + * @param id 用户 id + * @param avatarFile 头像文件 + */ + String updateUserAvatar(Long id, InputStream avatarFile) throws Exception; + + /** + * 修改密码 + * + * @param id 用户编号 + * @param password 密码 + */ + void updateUserPassword(Long id, String password); + + /** + * 修改状态 + * + * @param id 用户编号 + * @param status 状态 + */ + void updateUserStatus(Long id, Integer status); + + /** + * 删除用户 + * + * @param id 用户编号 + */ + void deleteUser(Long id); + + /** + * 通过用户名查询用户 + * + * @param username 用户名 + * @return 用户对象信息 + */ + AdminUserDO getUserByUsername(String username); + + /** + * 通过手机号获取用户 + * + * @param mobile 手机号 + * @return 用户对象信息 + */ + AdminUserDO getUserByMobile(String mobile); + + /** + * 获得用户分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getUserPage(UserPageReqVO reqVO); + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserDO getUser(Long id); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUserListByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUserListByPostIds(Collection postIds); + + /** + * 获得用户列表 + * + * @param ids 用户编号数组 + * @return 用户列表 + */ + List getUserList(Collection ids); + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validateUserList(Collection ids); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getUserList(ids), AdminUserDO::getId); + } + + /** + * 获得用户列表,基于昵称模糊匹配 + * + * @param nickname 昵称 + * @return 用户列表 + */ + List getUserListByNickname(String nickname); + + /** + * 批量导入用户 + * + * @param importUsers 导入用户列表 + * @param isUpdateSupport 是否支持更新 + * @return 导入结果 + */ + UserImportRespVO importUserList(List importUsers, boolean isUpdateSupport); + + /** + * 获得指定状态的用户们 + * + * @param status 状态 + * @return 用户们 + */ + List getUserListByStatus(Integer status); + + /** + * 判断密码是否匹配 + * + * @param rawPassword 未加密的密码 + * @param encodedPassword 加密后的密码 + * @return 是否匹配 + */ + boolean isPasswordMatch(String rawPassword, String encodedPassword); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java new file mode 100644 index 0000000..0a6fd6d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java @@ -0,0 +1,527 @@ +package com.win.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.object.BeanUtils; +import com.win.framework.common.util.validation.ValidationUtils; +import com.win.framework.datapermission.core.util.DataPermissionUtils; +import com.win.module.infra.api.config.ConfigApi; +import com.win.module.infra.api.file.FileApi; +import com.win.module.system.controller.admin.auth.vo.AuthRegisterReqVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.win.module.system.controller.admin.user.vo.user.UserImportRespVO; +import com.win.module.system.controller.admin.user.vo.user.UserPageReqVO; +import com.win.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.UserPostDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.dept.UserPostMapper; +import com.win.module.system.dal.mysql.user.AdminUserMapper; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.dept.PostService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.tenant.TenantService; +import com.google.common.annotations.VisibleForTesting; +import com.mzt.logapi.context.LogRecordContext; +import com.mzt.logapi.service.impl.DiffParseFunction; +import com.mzt.logapi.starter.annotation.LogRecord; +import jakarta.annotation.Resource; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.system.enums.ErrorCodeConstants.*; +import static com.win.module.system.enums.LogRecordConstants.*; + +/** + * 后台用户 Service 实现类 + * + * @author 芋道源码 + */ +@Service("adminUserService") +@Slf4j +public class AdminUserServiceImpl implements AdminUserService { + + static final String USER_INIT_PASSWORD_KEY = "system.user.init-password"; + + @Resource + private AdminUserMapper userMapper; + + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private PasswordEncoder passwordEncoder; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Resource + private UserPostMapper userPostMapper; + + @Resource + private FileApi fileApi; + @Resource + private ConfigApi configApi; + + @Override + @Transactional(rollbackFor = Exception.class) + @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}", + success = SYSTEM_USER_CREATE_SUCCESS) + public Long createUser(UserSaveReqVO createReqVO) { + // 1.1 校验账户配合 + tenantService.handleTenantInfo(tenant -> { + long count = userMapper.selectCount(); + if (count >= tenant.getAccountCount()) { + throw exception(USER_COUNT_MAX, tenant.getAccountCount()); + } + }); + // 1.2 校验正确性 + validateUserForCreateOrUpdate(null, createReqVO.getUsername(), + createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds()); + // 2.1 插入用户 + AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码 + userMapper.insert(user); + // 2.2 插入关联岗位 + if (CollectionUtil.isNotEmpty(user.getPostIds())) { + userPostMapper.insertBatch(convertList(user.getPostIds(), + postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId))); + } + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("user", user); + return user.getId(); + } + + @Override + public Long registerUser(AuthRegisterReqVO registerReqVO) { + // 1.1 校验账户配合 + tenantService.handleTenantInfo(tenant -> { + long count = userMapper.selectCount(); + if (count >= tenant.getAccountCount()) { + throw exception(USER_COUNT_MAX, tenant.getAccountCount()); + } + }); + // 1.2 校验正确性 + validateUserForCreateOrUpdate(null, registerReqVO.getUsername(), null, null, null, null); + + // 2. 插入用户 + AdminUserDO user = BeanUtils.toBean(registerReqVO, AdminUserDO.class); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword(registerReqVO.getPassword())); // 加密密码 + userMapper.insert(user); + return user.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", + success = SYSTEM_USER_UPDATE_SUCCESS) + public void updateUser(UserSaveReqVO updateReqVO) { + updateReqVO.setPassword(null); // 特殊:此处不更新密码 + // 1. 校验正确性 + AdminUserDO oldUser = validateUserForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getUsername(), + updateReqVO.getMobile(), updateReqVO.getEmail(), updateReqVO.getDeptId(), updateReqVO.getPostIds()); + + // 2.1 更新用户 + AdminUserDO updateObj = BeanUtils.toBean(updateReqVO, AdminUserDO.class); + userMapper.updateById(updateObj); + // 2.2 更新岗位 + updateUserPost(updateReqVO, updateObj); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldUser, UserSaveReqVO.class)); + LogRecordContext.putVariable("user", oldUser); + } + + private void updateUserPost(UserSaveReqVO reqVO, AdminUserDO updateObj) { + Long userId = reqVO.getId(); + Set dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId); + // 计算新增和删除的岗位编号 + Set postIds = CollUtil.emptyIfNull(updateObj.getPostIds()); + Collection createPostIds = CollUtil.subtract(postIds, dbPostIds); + Collection deletePostIds = CollUtil.subtract(dbPostIds, postIds); + // 执行新增和删除。对于已经授权的岗位,不用做任何处理 + if (!CollectionUtil.isEmpty(createPostIds)) { + userPostMapper.insertBatch(convertList(createPostIds, + postId -> new UserPostDO().setUserId(userId).setPostId(postId))); + } + if (!CollectionUtil.isEmpty(deletePostIds)) { + userPostMapper.deleteByUserIdAndPostId(userId, deletePostIds); + } + } + + @Override + public void updateUserLogin(Long id, String loginIp) { + userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(LocalDateTime.now())); + } + + @Override + public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) { + // 校验正确性 + validateUserExists(id); + validateEmailUnique(id, reqVO.getEmail()); + validateMobileUnique(id, reqVO.getMobile()); + // 执行更新 + userMapper.updateById(BeanUtils.toBean(reqVO, AdminUserDO.class).setId(id)); + } + + @Override + public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) { + // 校验旧密码密码 + validateOldPassword(id, reqVO.getOldPassword()); + // 执行更新 + AdminUserDO updateObj = new AdminUserDO().setId(id); + updateObj.setPassword(encodePassword(reqVO.getNewPassword())); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public String updateUserAvatar(Long id, InputStream avatarFile) { + validateUserExists(id); + // 存储文件 + String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile)); + // 更新路径 + AdminUserDO sysUserDO = new AdminUserDO(); + sysUserDO.setId(id); + sysUserDO.setAvatar(avatar); + userMapper.updateById(sysUserDO); + return avatar; + } + + @Override + @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE, bizNo = "{{#id}}", + success = SYSTEM_USER_UPDATE_PASSWORD_SUCCESS) + public void updateUserPassword(Long id, String password) { + // 1. 校验用户存在 + AdminUserDO user = validateUserExists(id); + + // 2. 更新密码 + AdminUserDO updateObj = new AdminUserDO(); + updateObj.setId(id); + updateObj.setPassword(encodePassword(password)); // 加密密码 + userMapper.updateById(updateObj); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("user", user); + LogRecordContext.putVariable("newPassword", updateObj.getPassword()); + } + + @Override + public void updateUserStatus(Long id, Integer status) { + // 校验用户存在 + validateUserExists(id); + // 更新状态 + AdminUserDO updateObj = new AdminUserDO(); + updateObj.setId(id); + updateObj.setStatus(status); + userMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_DELETE_SUB_TYPE, bizNo = "{{#id}}", + success = SYSTEM_USER_DELETE_SUCCESS) + public void deleteUser(Long id) { + // 1. 校验用户存在 + AdminUserDO user = validateUserExists(id); + + // 2.1 删除用户 + userMapper.deleteById(id); + // 2.2 删除用户关联数据 + permissionService.processUserDeleted(id); + // 2.2 删除用户岗位 + userPostMapper.deleteByUserId(id); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("user", user); + } + + @Override + public AdminUserDO getUserByUsername(String username) { + return userMapper.selectByUsername(username); + } + + @Override + public AdminUserDO getUserByMobile(String mobile) { + return userMapper.selectByMobile(mobile); + } + + @Override + public PageResult getUserPage(UserPageReqVO reqVO) { + return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId())); + } + + @Override + public AdminUserDO getUser(Long id) { + return userMapper.selectById(id); + } + + @Override + public List getUserListByDeptIds(Collection deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyList(); + } + return userMapper.selectListByDeptIds(deptIds); + } + + @Override + public List getUserListByPostIds(Collection postIds) { + if (CollUtil.isEmpty(postIds)) { + return Collections.emptyList(); + } + Set userIds = convertSet(userPostMapper.selectListByPostIds(postIds), UserPostDO::getUserId); + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(userIds); + } + + @Override + public List getUserList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(ids); + } + + @Override + public void validateUserList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List users = userMapper.selectBatchIds(ids); + Map userMap = CollectionUtils.convertMap(users, AdminUserDO::getId); + // 校验 + ids.forEach(id -> { + AdminUserDO user = userMap.get(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { + throw exception(USER_IS_DISABLE, user.getNickname()); + } + }); + } + + @Override + public List getUserListByNickname(String nickname) { + return userMapper.selectListByNickname(nickname); + } + + /** + * 获得部门条件:查询指定部门的子部门编号们,包括自身 + * + * @param deptId 部门编号 + * @return 部门编号集合 + */ + private Set getDeptCondition(Long deptId) { + if (deptId == null) { + return Collections.emptySet(); + } + Set deptIds = convertSet(deptService.getChildDeptList(deptId), DeptDO::getId); + deptIds.add(deptId); // 包括自身 + return deptIds; + } + + private AdminUserDO validateUserForCreateOrUpdate(Long id, String username, String mobile, String email, + Long deptId, Set postIds) { + // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 + return DataPermissionUtils.executeIgnore(() -> { + // 校验用户存在 + AdminUserDO user = validateUserExists(id); + // 校验用户名唯一 + validateUsernameUnique(id, username); + // 校验手机号唯一 + validateMobileUnique(id, mobile); + // 校验邮箱唯一 + validateEmailUnique(id, email); + // 校验部门处于开启状态 + deptService.validateDeptList(CollectionUtils.singleton(deptId)); + // 校验岗位处于开启状态 + postService.validatePostList(postIds); + return user; + }); + } + + @VisibleForTesting + AdminUserDO validateUserExists(Long id) { + if (id == null) { + return null; + } + AdminUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + return user; + } + + @VisibleForTesting + void validateUsernameUnique(Long id, String username) { + if (StrUtil.isBlank(username)) { + return; + } + AdminUserDO user = userMapper.selectByUsername(username); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_USERNAME_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_USERNAME_EXISTS); + } + } + + @VisibleForTesting + void validateEmailUnique(Long id, String email) { + if (StrUtil.isBlank(email)) { + return; + } + AdminUserDO user = userMapper.selectByEmail(email); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_EMAIL_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_EMAIL_EXISTS); + } + } + + @VisibleForTesting + void validateMobileUnique(Long id, String mobile) { + if (StrUtil.isBlank(mobile)) { + return; + } + AdminUserDO user = userMapper.selectByMobile(mobile); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_MOBILE_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_MOBILE_EXISTS); + } + } + + /** + * 校验旧密码 + * @param id 用户 id + * @param oldPassword 旧密码 + */ + @VisibleForTesting + void validateOldPassword(Long id, String oldPassword) { + AdminUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!isPasswordMatch(oldPassword, user.getPassword())) { + throw exception(USER_PASSWORD_FAILED); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public UserImportRespVO importUserList(List importUsers, boolean isUpdateSupport) { + // 1.1 参数校验 + if (CollUtil.isEmpty(importUsers)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + // 1.2 初始化密码不能为空 + String initPassword = configApi.getConfigValueByKey(USER_INIT_PASSWORD_KEY); + if (StrUtil.isEmpty(initPassword)) { + throw exception(USER_IMPORT_INIT_PASSWORD); + } + + // 2. 遍历,逐个创建 or 更新 + UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>()) + .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); + importUsers.forEach(importUser -> { + // 2.1.1 校验字段是否符合要求 + try { + ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword)); + } catch (ConstraintViolationException ex){ + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); + return; + } + // 2.1.2 校验,判断是否有不符合的原因 + try { + validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), + importUser.getDeptId(), null); + } catch (ServiceException ex) { + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); + return; + } + + // 2.2.1 判断如果不存在,在进行插入 + AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); + if (existUser == null) { + userMapper.insert(BeanUtils.toBean(importUser, AdminUserDO.class) + .setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>())); // 设置默认密码及空岗位编号数组 + respVO.getCreateUsernames().add(importUser.getUsername()); + return; + } + // 2.2.2 如果存在,判断是否允许更新 + if (!isUpdateSupport) { + respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); + return; + } + AdminUserDO updateUser = BeanUtils.toBean(importUser, AdminUserDO.class); + updateUser.setId(existUser.getId()); + userMapper.updateById(updateUser); + respVO.getUpdateUsernames().add(importUser.getUsername()); + }); + return respVO; + } + + @Override + public List getUserListByStatus(Integer status) { + return userMapper.selectListByStatus(status); + } + + @Override + public boolean isPasswordMatch(String rawPassword, String encodedPassword) { + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 对密码进行加密 + * + * @param password 密码 + * @return 加密后的密码 + */ + private String encodePassword(String password) { + return passwordEncoder.encode(password); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java new file mode 100644 index 0000000..1d0c5ed --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java @@ -0,0 +1,103 @@ +package com.win.module.system.util.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.security.core.util.SecurityFrameworkUtils; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * OAuth2 相关的工具类 + * + * @author 芋道源码 + */ +public class OAuth2Utils { + + /** + * 构建授权码模式下,重定向的 URI + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 getSuccessfulRedirect 方法 + * + * @param redirectUri 重定向 URI + * @param authorizationCode 授权码 + * @param state 状态 + * @return 授权码模式下的重定向 URI + */ + public static String buildAuthorizationCodeRedirectUri(String redirectUri, String authorizationCode, String state) { + Map query = new LinkedHashMap<>(); + query.put("code", authorizationCode); + if (state != null) { + query.put("state", state); + } + return HttpUtils.append(redirectUri, query, null, false); + } + + /** + * 构建简化模式下,重定向的 URI + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 appendAccessToken 方法 + * + * @param redirectUri 重定向 URI + * @param accessToken 访问令牌 + * @param state 状态 + * @param expireTime 过期时间 + * @param scopes 授权范围 + * @param additionalInformation 附加信息 + * @return 简化授权模式下的重定向 URI + */ + public static String buildImplicitRedirectUri(String redirectUri, String accessToken, String state, LocalDateTime expireTime, + Collection scopes, Map additionalInformation) { + Map vars = new LinkedHashMap(); + Map keys = new HashMap(); + vars.put("access_token", accessToken); + vars.put("token_type", SecurityFrameworkUtils.AUTHORIZATION_BEARER.toLowerCase()); + if (state != null) { + vars.put("state", state); + } + if (expireTime != null) { + vars.put("expires_in", getExpiresIn(expireTime)); + } + if (CollUtil.isNotEmpty(scopes)) { + vars.put("scope", buildScopeStr(scopes)); + } + if (CollUtil.isNotEmpty(additionalInformation)) { + for (String key : additionalInformation.keySet()) { + Object value = additionalInformation.get(key); + if (value != null) { + keys.put("extra_" + key, key); + vars.put("extra_" + key, value); + } + } + } + // Do not include the refresh token (even if there is one) + return HttpUtils.append(redirectUri, vars, keys, true); + } + + public static String buildUnsuccessfulRedirect(String redirectUri, String responseType, String state, + String error, String description) { + Map query = new LinkedHashMap(); + query.put("error", error); + query.put("error_description", description); + if (state != null) { + query.put("state", state); + } + return HttpUtils.append(redirectUri, query, null, !responseType.contains("code")); + } + + public static long getExpiresIn(LocalDateTime expireTime) { + return LocalDateTimeUtil.between(LocalDateTime.now(), expireTime, ChronoUnit.SECONDS); + } + + public static String buildScopeStr(Collection scopes) { + return CollUtil.join(scopes, " "); + } + + public static List buildScopes(String scope) { + return StrUtil.split(scope, ' '); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java new file mode 100644 index 0000000..e40187a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java @@ -0,0 +1,4 @@ +/** + * 每个模块的 util 包,放专属当前模块的 Utils 工具类 + */ +package com.win.module.system.util; diff --git a/win-module-system/win-module-system-biz/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService b/win-module-system/win-module-system-biz/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService new file mode 100644 index 0000000..5a16963 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaCacheService @@ -0,0 +1 @@ +com.win.module.system.framework.captcha.core.RedisCaptchaServiceImpl diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg1.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg1.png new file mode 100644 index 0000000000000000000000000000000000000000..c48145769d24b7df079039dd3ffd3ab86d8cd743 GIT binary patch literal 17827 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 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg3.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg3.png new file mode 100644 index 0000000000000000000000000000000000000000..f871d3d1282318eb8e5c784f7d5c8606ff22e16b GIT binary patch literal 25814 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

onDw48Xd2Y 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

%*OsvMc#btmp6<9Y`Cx*|=ZX5v|g|d5U>f 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 bKJWhnL=8P@ya`>$00000NkvXXu0mjf!i)#m literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg6.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg6.png new file mode 100644 index 0000000000000000000000000000000000000000..5024ceb2295ae68930dd6d1186a446f15d837dbf GIT binary patch literal 19160 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

S>ebBc{*9*Qx;q03YDm_y*;w1t7ZMelU4@B> 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 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg8.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg8.png new file mode 100644 index 0000000000000000000000000000000000000000..2727aa32416cfcc9d40209d5907f4297d3f8101d GIT binary patch literal 30332 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 z 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 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg9.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/original/bg9.png new file mode 100644 index 0000000000000000000000000000000000000000..4463aa2fbd82ee4ae7c3129e6c5f9b36aab05843 GIT binary patch literal 26977 zcmV(>K-j;DP)Px%vQSJ^Mf>~x{{GMN`27FGSB<>ipzk%;E0-=1%v?^xWCvwB_;b$mPD= z?bXxU``S_8%;DzF#Hr-({@OnH)MxX?x$?a3>d%y&9ncFzsK#V%K5uJ(X+|@ye5Xx&aAfAtenQI!lSv*=&(bSyWr`P)aRMB@sYXvsUl+0$ZMmBiLbkMi!`gx%WZvS zt6Pp^d!_eH3ZYk?w^4bvQf8lKIf-D2iDYZfNJE}de7Q?fZEAT|Zk>-`NS#t<=r%E} zNNwXi7Nt;9YGIL*N{*~VUD!1=cvy6RR#~7yT(mqvOJR}2Gcs0Mf}lN7gHbYsL4lD# zV@ho^&nqWjR%?+zRi8r}r8hlmPgs;WOtUR7LQ;XgB_n%0S&BACcQ6=1FaPoTumI%Z z_uv2cV|h(u@QH?lf+(t{S-V5 zn+0lw4Q>c*@Qvk3WQxYAhTxlEbGS9qw&AS=dV2c$2I61us9VE674C%MpA_W(m9||t zlj7R8=!-67PBk`Bsd(8*?c0AI_T~lwjfBhRC)As4GX$*(Xe?WGNwwBI4;zM!bnVGg z#7yDXx{Z^nO|fyP;d_M5K~fbMf1R>j^*D0S)ARf`Hc5K%{uoMA?%h)+|Ao0O=AMbh zCzqLY?b*j{m!d(o6PlX`#7O+eBeKl2K2M7VwGxE7p=v-|U#D<3%f|APCuTNqqjkfS zGHTAez@Lfe);6|=#z4-&)A6ME-yS@8;NU^ljfzG^H|)znE~sj36PSFD3UNFCIfujf{3>N@pl-$cV{5scjw$_me`YjQk}8nxl5&YOpCyxE z65=tJj{NY03)Jl37Rk}Csu?RGNkQzLY-410n z=~0YZak8Ym{QC86Y_4dh{^7yp!;8=L_6q`ALWga6h?

P_nG7677>^8kTLjOJ%~4 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 Ef@c&sNB{r; literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/1.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ef11324711466f3bf9d4612706c265ceb8923f91 GIT binary patch literal 2158 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 DzyN!j literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/11.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/11.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b1da8d7408e930742b7a5026b399080b7f358e GIT binary patch literal 1657 zcmV-<28Q{GP)Px%sZdN*MF0Q*|Nj7hfB>qhRhi5Hwzedak|b4C9GRIKv9Tv&PCIRF65-(qFjfxwJ zjS@sb6@-KumzoJ$S_y7w1A1~EeuNl)c@TnqAd!|BkB1+Eg%D+96dLBSP3vFu~ZfXo+VHHqN0%&LyaBd82Y8-QO6L4}1 zX=@#4XChcw0!&R2V`m6bP!={X320{ySy}>HT?t@h5MyErTU!=mWfE6h16f!TP*D;~ zPYO;>3P(l_JUJ6EEDJHaHJ6G7mU65iv0dH8vS5D*-+}3^q0j zD=ZBwECVPh6*)NzFD?`y9Thn_4lphb5)cYBGYlOY0x>ZYCnyUqEe<9m3Ktj(J39;} zCK4nf2`eiJBqj$R9|a~Q6eA)7CngCYAO#y61t1;=9v=rE9|RK-3LPB_85js08wwj7 z1r`+t9v%oB83`8`2oe+n5fKFp3<47q2n-AZ3kv`X3k44k2M!Jc2nPcQ2m=fa0|WyB z2nGrW2m%8G0|*EP1_lTQ1_TEN0RsaA3=9Sd2?GWN1O){G0|Np90R#X6000040RRC2 z00RL40000200031005-kA#DHv0M&F-PE!B@0s{pH2MG!d4Gs|z5)u;>6crX07Z(>9 z8XX-UAtEIuEG;iEF)=eWH8wmxKtMo4MMXzPN=r;lPESx!QB+h_RaRG6SY2LUUtnQk zVq#)sW^8V8adLHbcXxVwdwhL>fQ5#JhK7fTiHVSqk(8B{n3$cNpP`|lp`xOvr>Lu| ztE;WEw6wOjxVX5uxw*W&zQ4b~!olt+>FMk2?d|aJ^7Hfb_V@Yu`uqF*{r&#_{{H?t@srp900Ny!L_t(|+U?Z!Q&m9} z!105iVke5-ii+Lc-Q9`Zo!H%7*xd+rpol?~^dlnkAm2Wvc#dPY?#JGA= z-}x7LoO*$#7%%m^(PLP|Osq15g-fOWE(*iSBf}(Cpg?oA)bB$fOk~4im1UqW#|=f?|;KMK4T0+M#`GoB4zr0j3-?G~p~QT(mTj_)^=T8}13w#-ngESY4mMbq?O*j9FxFN389eny00000NkvXXu0mjf Dx%6sf literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/12.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/12.png new file mode 100644 index 0000000000000000000000000000000000000000..07e7313b4f2692bd7f10ea3c0281666fcde99df0 GIT binary patch literal 1657 zcmV-<28Q{GP)Px%sZdN*MF0Q*|Nj7hfB>qhRhi5Hwzedak|b4C9GRIKv9Tv&PCIRF65-(qFjfxwJ zjS@sb6@-KumzoJ$S_y7w1A1~EeuNl)c@TnqAd!|BkB1+Eg%D+96dLBSP3vFu~ZfXo+VHHqN0%&LyaBd82Y8-QO6L4}1 zX=@#4XChcw0!&R2V`m6bP!={X320{ySy}>HT?t@h5MyErTU!=mWfE6h16f!TP*D;~ zPYO;>3P(l_JUJ6EEDJHaHJ6G7mU65iv0dH8vS5D*-+}3^q0j zD=ZBwECVPh6*)NzFD?`y9Thn_4lphb5)cYBGYlOY0x>ZYCnyUqEe<9m3Ktj(J39;} zCK4nf2`eiJBqj$R9|a~Q6eA)7CngCYAO#y61t1;=9v=rE9|RK-3LPB_85js08wwj7 z1r`+t9v%oB83`8`2oe+n5fKFp3<47q2n-AZ3kv`X3k44k2M!Jc2nPcQ2m=fa0|WyB z2nGrW2m%8G0|*EP1_lTQ1_TEN0RsaA3=9Sd2?GWN1O){G0|Np90R#X6000040RRC2 z00RL40000200031005-kA#DHv0M&F-PE!B@0s{pH2MG!d4Gs|z5)u;>6crX07Z(>9 z8XX-UAtEIuEG;iEF)=eWH8wmxKtMo4MMXzPN=r;lPESx!QB+h_RaRG6SY2LUUtnQk zVq#)sW^8V8adLHbcXxVwdwhL>fQ5#JhK7fTiHVSqk(8B{n3$cNpP`|lp`xOvr>Lu| ztE;WEw6wOjxVX5uxw*W&zQ4b~!olt+>FMk2?d|aJ^7Hfb_V@Yu`uqF*{r&#_{{H?t@srp900Ny!L_t(|+U?Z!Q&m9} z!105iVke5-ii+Lc-Q9`Zo!H%7*xd+rpol?;CpBWcXZTAVMS+tDViiSK zuK>2nK1Eg;-=91e0lwdQ#u{7kQj| zfuT+b4PWv;I*y21i*9L+txEw&&6PYY=XSq$hR2l5dauG^7vf+;3T*-bw z@xmtpgkelvY=}DnnS9fqyw9lj&hdn4>AHR70 z%9&f~gfHh$8Cwf{8IXfC7mAiI9?;+ung_w3{+aZnhj&%@G2$-pr$ZVh)CRAe0yly` z;VF10e^{n6t^|J?CW`g>%hn!T0RB|_Or!FbRo~)7@GUTGYdXy<0$$DH=;6Q;;6u=w zY;xy(XaZh)vNJ97ek0H{P17_@(=<)fG)>bq?f>u_{N7dj1p`@~00000NkvXXu0mjf DY?EtS literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/13.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/13.png new file mode 100644 index 0000000000000000000000000000000000000000..82c3dd969a5556d8933d3416fd07e720134d87b5 GIT binary patch literal 1873 zcmYk6c|6qX7ssFZ&OVG0GmK>hgAthwGG!UA?Ml}YHHsoaWgD)&abuG0UgV}ljL2Rp z2_=*tmr+q9;Yv|bp~Y5NGWvbJe*gSFuXE1(dCobn^ZavO&!4+p9Eb#E0sw&MxYN!Z zrUC3C91@P=QX>frM3lRO4XEi=ody7^+wHX19!~!J`9I@TSMzv0ke_cnI_j94s|6qW z`xQ%@6lZ4i!ouWQsu|<6>Vt#4d-nib?eEv@9}N?UKvTP>>#z8nJmAa&LLoSH3KW!V zZtcWIg@Lk54jCC5x0}7Xy3}$~9WGbUck>8YCw4yVQLU}r+ISD|$)mJ&(uxYG4z8rT zclGOP_Hir-u|mVlbk}PQ)FP4Q#VpS4R&rH2tFYKOE>88iinhT-AN1y!3Bn@A3JP#j1L|2rR`u!`}@#%9`YVu z$iqh|9v)b_4ARpReZY(E=1g~US8%YU?A(cTu*W+(AzfYcxm>EfqueiCqNyo;n?B0g z7GrC#W^YISWtWPL4P<5kak&^vE0Wm`S&ly0bQ{&k2w}WKaXSZTz^1UZ6j&^(z5!lC z3t?`7*VP7021ZYttj)w}YN1t>&{|s3bTtxPk)*Q)QlOAjRk4cHO=L1bPF9Ahgr!ih zBobCtg{+}Nkd{WOF$iP|UXhHFCJ>2I0FNhNFa#_HDMLcxP&hOO!Xhy!2&t@s+q4M~ ziI5bIfX71s2arf23W>%d&}ayt5omxy0Jsz20fa|F2na$#Kng;jkpPPVC;*`VkU>E3 z3c@Z0UjR%14}v!p2Q~^=2p|B!Y=n(jhz)KuZSWq)Pq2Y#cb7eIGZG0uj3r1(Nz0IA z<>V;}s;V@ax&}j=siS9Lz&128Ha6jGH?`ne+5P6^hm$7`XoJ2O(R>~Bk>ZHaa39BbKs z*j7w$$+*w>K32=v>;^%Mf0zf3d<=*?59;`?yb0 zozt0H?+5fNMG3r?J_H&BQ86S&lw!30~v+p-4o(fJJ7!SIv zpw6Jt5|bW%y3?8X$m52GU%}Sl9VHiR5Y&DOt|7q>gaI&eZkx6Jck$WzFJ$abALPCB0u)jayHwAHD|y9nBUKMWtN3s33R|2j{pSJ`c0GzskWq5ST1bzGeV^cOq)jwy zXr)Zarf}2Mm)0ot6?RpU^6D&E`gFUViIHtMT}%AUThgn*duL{sz%A|pF<)H&m9(*A zPGWqm%Z~~wb}N?@ix*ByafCt2zrIdLu@~e%(bW`N`Ab?278^p9{+dm&OzU0=uB;yB zh*!(jBNig>SFX^P*yW0ip)scXjBgM4rw;ot=??7pf3fX-eHK5)baKSQhaON~-Ql`i z@{0bs{IO|(WEmj1Zsn`pTu=%cg?55sl{l9(a$hZy3-oh5vqogS)t)OJVSWp9Na{GF zOYm#x?I?Qq^_u3{st=R<)?=JS?ArK-2j3Pe?7}2cK5OX-t$l2i!g!+FHUIII-PWuo z!aKh{Vyh%=tL});%?e_lN!j9Cy}!LIZU+|AtURc0-3!lYtkp+*!pE~7$CNF8+8#es z)H|sbJ>zW<_Fm?4y2ilQxk3Ntv#U*q=GrPSmvc0V46xI@?Mt1DHR7v65AWdmBWfv& zH}i!bbEF$ME|KRFmUE{v%%TwRd!_5+xQi493&sT5h zD>N=^Y-|ZxSY{bkw8V8iUSF3i6%A?QlhtwmXKS--*cTZKHLTQ>^Bez+qrHn=jg4>e Fe*w(B1^oa3 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/14.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/14.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9a866151e0c86e3415a8ba2d21f9d4a0586436 GIT binary patch literal 1872 zcmX9;dpwkB8-C_}XUxHjk!F}>W@N@Ghjkcd#)iZs=SB{#5Gy-5gjkb?PiP7$l*5E5 zirQK9MNZKHEtOQZMG;#W6zQZ@lkfHWuHSXv*YiC0^}C;c?&mq?_tl!q5kV#Sxj6&r1Ns~QP>auwovz5?+S>ogZ*1iA`JlXsm)}f4^p7j@!99rVpQxf7t!u5WT7C$F?qf5TDw6hf!5QbMq!& zzi!kb-DTxKNXazIJL-M;zqBd|yDZ=8+6~IZ3&v-wIjO1i=4ONXKQ>4&@hT;}#6G{+dqWxgfQw^Fuj*Kl@*>>MC2SHbZovYm~xl@Z0(f@W@x;@GHJTfru#R8wtLV`G|;30_MZ zW$%FBtOIme3I;k99bFt-8>8_9Mq8W6)Fd<2$a;p5DwRy9W7TLIC=`Ng%!{ctgeCEumO-r zkRpzN$3p-IV3>r4F<2A^0|5*Q1JEddH~}6&co;%K5DWoD2!(+G77fqjL;=zWnN%EDFJK{n0zhFst@lE$>$+)OyR5>6>yqr}<&T(Q7`YfrP*fx;k(E_8 zQdQ}624j;JOGj7Fz{JGV%$&oqw6eB!;QqALW5*6JU;eJ3U<4t%Lqo&D!uLi+MeP&B z#U&;sr=+H(r3n#;GBUGr#K-gU3yO-1OU|4rEiEgrs;RwDU*FIuZEm^N*4Ey6TT>kz0`Jc^h7Lw;F^O#LNg>B*t$a{J+xgb%;=bFR+5w4D7Ox;Fcu(sr1; zO9kzuj4-?MQFxnU_qS#LalOE{YWd=&aN1?n6t64QD{w>??3r7# z@KIDgbwa79Co&}@q9^ilz-3d=DFR@dqnnI;26dWxy&t zg*kZh;g)KO^@@OaGRyjmp{4rRm4&otaiWZ%hUJgX@$vhrSNbbzuJ!DHB975GF>75u z_@y{!yJ=TK5yg7p+t6_58~?~w|F(qPz0Y+Yn|*2F)uJB{nY4!3NYjV-ds#Fx6*O(~M}ZFk)A=An8%z#nd(hX?+w>F>OE6?8+*0R*rrmL1X#Q*fQ?Rhf)cdFw~ z9}lT>+TTe>;(Ka5wzobN#N1B0FZ*_#a6#2Ob}V|Jkh-m;#o?e^p6LCP32S!JbD6_e zQdP%A&cE17;ZqMuJ1h&oYr#$bRJM3Qw5aBg(14Qd70(Vi2}kd9m%9W949@XO$FGcG zr@skwU#w=cdlul$cPH+(#yX2hc3SsdUnx1*jv4zpBfo$V+-x~Er{8h*$NbYR6}v3u z+oal0^Y8ilJ>yMjd{c~NT)Uo}|TdJX>P(Cd=F~toZU-jym zALPv5lOYeW!a?M*V{Wn1>}pTOTKC0+ysS;QbvF60l3UU5rS@y5Z>@hbJXf!+Qs=O& F{{idN0%`yN literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/15.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/15.png new file mode 100644 index 0000000000000000000000000000000000000000..86b0d1cf1da19f9513972910e094de1f4dad5e9e GIT binary patch literal 1872 zcmYL}dpy+X7ssFZerL?ZjB%M^%FM`ZMD8@G8FGt>$Yoq3k}ZjqYbN1`BgBO`7>T{tOr;1=ah^_gpy^lo3;6G$t0dy?DXz>;y=5cvy2-5+xLZjz^mAd+|jjU_T$Er-RH) zP+q;g>j^e43S6&r%E?i`{~(~RPp#;zQ`HUT0Y0JNjPvtBdULa3TPNP1Pwjca5S7!M z+{x|j`mIgAYz`qY-6a2<`>lI4kx;X=fPKGIS`}*tWFX@_d12c9wEZ_O7$%*cYy_@^gWw zKU6KWtt@s-OJ?xw)iScs=L!{zidZQE#_2P}_*10Rbj8>N==(@oQleQ-w$kw^YWN{_ zfq)P%0NNT`1*a+AUK)|{xQL^;{kF0(vGVTDq{v8I_=#=D4x1c{hK_|WELp^`U@Hsrlu$}OBD+?Y-CI|)>1Ywpy?ao z)wNK&Ie1-dz|xS>)23*%aGF{e)h!q;Eh1Bm%v2%k?0}T1WI7$ILQ|kn2#WG@v@KXF z6-y>#>8ccU9RiUEt7#A@RJ;lWO(c*=vH*`K$jA_|GO!#OjYH!wG7uJ)K|}CXRh)tX zAdw(h908Aq01m(~2@PYgC=3Py7!(GeQ2?m~cmUyH2n9hf1Y{u;1_oF(Km!O3fE)@! zMi6mXWCIWaq!BWyIIx+(LI4GT%x2i^h1%q1(Iz|Dp@L1sd%Afc#W0Lqj3vm*66MJ9 zib_;vI-SATrmmsQ($Oh!Ca0%o=jP@Y{$5;M{Is&N^7+fx zRYYruq*Cen`t_hP69C{Wo`bFTsqwiNN0TUgTF)XLuZ1prl5@7suP2+aBhll@>xX`a z?R%LIbAHlTdEKnB-2;L&er5%J_wh*5cZmxlr>~an7JrUeI{sHh8CU1d?u+E)Jm_BQQJbKuqB^)I?}N{te6YSM^t0bh2v&P(wcs>L+#%Vf3Ez~{i+E+50G z>GNM1YxI+=*IbPJ1 z6Q7c{)?sp-oz6`hGJR;!a;TMmi(gthxYMof#sRQ59s|w2mrdf$-nnls)C(Un4;pP` zy8@x{Zt`Tvu`2gG;o43a=SQl8m$w$4c)84pw&?C|967Z*pJj1Rd^&9C`S>CB@hA64 z{YygE@Nd7^Y14u&d3nNw^~tHA67Wmq$-J zwnY_r-Bf;Mvo4tblu0gQekA+lHq~zLG1zwD^;BP_R}Gq5RK*$$Qx0Q0jAED1mhsL= zh9_c<k+t-p|bH-v|vX3PjB0yk=Z|z zti2DoG}$Hp5tsRWceTsDA4el29>)z$e`_byD7#0E9qlio?!DB?NpQ+f{bxjCp&9pT znzKd{J-BK16l)O1+R)S#{4#SnL~GxDTf6~AP> zaSZ$RTO{kvYL;gAM_Bi%d*dayp+&^8C!cNt-(Y-YR#S5{-DCJ;BsrZ z?@sC7CauweXI`Fv@+MT519ZJ;OZx{DRL2g!IN_bIscHJ=dW&Fu`Rc}GOiWL61w&$; z5?OhpAtAtm4p&TEwdA~>$eylEJ!oy&9{;BNuH2vR+f_@fJN`RI-C-?|z7?LI;D(N` zx^>PDm`y#KM&4sNC)LGuX1>zoZg<+oPd5{IKfArNQ78V>M5Z+uZhkX7M>mHiyO4~3 E0V*y3*#H0l literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/16.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/16.png new file mode 100644 index 0000000000000000000000000000000000000000..e90a6e292fd8419b7a23c36f4ae859c81c9260e1 GIT binary patch literal 1838 zcmV+}2hsS6P)Px%uTV@>MF0Q*|Nj60004mh0KdOL+uKQPZ2-*7Gjwzp$lFQC$P(`E5uc9$U{D~Y zrU1^)Ns@*n(cBEy)*mJu9CmFa&dy4doB-G77=U;n=8LGMv zx5pffkuQF3LzI{_uBa56o&deW2We#uvZzggfhviQ5RHlkjGh3cs1BN?Eqj3osi8|! zRRD2rBCD+wfPestjTS{b0B>{*pP~YchZ1jXI+&hKo0$o9do7EBGl-Qcd3_p|k}xVL z0F#v%pr8bei2#d!3WbXnkdOq2kvxlsLWP40c5EY0PXL;gQgCwsh=L)5fdqSoFL!+c zK|cU>fF*!?0CaK#c6cIEPb)`80D5~2ZgK*4cP4If6lrM(ac>M{VJ=Bf4}5+-c5^gu zZ~|dxM`UOYXl5i@Qvhmb7hYQ{U|}mVFA!K-0bNlPR81sNPyrH&T_iv@ z2ue)@ArTi#Q4$~)8c%<=>FVt5 z?(gvM@bU8V_xbwz`uqF){r>*`(Ills000ABNkl9!TUhuP!UfIiXbY82O1?LND?IpOLk_5nVp$TcTe}5 z_lKBJYt^zD!XH3?s`|HYzv_N)uo^N1_DWP=+3@esUP#Z5%yqm+_`A?KcL zBbnPtbf7P&sjk>BC`8OBk}T*&DuK3byHcsBdFkh^B=Lu0zgT&c`*F!<1u_gO<#Sg^ z5~^$NiSwFsxnGO@{LYA!JV=|Au|K2^te!{&EUNIVu`Unj! zXdkFt$LiS==4Qa~5hE&~=#Yveq;GGNxg3>>nCk0$dThk{p-|@N6^5Dhs1yc)GR;AikwG> z!9b^fv0aiBLPSwS)PE%N@)TyHRg)k_a?<^4vWO~lC8AWJkUoakzWJ+{rX?U&a>{cX zJNtLSnAqF%wx1dA4P=_qAm8^n8A38keRxFdduINHs%`bk7M3?mDLD5HC8Uur z;PTiWD(lw%8{jT0ECfUbqP17_@ c(=-714-@o(`8WS=*8l(j07*qoM6N<$g3U7UB>(^b literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/17.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/17.png new file mode 100644 index 0000000000000000000000000000000000000000..a82cbc7c4597a30f60381d70cd4563fc74248965 GIT binary patch literal 1839 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 aAom~G?}7OqPW}}D0000N literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/19.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/19.png new file mode 100644 index 0000000000000000000000000000000000000000..eb2855bd8c37370ce2da7f92db5f5e24da46eadd GIT binary patch literal 1838 zcmY*ZdpOkj8voAkH+N%XZFv1pZEQI-sipi_j%teZ!f+&QJ)9^P#2s$ zfvDI<6=ir>g#*G57!7!!MrD5!m5%=P9Fgc?ui)GF#-8z0^ zG&eBXp5Z1YoZ_O?$Hvs#yFo*PSMwtf9u8i;0%v_Ntxq`}-R3zN-YzbxBB3Y`q{s0N z>;tW>M;jaU8lF zTq@ripNy}sI)#WpWVq3HjWn4IWan!096&@g=|MG=lR=FLJ9@Xmv+N$>di>t(WZTRV z%eVynJB1ueb5K;GTUm+D%>vnp#I$Vf{CspqfkSqNYg#H%devAc1f?a&H3`T}VWlRc zRoPcoZa!F%6HRg@oWDBS_-FeFATdn~9E6 z$-#(gP+%}$e3^VXi2e0x5E`s=(bp;<(CUB<<=odOKOfo|PqvRYEEJ)|{$_l8+Ic@V z_b}ew6J}}ZobsVEwe`Ib3z3(;2qB72u{=CrAB5n1lH|q(?#J7va{ASx9@B@ys=NJ9fd zR0nD}Dv3nI;sFLtf?+g+j?<=6wKY*>5|*R}h&T)ZqltkCSQuac8H++gFbbdnfH5c( z2?Aso5WrvJ)Bq3!0j#P6fJ(l2)er9V1X>Mp@b?S9{y-xHWob(v;Z9!0Ak&ZSb>S%tSujX$s4tF)d%N$p5QQOgdiM_H|weU7G#h!kr|W^0tRs zTdmfKiF=HYe59H4VX8fhD>-(XTnUxUxo<;u-_U%TD|I;7tBSRUh|lU9p|4MGj6Ctl z$`j>wq42^%Qclg(9%|ZLY5bS2kFM`$5a%Ar%$>6%hKD9g%Ku59adi(s-8^EtKGeB1 zC7LsvO4z+r^Fos$`w6oM7tfq?jPLCw9k|(_NkpQ&d8Oiru%a|*kmvFFv!ml-?zT7b zaY!ru-uixW3in=+lg%^bvnTN8rSwnB%^Mzfy{amqKg+TRt6$;Pc^%PgdDVF5raclg zKa)-p-HLQNebL{>A$CKFTK(2wfN8xOflra}-6YKqJ=(%!0&ueZ2n5gmx%_RtSXSeI zb~umYx%0wT@iyw7%N$cm5&5CF2EBNuw<=jGX)0N)6leJblAI94CS`xzXFF%ut?Scd;?<1sr zwQ5687;tco#Hy!EGI@vu8<0Kc-z`dGto0M7u?IavnDXKp7Q5xQtqhay;E#;TxBqy2 zHIUa=oFWM|XXRF_z1$OzoNr%S0@CwU2FwNuXMS&K?K}8oVSM3{_l0G_ew+OhJ#9PF zgKC*n<4~i;@)DC&d-2MPB4N@~-^R}EQl3INIkR}L!gx32%y#O(#BW5OtsXb%yOTM) Y-~uCgV*~eKRP{K3fai6h$u%J5|H>Wh_W%F@ literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/8.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/8.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb5ce1c82d7dc445d2abd5958a649daba70eb12 GIT binary patch literal 1657 zcmV-<28Q{GP)Px%sZdN*MF0Q*|Nj7hfB>qhRhi5Hwzedak|b4C9GRIKv9Tv&PCIRF65-(qFjfxwJ zjS@sb6@-KumzoJ$S_y7w1A1~EeuNl)c@TnqAd!|BkB1+Eg%D+96dLBSP3vFu~ZfXo+VHHqN0%&LyaBd82Y8-QO6L4}1 zX=@#4XChcw0!&R2V`m6bP!={X320{ySy}>HT?t@h5MyErTU!=mWfE6h16f!TP*D;~ zPYO;>3P(l_JUJ6EEDJHaHJ6G7mU65iv0dH8vS5D*-+}3^q0j zD=ZBwECVPh6*)NzFD?`y9Thn_4lphb5)cYBGYlOY0x>ZYCnyUqEe<9m3Ktj(J39;} zCK4nf2`eiJBqj$R9|a~Q6eA)7CngCYAO#y61t1;=9v=rE9|RK-3LPB_85js08wwj7 z1r`+t9v%oB83`8`2oe+n5fKFp3<47q2n-AZ3kv`X3k44k2M!Jc2nPcQ2m=fa0|WyB z2nGrW2m%8G0|*EP1_lTQ1_TEN0RsaA3=9Sd2?GWN1O){G0|Np90R#X6000040RRC2 z00RL40000200031005-kA#DHv0M&F-PE!B@0s{pH2MG!d4Gs|z5)u;>6crX07Z(>9 z8XX-UAtEIuEG;iEF)=eWH8wmxKtMo4MMXzPN=r;lPESx!QB+h_RaRG6SY2LUUtnQk zVq#)sW^8V8adLHbcXxVwdwhL>fQ5#JhK7fTiHVSqk(8B{n3$cNpP`|lp`xOvr>Lu| ztE;WEw6wOjxVX5uxw*W&zQ4b~!olt+>FMk2?d|aJ^7Hfb_V@Yu`uqF*{r&#_{{H?t@srp900Ny!L_t(|+U?Z!Q&m9} z!105iVke5-ii+Lc-Q9`Zo!H%7*xd+rpol?;CpBWcXZTAVMS+tDViiSK zuK>2nK1Eg;-=91e0lwdQ#u{7kQj| zfuT+b4PWv;I*y21i*9L+txEw&&6PYY=XSq$hR2l5dauG^7vf+;3T*-bw z@xmtpgkelvY=}DnnS9fqyw9lj&hdn4>AHR70 z%9&f~gfHh$8Cwf{8IXfC7mAiI9?;+ung_w3{+aZnhj&%@G2$-pr$ZVh)CRAe0yly` z;VF10e^{n6t^|J?CW`g>%hn!T0RB|_Or!FbRo~)7@GUTGYdXy<0$$DH=;6Q;;6u=w zY;xy(XaZh)vNJ97ek0H{P17_@(=<)fG)>bq?cekp-40dzGmsn600000NkvXXu0mjf Db7X4> literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/9.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/11/9.png new file mode 100644 index 0000000000000000000000000000000000000000..384d354157c452746047cbbf78c87038b8121728 GIT binary patch literal 1657 zcmV-<28Q{GP)Px%sZdN*MF0Q*|Nj7hfB>qhRhi5Hwzedak|b4C9GRIKv9Tv&PCIRF65-(qFjfxwJ zjS@sb6@-KumzoJ$S_y7w1A1~EeuNl)c@TnqAd!|BkB1+Eg%D+96dLBSP3vFu~ZfXo+VHHqN0%&LyaBd82Y8-QO6L4}1 zX=@#4XChcw0!&R2V`m6bP!={X320{ySy}>HT?t@h5MyErTU!=mWfE6h16f!TP*D;~ zPYO;>3P(l_JUJ6EEDJHaHJ6G7mU65iv0dH8vS5D*-+}3^q0j zD=ZBwECVPh6*)NzFD?`y9Thn_4lphb5)cYBGYlOY0x>ZYCnyUqEe<9m3Ktj(J39;} zCK4nf2`eiJBqj$R9|a~Q6eA)7CngCYAO#y61t1;=9v=rE9|RK-3LPB_85js08wwj7 z1r`+t9v%oB83`8`2oe+n5fKFp3<47q2n-AZ3kv`X3k44k2M!Jc2nPcQ2m=fa0|WyB z2nGrW2m%8G0|*EP1_lTQ1_TEN0RsaA3=9Sd2?GWN1O){G0|Np90R#X6000040RRC2 z00RL40000200031005-kA#DHv0M&F-PE!B@0s{pH2MG!d4Gs|z5)u;>6crX07Z(>9 z8XX-UAtEIuEG;iEF)=eWH8wmxKtMo4MMXzPN=r;lPESx!QB+h_RaRG6SY2LUUtnQk zVq#)sW^8V8adLHbcXxVwdwhL>fQ5#JhK7fTiHVSqk(8B{n3$cNpP`|lp`xOvr>Lu| ztE;WEw6wOjxVX5uxw*W&zQ4b~!olt+>FMk2?d|aJ^7Hfb_V@Yu`uqF*{r&#_{{H?t@srp900Ny!L_t(|+U?Z!Q&m9} z!105iVke5-ii+Lc-Q9`Zo!H%7*xd+rpol?D*F^!Wqg0~;Mj;lplVMht1Q7R+#7;Hu?msxS!m2wzUA~3)2T-jIIr&ywvYTk6{rrvC0q@E|vPbC=4r)43k)a0?pM@zYm2lkqwJgmVsiS)c5-KZ_Z~xXG-XA1^fiDDYkgNZP&6cs6*EvcJK%Tbxc!U7{YSZqJIa36=fn zRUK&6#+xewc9<+NFrhv;DRKbSKDjA4DRCBwCFE)ePC{bq?O*U4Bl1=IARcnz00000NkvXXu0mjf DvvqW& literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/2.png b/win-module-system/win-module-system-biz/src/main/resources/images/jigsaw/slidingBlock/2.png new file mode 100644 index 0000000000000000000000000000000000000000..baf3f06d779cb60b6290f97ebe33ed0db93144e6 GIT binary patch literal 2297 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 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg1.png b/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg1.png new file mode 100644 index 0000000000000000000000000000000000000000..14e73454a62ca7166f659583f07a053dd3688a54 GIT binary patch literal 24041 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 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg10.png b/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg10.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea1d6d598debdd4759e7146f773d6484241fde8 GIT binary patch literal 27872 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%0AHv@HlJIq<7qCnjD(Vbp)iyGPE=iTtsuPYF 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 RK&k)$002ovPDHLkV1gWP7{dSn literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg3.png b/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg3.png new file mode 100644 index 0000000000000000000000000000000000000000..91679960f68d65005fc5bb3a55fdf53a82b2791d GIT binary patch literal 23407 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 Axc~qF literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg6.png b/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg6.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0f5d8c158b4efef5f4783dd62f92f7769b073c GIT binary patch literal 23607 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 YAALpOZ}kW-nE(I)07*qoM6N<$f>@}$Gynhq literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg8.png b/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg8.png new file mode 100644 index 0000000000000000000000000000000000000000..349681306a40ad6297c4e384b2d4158e0b308d0d GIT binary patch literal 27260 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 literal 0 HcmV?d00001 diff --git a/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg9.png b/win-module-system/win-module-system-biz/src/main/resources/images/pic-click/bg9.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7b4775298347a3420a53496bdcbb41b2b9292e GIT binary patch literal 29878 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 literal 0 HcmV?d00001 diff --git a/win-server/Dockerfile b/win-server/Dockerfile new file mode 100644 index 0000000..777efe8 --- /dev/null +++ b/win-server/Dockerfile @@ -0,0 +1,23 @@ +## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 +## 感谢复旦核博士的建议!灰子哥,牛皮! +FROM eclipse-temurin:21-jre + +## 创建目录,并使用它作为工作目录 +RUN mkdir -p /win-server +WORKDIR /win-server +## 将后端项目的 Jar 文件,复制到镜像中 +COPY ./target/win-server.jar app.jar + +## 设置 TZ 时区 +ENV TZ=Asia/Shanghai +## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 +ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom" + +## 应用参数 +ENV ARGS="" + +## 暴露后端项目的 48080 端口 +EXPOSE 48080 + +## 启动后端项目 +CMD java ${JAVA_OPTS} -jar app.jar $ARGS diff --git a/win-server/pom.xml b/win-server/pom.xml new file mode 100644 index 0000000..055e7f9 --- /dev/null +++ b/win-server/pom.xml @@ -0,0 +1,153 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-server + jar + + ${project.artifactId} + + 后端 Server 的主项目,通过引入需要 win-module-xxx 的依赖, + 从而实现提供 RESTful API 给 win-ui-admin、win-ui-user 等前端项目。 + 本质上来说,它就是个空壳(容器)! + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-module-system-biz + ${revision} + + + com.win + win-module-infra-biz + ${revision} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + com.win + win-spring-boot-starter-protection + + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + + + + + diff --git a/win-server/src/main/java/com/win/server/WinServerApplication.java b/win-server/src/main/java/com/win/server/WinServerApplication.java new file mode 100644 index 0000000..0ce393a --- /dev/null +++ b/win-server/src/main/java/com/win/server/WinServerApplication.java @@ -0,0 +1,34 @@ +package com.win.server; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 项目的启动类 + * + * 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + * 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + * 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + * + * @author 芋道源码 + */ +@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${win.info.base-package} +@SpringBootApplication(scanBasePackages = {"${win.info.base-package}.server", "${win.info.base-package}.module"}) +public class WinServerApplication { + + public static void main(String[] args) { + // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + + SpringApplication.run(WinServerApplication.class, args); +// new SpringApplicationBuilder(WinServerApplication.class) +// .applicationStartup(new BufferingApplicationStartup(20480)) +// .run(args); + + // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + // 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 + } + +} diff --git a/win-server/src/main/java/com/win/server/controller/DefaultController.java b/win-server/src/main/java/com/win/server/controller/DefaultController.java new file mode 100644 index 0000000..7532c6a --- /dev/null +++ b/win-server/src/main/java/com/win/server/controller/DefaultController.java @@ -0,0 +1,74 @@ +package com.win.server.controller; + +import com.win.framework.common.pojo.CommonResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; + +/** + * 默认 Controller,解决部分 module 未开启时的 404 提示。 + * 例如说,/bpm/** 路径,工作流 + * + * @author 芋道源码 + */ +@RestController +public class DefaultController { + + @RequestMapping("/admin-api/bpm/**") + public CommonResult bpm404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[工作流模块 win-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); + } + + @RequestMapping("/admin-api/mp/**") + public CommonResult mp404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[微信公众号 win-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]"); + } + + @RequestMapping(value = {"/admin-api/product/**", // 商品中心 + "/admin-api/trade/**", // 交易中心 + "/admin-api/promotion/**"}) // 营销中心 + public CommonResult mall404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[商城系统 win-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); + } + + @RequestMapping("/admin-api/erp/**") + public CommonResult erp404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[ERP 模块 win-module-erp - 已禁用][参考 https://doc.iocoder.cn/erp/build/ 开启]"); + } + + @RequestMapping("/admin-api/crm/**") + public CommonResult crm404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[CRM 模块 win-module-crm - 已禁用][参考 https://doc.iocoder.cn/crm/build/ 开启]"); + } + + @RequestMapping(value = {"/admin-api/report/**"}) + public CommonResult report404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[报表模块 win-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]"); + } + + @RequestMapping(value = {"/admin-api/pay/**"}) + public CommonResult pay404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[支付模块 win-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]"); + } + + @RequestMapping(value = {"/admin-api/ai/**"}) + public CommonResult ai404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[AI 大模型 win-module-ai - 已禁用][参考 https://doc.iocoder.cn/ai/build/ 开启]"); + } + + @RequestMapping(value = {"/admin-api/iot/**"}) + public CommonResult iot404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[IOT 物联网 win-module-iot - 已禁用][参考 https://doc.iocoder.cn/iot/build/ 开启]"); + } + +} diff --git a/win-server/src/main/resources/application-dev.yaml b/win-server/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..4ee42be --- /dev/null +++ b/win-server/src/main/resources/application-dev.yaml @@ -0,0 +1,215 @@ +server: + port: 48080 + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + stat-view-servlet: + enabled: true + allow: # 设置白名单,不填则允许所有访问 + url-pattern: /druid/* + login-username: # 控制台管理用户名和密码 + login-password: + filter: + stat: + enabled: true + log-slow-sql: true # 慢 SQL 记录 + slow-sql-millis: 100 + merge-sql: true + wall: + config: + multi-statement-allow: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 5 # 初始连接数 + min-idle: 10 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 + min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 + max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 + validation-query: SELECT 1 # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + primary: master + datasource: + master: + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + username: root + password: 123456 + slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 + lazy: true # 开启懒加载,保证启动速度 + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + username: root + password: 123456 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + data: + redis: + host: 400-infra.server.iocoder.cn # 地址 + port: 6379 # 端口 + database: 1 # 数据库索引 +# password: 123456 # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: true # 测试环境,需要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 消息队列相关 #################### + +# rocketmq 配置项,对应 RocketMQProperties 配置类 +rocketmq: + name-server: 127.0.0.1:9876 # RocketMQ Namesrv + +spring: + # RabbitMQ 配置项,对应 RabbitProperties 配置类 + rabbitmq: + host: 127.0.0.1 # RabbitMQ 服务的地址 + port: 5672 # RabbitMQ 服务的端口 + username: guest # RabbitMQ 服务的账号 + password: guest # RabbitMQ 服务的密码 + # Kafka 配置项,对应 KafkaProperties 配置类 + kafka: + bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoints: + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + +--- #################### 微信公众号相关配置 #################### +wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 + mp: + # 公众号配置(必填) + app-id: wx041349c6f39b268b + secret: 5abee519483bc9f8cb37ce280e814bd0 + # 存储配置,解决 AccessToken 的跨节点的共享 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wx # Redis Key 的前缀 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 + appid: wx63c280fe3248a3e7 + secret: 6f270509224a7ae1296bbf1c8cb97aed + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wa # Redis Key 的前缀 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +win: + pay: + order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址 + refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址 + demo: true # 开启演示模式 + tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc + +justauth: + enabled: true + type: + DINGTALK: # 钉钉 + client-id: dingvrnreaje3yqvzhxg + client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI + ignore-check-redirect-uri: true + WECHAT_ENTERPRISE: # 企业微信 + client-id: wwd411c69a39ad2e54 + client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw + agent-id: 1000004 + ignore-check-redirect-uri: true + # noinspection SpringBootApplicationYaml + WECHAT_MINI_APP: # 微信小程序 + client-id: ${wx.miniapp.appid} + client-secret: ${wx.miniapp.secret} + ignore-check-redirect-uri: true + ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 + WECHAT_MP: # 微信公众号 + client-id: ${wx.mp.app-id} + client-secret: ${wx.mp.secret} + ignore-check-redirect-uri: true + cache: + type: REDIS + prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: + timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 + + +--- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### +iot: + emq: + # 账号 + username: anhaohao + # 密码 + password: ahh@123456 + # 主机地址 + hostUrl: tcp://chaojiniu.top:1883 + # 客户端Id,不能相同,采用随机数 ${random.value} + client-id: ${random.int} + # 默认主题 + default-topic: test + # 保持连接 + keepalive: 60 + # 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息) + clearSession: true \ No newline at end of file diff --git a/win-server/src/main/resources/application-local.yaml b/win-server/src/main/resources/application-local.yaml new file mode 100644 index 0000000..51439af --- /dev/null +++ b/win-server/src/main/resources/application-local.yaml @@ -0,0 +1,274 @@ +server: + port: 48080 + +--- #################### 数据库相关配置 #################### +spring: + # 数据源配置项 + autoconfigure: + exclude: + - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 + - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置 + - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置 + - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + stat-view-servlet: + enabled: true + allow: # 设置白名单,不填则允许所有访问 + url-pattern: /druid/* + login-username: # 控制台管理用户名和密码 + login-password: + filter: + stat: + enabled: true + log-slow-sql: true # 慢 SQL 记录 + slow-sql-millis: 100 + merge-sql: true + wall: + config: + multi-statement-allow: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 1 # 初始连接数 + min-idle: 1 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 + min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 + max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 + validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + primary: master + datasource: + master: + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例 + # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例 + # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 + # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 连接的示例 + # url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例 + # url: jdbc:kingbase8://127.0.0.1:54321/test # 人大金仓 KingbaseES 连接的示例 + # url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss 连接的示例 + username: root + password: 123456 + # username: sa # SQL Server 连接的示例 + # password: Win@2024 # SQL Server 连接的示例 + # username: SYSDBA # DM 连接的示例 + # password: SYSDBA001 # DM 连接的示例 + # username: root # OpenGauss 连接的示例 + # password: Win@2024 # OpenGauss 连接的示例 + slave: # 模拟从库,可根据自己需要修改 + lazy: true # 开启懒加载,保证启动速度 + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true + username: root + password: 123456 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + data: + redis: + host: 127.0.0.1 # 地址 + port: 6379 # 端口 + database: 0 # 数据库索引 +# password: dev # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: true # 本地开发环境,尽量不要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 消息队列相关 #################### + +# rocketmq 配置项,对应 RocketMQProperties 配置类 +rocketmq: + name-server: 127.0.0.1:9876 # RocketMQ Namesrv + +spring: + # RabbitMQ 配置项,对应 RabbitProperties 配置类 + rabbitmq: + host: 127.0.0.1 # RabbitMQ 服务的地址 + port: 5672 # RabbitMQ 服务的端口 + username: rabbit # RabbitMQ 服务的账号 + password: rabbit # RabbitMQ 服务的密码 + # Kafka 配置项,对应 KafkaProperties 配置类 + kafka: + bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoints: + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + level: + # 配置自己写的 MyBatis Mapper 打印日志 + com.win.module.bpm.dal.mysql: debug + com.win.module.infra.dal.mysql: debug + com.win.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # 配置 ApiErrorLogMapper 的日志级别为 info,避免和 GlobalExceptionHandler 重复打印 + com.win.module.infra.dal.mysql.job.JobLogMapper: INFO # 配置 JobLogMapper 的日志级别为 info + com.win.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info + com.win.module.pay.dal.mysql: debug + com.win.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # 配置 PayNotifyTaskMapper 的日志级别为 info + com.win.module.system.dal.mysql: debug + com.win.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info + com.win.module.tool.dal.mysql: debug + com.win.module.member.dal.mysql: debug + com.win.module.trade.dal.mysql: debug + com.win.module.promotion.dal.mysql: debug + com.win.module.statistics.dal.mysql: debug + com.win.module.crm.dal.mysql: debug + com.win.module.erp.dal.mysql: debug + com.win.module.iot.dal.mysql: debug + com.win.module.ai.dal.mysql: debug + org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示 + +debug: false + +--- #################### 微信公众号、小程序相关配置 #################### +wx: + mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 +# app-id: wx041349c6f39b268b # 测试号(牛希尧提供的) +# secret: 5abee519483bc9f8cb37ce280e814bd0 + app-id: wx5b23ba7a5589ecbb # 测试号(自己的) + secret: 2a7b3b20c537e52e74afd395eb85f61f +# app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的) +# secret: bd4f9fab889591b62aeac0d7b8d8b4a0 + # 存储配置,解决 AccessToken 的跨节点的共享 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wx # Redis Key 的前缀 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 + # appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的) + # secret: 333ae72f41552af1e998fe1f54e1584a +# appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 +# secret: 6f270509224a7ae1296bbf1c8cb97aed +# appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) +# secret: 4a1a04e07f6a4a0751b39c3064a92c8b + appid: wx66186af0759f47c9 # 测试号(puhui 提供的) + secret: 3218bcbd112cbc614c7264ceb20144ac + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wa # Redis Key 的前缀 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +win: + captcha: + enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试; + security: + mock-enable: true + pay: + order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址 + refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址 + access-log: # 访问日志的配置项 + enable: false + demo: false # 关闭演示模式 + wxa-code: + env-version: develop # 小程序版本: 正式版为 "release";体验版为 "trial";开发版为 "develop" + wxa-subscribe-message: + miniprogram-state: developer # 跳转小程序类型:开发版为 “developer”;体验版为 “trial”为;正式版为 “formal” + tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc + +justauth: + enabled: true + type: + DINGTALK: # 钉钉 + client-id: dingvrnreaje3yqvzhxg + client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI + ignore-check-redirect-uri: true + WECHAT_ENTERPRISE: # 企业微信 + client-id: wwd411c69a39ad2e54 + client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw + agent-id: 1000004 + ignore-check-redirect-uri: true + # noinspection SpringBootApplicationYaml + WECHAT_MINI_APP: # 微信小程序 + client-id: ${wx.miniapp.appid} + client-secret: ${wx.miniapp.secret} + ignore-check-redirect-uri: true + ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验 + WECHAT_MP: # 微信公众号 + client-id: ${wx.mp.app-id} + client-secret: ${wx.mp.secret} + ignore-check-redirect-uri: true + cache: + type: REDIS + prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: + timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 + +--- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### +iot: + emq: + # 账号 + username: anhaohao + # 密码 + password: ahh@123456 + # 主机地址 + hostUrl: tcp://chaojiniu.top:1883 + # 客户端Id,不能相同,采用随机数 ${random.value} + client-id: ${random.int} + # 默认主题 + default-topic: test + # 保持连接 + keepalive: 60 + # 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息) + clearSession: true \ No newline at end of file diff --git a/win-server/src/main/resources/application.yaml b/win-server/src/main/resources/application.yaml new file mode 100644 index 0000000..d1569ab --- /dev/null +++ b/win-server/src/main/resources/application.yaml @@ -0,0 +1,332 @@ +spring: + application: + name: win-server + + profiles: + active: local + + main: + allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 + + # Servlet 配置 + servlet: + # 文件上传相关配置项 + multipart: + max-file-size: 16MB # 单个文件大小 + max-request-size: 32MB # 设置总上传的文件大小 + + # Jackson 配置项 + jackson: + serialization: + write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean + + # Cache 配置项 + cache: + type: REDIS + redis: + time-to-live: 1h # 设置过期时间为 1 小时 + +server: + servlet: + encoding: + enabled: true + charset: UTF-8 # 必须设置 UTF-8,避免 WebFlux 流式返回(AI 场景)会乱码问题 + force: true + +--- #################### 接口文档配置 #################### + +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui + default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 + +knife4j: + enable: true + setting: + language: zh_cn + +# 工作流 Flowable 配置 +flowable: + # 1. false: 默认值,Flowable 启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常 + # 2. true: 启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表 + # 3. create_drop: 启动时自动创建表,关闭时自动删除表 + # 4. drop_create: 启动时,删除旧表,再创建新表 + database-schema-update: true # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化 + db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置 + check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程 + history-level: audit # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数 + +# MyBatis Plus 的配置项 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + global-config: + db-config: + id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 +# id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 +# id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 +# id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + banner: false # 关闭控制台的 Banner 打印 + type-aliases-package: ${win.info.base-package}.module.*.dal.dataobject + encryptor: + password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 + +mybatis-plus-join: + banner: false # 是否打印 mybatis plus join banner,默认true + sub-table-logic: true # 全局启用副表逻辑删除,默认true。关闭后关联查询不会加副表逻辑删除 + ms-cache: true # 拦截器MappedStatement缓存,默认 true + table-alias: t # 表别名(默认 t) + logic-del-type: on # 副表逻辑删除条件的位置,支持 WHERE、ON,默认 ON + +# Spring Data Redis 配置 +spring: + data: + redis: + repositories: + enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 + +# VO 转换(数据翻译)相关 +easy-trans: + is-enable-global: true # 启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口 + +--- #################### 验证码相关配置 #################### + +aj: + captcha: + jigsaw: classpath:images/jigsaw # 滑动验证,底图路径,不配置将使用默认图片;以 classpath: 开头,取 resource 目录下路径 + pic-click: classpath:images/pic-click # 滑动验证,底图路径,不配置将使用默认图片;以 classpath: 开头,取 resource 目录下路径 + cache-type: redis # 缓存 local/redis... + cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 + timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 + type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 + water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode + interference-options: 0 # 滑动干扰项(0/1/2) + req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false + req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定 + req-get-lock-seconds: 10 # 验证失败后,锁定时间间隔 + req-get-minute-limit: 30 # get 接口一分钟内请求数限制 + req-check-minute-limit: 60 # check 接口一分钟内请求数限制 + req-verify-minute-limit: 60 # verify 接口一分钟内请求数限制 + +--- #################### 消息队列相关 #################### + +# rocketmq 配置项,对应 RocketMQProperties 配置类 +rocketmq: + # Producer 配置项 + producer: + group: ${spring.application.name}_PRODUCER # 生产者分组 + +spring: + # Kafka 配置项,对应 KafkaProperties 配置类 + kafka: + # Kafka Producer 配置项 + producer: + acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 + retries: 3 # 发送失败时,重试发送的次数 + value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 + # Kafka Consumer 配置项 + consumer: + auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 + value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer + properties: + spring.json.trusted.packages: '*' + # Kafka Consumer Listener 监听器配置 + listener: + missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 + +--- #################### AI 相关配置 #################### + +spring: + ai: + vectorstore: # 向量存储 + redis: + index: default-index + prefix: "default:" + embedding: + transformer: + onnx: + model-uri: https://raw.gitcode.com/wincode/win-demo/raw/master/win-static/ai/model.onnx + tokenizer: + uri: https://raw.gitcode.com/wincode/win-demo/raw/master/win-static/ai/tokenizer.json + qianfan: # 文心一言 + api-key: x0cuLZ7XsaTCU08vuJWO87Lg + secret-key: R9mYF9dl9KASgi5RUq0FQt3wRisSnOcK + zhipuai: # 智谱 AI + api-key: 32f84543e54eee31f8d56b2bd6020573.3vh9idLJZ2ZhxDEs + openai: # OpenAI 官方 + api-key: sk-yzKea6d8e8212c3bdd99f9f44ced1cae37c097e5aa3BTS7z + base-url: https://api.gptsapi.net + azure: # OpenAI 微软 + openai: + endpoint: https://eastusprejade.openai.azure.com + api-key: xxx + ollama: + base-url: http://127.0.0.1:11434 + chat: + model: llama3 + stabilityai: + api-key: sk-e53UqbboF8QJCscYvzJscJxJXoFcFg4iJjl1oqgE7baJETmx + cloud: + ai: + tongyi: # 通义千问 + tongyi: + api-key: sk-Zsd81gZYg7 + +win: + ai: + deep-seek: # DeepSeek + enable: true + api-key: sk-e94db327cc7d457d99a8de8810fc6b12 + model: deepseek-chat + xinghuo: # 讯飞星火 + enable: true + appId: 13c8cca6 + appKey: cb6415c19d6162cda07b47316fcb0416 + secretKey: Y2JiYTIxZjA3MDMxMjNjZjQzYzVmNzdh + model: generalv3.5 + midjourney: + enable: true + # base-url: https://api.holdai.top/mj-relax/mj + base-url: https://api.holdai.top/mj + api-key: sk-dZEPiVaNcT3FHhef51996bAa0bC74806BeAb620dA5Da10Bf + notify-url: http://java.nat300.top/admin-api/ai/image/midjourney/notify + suno: + enable: true + # base-url: https://suno-55ishh05u-status2xxs-projects.vercel.app + base-url: http://127.0.0.1:3001 + +--- #################### 芋道相关配置 #################### + +win: + info: + version: 1.0.0 + base-package: com.win + web: + admin-ui: + url: http://dashboard.win.iocoder.cn # Admin 管理后台 UI 的地址 + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + security: + permit-all_urls: + - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录 + websocket: + enable: true # websocket的开关 + path: /infra/ws # 路径 + sender-type: local # 消息发送的类型,可选值为 local、redis、rocketmq、kafka、rabbitmq + sender-rocketmq: + topic: ${spring.application.name}-websocket # 消息发送的 RocketMQ Topic + consumer-group: ${spring.application.name}-websocket-consumer # 消息发送的 RocketMQ Consumer Group + sender-rabbitmq: + exchange: ${spring.application.name}-websocket-exchange # 消息发送的 RabbitMQ Exchange + queue: ${spring.application.name}-websocket-queue # 消息发送的 RabbitMQ Queue + sender-kafka: + topic: ${spring.application.name}-websocket # 消息发送的 Kafka Topic + consumer-group: ${spring.application.name}-websocket-consumer # 消息发送的 Kafka Consumer Group + swagger: + title: 芋道快速开发平台 + description: 提供管理后台、用户 App 的所有功能 + version: ${win.info.version} + url: ${win.web.admin-ui.url} + email: xingyu4j@vip.qq.com + license: MIT + license-url: https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE + codegen: + base-package: ${win.info.base-package} + db-schemas: ${spring.datasource.dynamic.datasource.master.name} + front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 + unit-test-enable: false # 是否生成单元测试 + tenant: # 多租户相关配置项 + enable: true + ignore-urls: + - /admin-api/system/tenant/get-id-by-name # 基于名字获取租户,不许带租户编号 + - /admin-api/system/tenant/get-by-website # 基于域名获取租户,不许带租户编号 + - /admin-api/system/captcha/get # 获取图片验证码,和租户无关 + - /admin-api/system/captcha/check # 校验图片验证码,和租户无关 + - /admin-api/infra/file/*/get/** # 获取图片,和租户无关 + - /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号 + - /admin-api/pay/notify/** # 支付回调通知,不携带租户编号 + - /jmreport/* # 积木报表,无法携带租户编号 + - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号 + ignore-tables: + - system_tenant + - system_tenant_package + - system_dict_data + - system_dict_type + - system_error_code + - system_menu + - system_sms_channel + - system_sms_template + - system_sms_log + - system_sensitive_word + - system_oauth2_client + - system_mail_account + - system_mail_template + - system_mail_log + - system_notify_template + - infra_codegen_column + - infra_codegen_table + - infra_config + - infra_file_config + - infra_file + - infra_file_content + - infra_job + - infra_job_log + - infra_job_log + - infra_data_source_config + - jimu_dict + - jimu_dict_item + - jimu_report + - jimu_report_data_source + - jimu_report_db + - jimu_report_db_field + - jimu_report_db_param + - jimu_report_link + - jimu_report_map + - jimu_report_share + - rep_demo_dxtj + - rep_demo_employee + - rep_demo_gongsi + - rep_demo_jianpiao + - tmp_report_data_1 + - tmp_report_data_income + ignore-caches: + - user_role_ids + - permission_menu_ids + - oauth_client + - notify_template + - mail_account + - mail_template + - sms_template + sms-code: # 短信验证码相关的配置项 + expire-times: 10m + send-frequency: 1m + send-maximum-quantity-per-day: 10 + begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 + end-code: 9999 # 这里配置 9999 的原因是,测试方便。 + trade: + order: + pay-expire-time: 2h # 支付的过期时间 + receive-expire-time: 14d # 收货的过期时间 + comment-expire-time: 7d # 评论的过期时间 + express: + client: kd_niao + kd-niao: + api-key: cb022f1e-48f1-4c4a-a723-9001ac9676b8 + business-id: 1809751 + kd100: + key: pLXUGAwK5305 + customer: E77DF18BE109F454A5CD319E44BF5177 + +debug: false \ No newline at end of file diff --git a/win-server/src/main/resources/logback-spring.xml b/win-server/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..ce034da --- /dev/null +++ b/win-server/src/main/resources/logback-spring.xml @@ -0,0 +1,76 @@ + + + + + + + + + +       + + + ${PATTERN_DEFAULT} + + + + + + + + + + ${PATTERN_DEFAULT} + + + + ${LOG_FILE} + + + ${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz} + + ${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false} + + ${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB} + + ${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0} + + ${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30} + + + + + + 0 + + 256 + + + + + + + + ${PATTERN_DEFAULT} + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-server/src/test/java/com/win/ProjectReactor.java b/win-server/src/test/java/com/win/ProjectReactor.java new file mode 100644 index 0000000..90e0a9b --- /dev/null +++ b/win-server/src/test/java/com/win/ProjectReactor.java @@ -0,0 +1,148 @@ +package com.win; + +import cn.hutool.core.io.FileTypeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.collection.SetUtils; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.stream.Collectors; + +import static java.io.File.separator; + +/** + * 项目修改器,一键替换 Maven 的 groupId、artifactId,项目的 package 等 + *

+ * 通过修改 groupIdNew、artifactIdNew、projectBaseDirNew 三个变量 + * + * @author 闻荫源码 + */ +@Slf4j +public class ProjectReactor { + + private static final String GROUP_ID = "com.win"; + private static final String ARTIFACT_ID = "win"; + private static final String PACKAGE_NAME = "com.win"; + private static final String TITLE = "闻荫管理系统"; + + /** + * 白名单文件,不进行重写,避免出问题 + */ + private static final Set WHITE_FILE_TYPES = SetUtils.asSet("gif", "jpg", "svg", "png", // 图片 + "eot", "woff2", "ttf", "woff"); // 字体 + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + String projectBaseDir = getProjectBaseDir(); + log.info("[main][原项目路劲改地址 ({})]", projectBaseDir); + + // ========== 配置,需要你手动修改 ========== + String groupIdNew = "com.win"; + String artifactIdNew = "win"; + String packageNameNew = "com.win"; + String titleNew = "闻荫管理系统"; + //String projectBaseDirNew = projectBaseDir + "-new"; // 一键改名后,“新”项目所在的目录 + String projectBaseDirNew = "D:\\workspace\\idea\\win-boot-mini-master"; // 一键改名后,“新”项目所在的目录 + log.info("[main][检测新项目目录 ({})是否存在]", projectBaseDirNew); + if (FileUtil.exist(projectBaseDirNew)) { + log.error("[main][新项目目录检测 ({})已存在,请更改新的目录!程序退出]", projectBaseDirNew); + return; + } + // 如果新目录中存在 PACKAGE_NAME,ARTIFACT_ID 等关键字,路径会被替换,导致生成的文件不在预期目录 + if (StrUtil.containsAny(projectBaseDirNew, PACKAGE_NAME, ARTIFACT_ID, StrUtil.upperFirst(ARTIFACT_ID))) { + log.error("[main][新项目目录 `projectBaseDirNew` 检测 ({}) 存在冲突名称「{}」或者「{}」,请更改新的目录!程序退出]", + projectBaseDirNew, PACKAGE_NAME, ARTIFACT_ID); + return; + } + log.info("[main][完成新项目目录检测,新项目路径地址 ({})]", projectBaseDirNew); + // 获得需要复制的文件 + log.info("[main][开始获得需要重写的文件,预计需要 10-20 秒]"); + Collection files = listFiles(projectBaseDir); + log.info("[main][需要重写的文件数量:{},预计需要 15-30 秒]", files.size()); + // 写入文件 + files.forEach(file -> { + // 如果是白名单的文件类型,不进行重写,直接拷贝 + String fileType = getFileType(file); + if (WHITE_FILE_TYPES.contains(fileType)) { + copyFile(file, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + return; + } + // 如果非白名单的文件类型,重写内容,在生成文件 + String content = replaceFileContent(file, groupIdNew, artifactIdNew, packageNameNew, titleNew); + writeFile(file, content, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + }); + log.info("[main][重写完成]共耗时:{} 秒", (System.currentTimeMillis() - start) / 1000); + } + + private static String getProjectBaseDir() { + String baseDir = System.getProperty("user.dir"); + if (StrUtil.isEmpty(baseDir)) { + throw new NullPointerException("项目基础路径不存在"); + } + return baseDir; + } + + private static Collection listFiles(String projectBaseDir) { + Collection files = FileUtil.loopFiles(projectBaseDir); + // 移除 IDEA、Git 自身的文件、Node 编译出来的文件 + files = files.stream() + .filter(file -> !file.getPath().contains(separator + "target" + separator) + && !file.getPath().contains(separator + "node_modules" + separator) + && !file.getPath().contains(separator + ".idea" + separator) + && !file.getPath().contains(separator + ".git" + separator) + && !file.getPath().contains(separator + "dist" + separator) + && !file.getPath().contains(".iml") + && !file.getPath().contains(".html.gz")) + .collect(Collectors.toList()); + return files; + } + + private static String replaceFileContent(File file, String groupIdNew, + String artifactIdNew, String packageNameNew, + String titleNew) { + String content = FileUtil.readString(file, StandardCharsets.UTF_8); + // 如果是白名单的文件类型,不进行重写 + String fileType = getFileType(file); + if (WHITE_FILE_TYPES.contains(fileType)) { + return content; + } + // 执行文件内容都重写 + return content.replaceAll(GROUP_ID, groupIdNew) + .replaceAll(PACKAGE_NAME, packageNameNew) + .replaceAll(ARTIFACT_ID, artifactIdNew) // 必须放在最后替换,因为 ARTIFACT_ID 太短! + .replaceAll(StrUtil.upperFirst(ARTIFACT_ID), StrUtil.upperFirst(artifactIdNew)) + .replaceAll(TITLE, titleNew); + } + + private static void writeFile(File file, String fileContent, String projectBaseDir, + String projectBaseDirNew, String packageNameNew, String artifactIdNew) { + String newPath = buildNewFilePath(file, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + FileUtil.writeUtf8String(fileContent, newPath); + } + + private static void copyFile(File file, String projectBaseDir, + String projectBaseDirNew, String packageNameNew, String artifactIdNew) { + String newPath = buildNewFilePath(file, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + FileUtil.copyFile(file, new File(newPath)); + } + + private static String buildNewFilePath(File file, String projectBaseDir, + String projectBaseDirNew, String packageNameNew, String artifactIdNew) { + return file.getPath().replace(projectBaseDir, projectBaseDirNew) // 新目录 + .replace(PACKAGE_NAME.replaceAll("\\.", Matcher.quoteReplacement(separator)), + packageNameNew.replaceAll("\\.", Matcher.quoteReplacement(separator))) + .replace(ARTIFACT_ID, artifactIdNew) // + .replaceAll(StrUtil.upperFirst(ARTIFACT_ID), StrUtil.upperFirst(artifactIdNew)); + } + + private static String getFileType(File file) { + return file.length() > 0 ? FileTypeUtil.getType(file) : ""; + } + +} +